有没有办法在gitlab中自动合并分支?

Jin*_*ark 18 git gitlab gitlab-ci

在我的 gitlab 项目中有 3 个主要分支:develop、stage 和 master。

每次将更新的代码推送到开发分支时,我都必须将其合并到阶段分支,然后再次手动将其合并到主分支。

这看起来效率不高。

有没有办法在不冲突的情况下自动合并分支?

此外,可以使用名为“gitlab-ci.yml”的文件进行自动合并,例如

# merge develop branch to stage branch
merge-to-stage:
    only:
    - develop
    script:
    - merge (develop) to (stage) << something like this

# merge stage branch to master branch when the job above is completed
stage-to-master:
    only:
    - stage
    script:
    - merge (stage) to (master) << something like this

Run Code Online (Sandbox Code Playgroud)

请给我您的好意建议。

pix*_*ets 21

GitLab 中无法自动执行此操作。但您可以使用 GitLab CI 自动化此操作。

请注意,GitLab CI Runner 独立于 GitLab,仅获取 Git 存储库的本地副本。所以你的 CI 脚本将无法开箱git merge即用地运行。git push

您需要做的是设置从 GitLab CI Runner 到您的 GitLab 实例的 SSH 连接。before为此使用脚本。StackOverflow上有几个答案,GitLab 上有一篇很好的博客文章如何实现这一目标。

merge-job:
  before_script:
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - ssh-add <(echo "$GIT_SSH_PRIV_KEY")
    - mkdir -p ~/.ssh
    - cat gitlab-known-hosts >> ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

然后运行 ​​Git 命令,例如git merge. 然后推。

merge-to-stage:
  only:
    - develop
  script:
    # If this is the last job you can stay here, otherwise better clone the repo into a working directory
    # git clone <URL> <working-directory> && cd <working directory>
    - git checkout stage
    - git merge develop
    - git push origin stage
Run Code Online (Sandbox Code Playgroud)

您的下一个管道作业的架构取决于您对when there is no conflict. 在示例代码中,您将所有阶段分支合并到更高的分支(要开发的功能、开发到阶段、阶段到主分支)。如果是这样,那么您应该确保每个阶段都有一个合并作业,并且这些合并作业放置在管道的末尾。如果之前存在 CI 错误或合并冲突,则合并不会发生。

或者,您也可以只从事一项工作,该工作使用 GitLabs推送选项。使用这些选项,您可以为功能分支创建合并请求,当 CI 管道成功时,这些请求会自动合并并关闭。此策略只会合并您的功能分支更改,而不是整个阶段分支。

merge-to-stage-branches:
  only:
    - <feature branch names that are no WIP anymore>
  script:
    # <scripts to merge feature into develop>
    git push -o merge_request.create -o merge_request.target=develop -o merge_request.merge_when_pipeline_succeeds
    # <repeat merge for each stage branch>
    # <repeat push for each stage branch> 
Run Code Online (Sandbox Code Playgroud)

  • 多么精彩的重播啊。谢谢你,我会直接去我的gitlab尝试你的解决方案 (2认同)