在我的 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
请给我你的好建议。
答案 0 :(得分:1)
在 GitLab 中无法自动执行此操作。但是您可以使用 GitLab CI 自动执行此操作。
请注意,GitLab CI Runners 独立于 GitLab,只需获取 Git 存储库的本地副本。因此,您的 CI 脚本将无法开箱即用地运行 listKey
和 const 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