GitLab CI配置求助:如何将预发布分支重置为主分支后合并新特性分支代码
GitLab CI配置求助:如何将预发布分支重置为主分支后合并新特性分支代码
首先我得帮你梳理下当前配置里的核心问题:你现在的reset_staging阶段确实把staging-one重置成了master,但完全漏掉了把当前要合并的特性分支(比如feature-two)合并到重置后的staging-one这一步;而且后面的deploy_to_staging_one用git reset --hard $CI_COMMIT_SHA又把代码切回了特性分支的提交,这就导致你最终部署的不是master+新特性的组合,而是单独的特性分支代码,完全偏离了你的需求。
针对你的需求,正确的流程应该是:当你发起从特性分支到staging-one的合并请求时,CI先把staging-one强制重置为master,然后把当前的特性分支合并到重置后的staging-one,推送更新后的分支,最后基于这个合并后的分支部署到预发布环境。
下面是修正后的gitlab-ci.yml配置,我会标注关键修改点:
image: <some-image> stages: - test - reset_staging # 重置staging分支并合并当前特性分支 - staging_one # 部署到预发布服务器 - live # 部署到生产服务器 unit_test: stage: test script: - echo "unit test command" except: - master - staging-one reset_staging: stage: reset_staging script: # 1. 拉取最新的master和当前特性分支代码 - git fetch origin master - git fetch origin $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME # 2. 切换到staging-one分支 - git checkout staging-one # 3. 强制重置为最新的master分支 - git reset --hard origin/master # 4. 合并当前要部署的特性分支(--no-edit用于跳过合并提交的编辑界面,可按需调整) - git merge origin/$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME --no-edit # 5. 配置有权限的远程仓库地址,强制推送更新后的staging-one - git remote set-url origin https://oauth2:$PERSONAL_ACCESS_TOKEN@dev.example.com/proj-public/test-repo.git - git push origin staging-one --force - echo "staging已重置为master并合并当前特性分支完成" only: # 只在针对staging-one的合并请求触发时执行 - merge_requests variables: # 限定只有目标分支是staging-one的MR才触发 CI_MERGE_REQUEST_TARGET_BRANCH_NAME: staging-one deploy_to_staging_one: stage: staging_one script: # 拉取最新的staging-one分支(也就是已经重置+合并后的代码) - git checkout staging-one - git pull origin staging-one # 执行你的预发布部署命令 - echo "开始部署预发布环境..." # 这里替换成你实际的部署脚本 when: on_success only: - merge_requests variables: CI_MERGE_REQUEST_TARGET_BRANCH_NAME: staging-one deploy_to_live: stage: live script: - echo "live command one" - echo "live command two" when: on_success only: - master
关键修改说明:
- 触发条件调整:把
reset_staging和deploy_to_staging_one的触发条件改成merge_requests并限定目标分支为staging-one,这样只有当你发起往staging-one的合并请求时才会执行这两个阶段,更贴合你的使用场景。 - 增加特性分支合并步骤:在重置
staging-one为master后,专门拉取当前MR的源特性分支并合并进去,这样staging-one就变成了master+新特性的组合。 - 修正部署阶段逻辑:部署时直接拉取更新后的
staging-one分支,而不是重置到特性分支的提交,确保部署的是你期望的代码。
另外需要注意几个细节:
- 确保你的
PERSONAL_ACCESS_TOKEN拥有仓库的写入权限,不然无法强制推送staging-one分支。 - 如果特性分支和
master有冲突,git merge会失败,你可以根据团队情况调整:要么提前在本地解决冲突,要么在CI脚本里添加冲突处理逻辑(比如自动终止并提醒开发者处理)。 - 你的GitLab版本是9.5.2,这个版本已经支持
CI_MERGE_REQUEST_SOURCE_BRANCH_NAME和CI_MERGE_REQUEST_TARGET_BRANCH_NAME这些变量,可以正常使用。
备注:内容来源于stack exchange,提问作者Murlidhar Fichadia
相关产品推荐
相关产品推荐

