如何在GitLab中实现代码合并并审批通过后触发流水线?
GitLab中合并请求(PR)审批通过并合并后触发流水线的配置方案
当前你提供的配置存在核心问题:$CI_MERGE_REQUEST_APPROVED变量仅在合并请求的预合并流水线(即MR处于打开状态时运行的流水线)中生效,当PR完成合并后,该变量不会自动带入合并后分支的流水线,因此无法触发你需要的合并后执行逻辑。
以下是修正后的配置方案,实现PR审批通过并合并后触发对应任务:
1. 自动触发的部署任务配置
contactcreate-tst2-19: stage: deploy script: - 'curl --request POST --form token=<token> --form ref=19.0 --form variables[ENVIRONMENT]=TST2 https://vcs.build.livevox.net/api/v4/<id>/trigger/pipeline' rules: # 匹配合并后分支推送的流水线,且对应MR已审批,同时指定文件有变更 - if: '$CI_PIPELINE_SOURCE == "push" && $CI_MERGE_REQUEST_APPROVED == "true"' changes: - 'contact/contact-create/TST2/config.json' # 可选:保留MR预合并阶段的已审批触发逻辑(按需选择) - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_APPROVED' changes: - 'contact/contact-create/TST2/config.json'
2. 手动触发的任务配置
# 请为该任务补充名称和对应脚本 scripter-tst2-manual: stage: deploy # 替换为你的实际阶段 script: # 此处填写你的任务执行脚本 rules: - if: '$CI_PIPELINE_SOURCE == "push" && $CI_MERGE_REQUEST_APPROVED == "true"' changes: - 'scripter/TST2/scripterTestData.json' - 'scripter/.gitlab-scripter.yml' when: manual # 可选:保留MR预合并阶段的手动触发逻辑(按需选择) - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_APPROVED' changes: - 'scripter/TST2/scripterTestData.json' - 'scripter/.gitlab-scripter.yml' when: manual
关键配置说明
$CI_PIPELINE_SOURCE == "push":指定触发源为分支推送,包含PR合并后的分支更新$CI_MERGE_REQUEST_APPROVED == "true":GitLab 13.9及以上版本会在合并后的流水线中保留该变量,用于验证对应MR已通过审批changes规则:仅当指定文件发生变更时才触发任务,精准控制执行范围when: manual:合并后的流水线依然支持手动触发任务,满足需要人工确认的场景
注意事项
- 确认你的GitLab版本不低于13.9,否则无法在合并后流水线中获取
CI_MERGE_REQUEST_APPROVED变量 - 如果你的仓库已配置强制审批后才能合并,可简化规则为
$CI_PIPELINE_SOURCE == "push"结合changes,但保留审批变量校验会更严谨 - 测试时可创建已审批的MR并合并,观察目标分支的流水线是否触发对应任务
内容的提问来源于stack exchange,提问作者Shreyas Murali
相关产品推荐
相关产品推荐

