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

时间:2021-05-13 09:17:29

标签: 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

请给我你的好建议。

1 个答案:

答案 0 :(得分:1)

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

请注意,GitLab CI Runners 独立于 GitLab,只需获取 Git 存储库的本地副本。因此,您的 CI 脚本将无法开箱即用地运行 listKeyconst selectFavouriteList = (listKey: string) => (state: RootState) => { return state.favourites.lists[listKey] } const favouriteList = useAppSelector(selectFavouriteList(listKey));

您需要做的是建立从 GitLab CI Runner 到您的 GitLab 实例的 SSH 连接。为此使用 git merge 脚本。关于 StackOverflow 有几个答案以及一个很好的 blog post on GitLab 如何实现这一点。

git push

然后运行您的 Git 命令,例如 before。然后推。

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

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

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

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