【问题标题】:How can I make Gitlab runner merge code into a branch on a successful build如何让 Gitlab 运行器在成功构建时将代码合并到分支中
【发布时间】:2024-01-04 01:45:01
【问题描述】:

嗯,标题是不言自明的。

总之,如果构建成功,我希望将一个分支(即 dev)合并到另一个分支(即生产)。

【问题讨论】:

  • 问题附加的链接失效了

标签: git merge gitlab gitlab-ci-runner


【解决方案1】:

我尝试了@jakub-kania 解决方案,但我总是得到id_rsa invalid format。我认为 gitlab 秘密变量以某种方式被搞砸了。

我通过直接将部署密钥传递到 ssh-add 而不创建 ssh 密钥来使其工作。这是可行的解决方案:

merge to master:
  stage: deploy
  image: alpine
  only:
    - dev-branch
  before_script:
    - apk add --update git openssh-client
    - mkdir ~/.ssh
    - ssh-keyscan -p 2222 <gitlab.domain.com> > ~/.ssh/known_hosts
    - eval `ssh-agent -s`
    - ssh-add <(echo "$GITLAB_DEPLOY_KEY")
    - ssh -T git@<gitlab.domain.com> -p 2222
    - git config --global user.email "$GITLAB_USER_EMAIL"
    - git config --global user.name "$GITLAB_USER_ID"
    - git remote set-url origin ssh://git@<gitlab.domain.com>:2222/path/to/repo.git
  script:    
    - git checkout master
    - git reset --hard origin/master
    - git merge $CI_BUILD_REF
    - git push origin master

【讨论】:

  • 看起来不错,但我无法确认,因为我已经删除了我的 gitlab 服务器并切换到了 bitbucket:/
  • 我的格式无效。实际上通过 echo 输出该私钥在 ----- BEGIN RSA KEY ----- 之后错过了新行
  • 值得一提的是,$CI_BUILD_REF 已被贬值,您应该改用 $CI_COMMIT_REF_NAME。
  • 另外,&lt;(...) 是一个 bash 功能,不能在 alpine 中工作,因为它有一个 sh shell。请改用echo "$GITLAB_DEPLOY_KEY" | ssh-add -
  • 我不认为ssh-keyscan on-the-fly 是一个好的安全实践,它与告诉 ssh 跳过验证主机的公钥一样。如果您在本地机器上运行命令并将结果保存到变量中会更好,正如 Jakub 在他的回答中提到的那样。
【解决方案2】:

最简单的解决方案是发出合并请求并单击“管道成功时合并”按钮,这将在构建后合并分支。这是我推荐的。

以下是我不推荐用于自动合并的有效解决方案。它要求您创建具有写入权限的部署密钥并将私钥保存为项目变量GITLAB_DEPLOY KEY,同时在服务器上执行ssh-keyscan 并将其保存到GITLAB_PUBLIC_KEY 变量中。

mergetomaster:
  stage: deploy
  image: alpine
  only:
   - dev
  script:
   - apk add --update git openssh-client
   - mkdir ~/.ssh
   - echo $GITLAB_DEPLOY_KEY > ~/.ssh/id_rsa
   - chmod 400 ~/.ssh/id_rsa
   - echo $GITLAB_PUBLIC_KEY > ~/.ssh/known_hosts
   // Steal the identity of person that triggered the build
   - git config --global user.email "$GITLAB_USER_EMAIL"
   - git config --global user.name "$GITLAB_USER_ID"
   - git remote set-url origin <ssh-repository-url>
   - git checkout master
   - git reset --hard origin/master
   - git merge $CI_BUILD_REF
   - git push origin master

【讨论】:

  • 我有一个类似的部署设​​置,它使用了一个自定义的 alpine 映像,其中的密钥已经“烧录”了。您的解决方案似乎更优雅,我想采用它,但我需要您澄清一些观点。您能否详细解释所有这些变量(GITLAB_DEPLOY_KEY、GITLAB_PUBLIC_KEY、私钥),在哪里生成它们并请使用虚拟示例(id_rsa_gitlab_server.pub、id_rsa_my_key.pub、“部署密钥”或“变量”)?我猜 GITLAB_USER_EMAIL、GITLAB_USER_ID 和 CI_BUILD_REF 是自动生成的。以前从未使用过项目的 var 和部署密钥,这很令人困惑
  • @StLia 我猜你不需要改变/创建那些你想要的变量。这些变量总是存在于跑步者中。因此,您只需要创建一个部署密钥并继续使用它。
【解决方案3】:

从 GitLab 8.15 版开始,没有简单的方法可以做到这一点。这样做的唯一方法是利用 API 和 webhook。

这是你必须做的基本要点:

1.Create a webhook 挂钩推送事件。

2.检查push是否属于你要合并的分支。

3.Create a merge 请求并立即使用accept it 选项"merge_when_build_succeeds": true

如果构建成功,它将合并分支。设置起来并不是最舒服的事情,但它应该可以工作。

【讨论】:

  • 实际上现在有可用于此的具有写访问权限的部署密钥。在早期版本中,可以通过为此目的创建用户帐户来实现..
最近更新 更多