You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改说明:

  1. 触发条件调整:把reset_staging和deploy_to_staging_one的触发条件改成merge_requests并限定目标分支为staging-one,这样只有当你发起往staging-one的合并请求时才会执行这两个阶段,更贴合你的使用场景。
  2. 增加特性分支合并步骤:在重置staging-one为master后,专门拉取当前MR的源特性分支并合并进去,这样staging-one就变成了master+新特性的组合。
  3. 修正部署阶段逻辑:部署时直接拉取更新后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 12:02:57