【发布时间】:2024-01-04 01:45:01
【问题描述】:
嗯,标题是不言自明的。
总之,如果构建成功,我希望将一个分支(即 dev)合并到另一个分支(即生产)。
【问题讨论】:
-
问题附加的链接失效了
标签: git merge gitlab gitlab-ci-runner
嗯,标题是不言自明的。
总之,如果构建成功,我希望将一个分支(即 dev)合并到另一个分支(即生产)。
【问题讨论】:
标签: git merge gitlab gitlab-ci-runner
我尝试了@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
【讨论】:
<(...) 是一个 bash 功能,不能在 alpine 中工作,因为它有一个 sh shell。请改用echo "$GITLAB_DEPLOY_KEY" | ssh-add -
ssh-keyscan on-the-fly 是一个好的安全实践,它与告诉 ssh 跳过验证主机的公钥一样。如果您在本地机器上运行命令并将结果保存到变量中会更好,正如 Jakub 在他的回答中提到的那样。
最简单的解决方案是发出合并请求并单击“管道成功时合并”按钮,这将在构建后合并分支。这是我推荐的。
以下是我不推荐用于自动合并的有效解决方案。它要求您创建具有写入权限的部署密钥并将私钥保存为项目变量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
【讨论】:
从 GitLab 8.15 版开始,没有简单的方法可以做到这一点。这样做的唯一方法是利用 API 和 webhook。
这是你必须做的基本要点:
1.Create a webhook 挂钩推送事件。
2.检查push是否属于你要合并的分支。
3.Create a merge 请求并立即使用accept it 选项"merge_when_build_succeeds": true。
如果构建成功,它将合并分支。设置起来并不是最舒服的事情,但它应该可以工作。
【讨论】: