如何配置GitLab Pipeline仅在提交/合并到master分支时触发
问题原因
原有配置仅通过only.refs限制任务运行分支为master,未过滤Pipeline触发来源,所有master分支上下文下的触发行为(包括网页手动触发、API调用、定时任务等)都会启动该任务,因此手动运行时任务会被执行。
配置修改方案
GitLab CI提供预定义变量$CI_PIPELINE_SOURCE标识Pipeline的触发来源,只需叠加触发源过滤规则,仅保留「代码推送至master」的触发场景即可。该场景既包含开发者本地直接向master提交代码的push操作,也包含其他分支合并到master时系统自动生成合并提交、推送到master的操作,完全匹配需求。
推荐写法(使用rules语法,为GitLab官方推荐的规则方案,替代旧版only/except逻辑)
commit_to_master_notification: stage: build script: - echo "rest of script" rules: - if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "push"'
兼容旧版写法(保留原有only配置结构,无需重构语法)
commit_to_master_notification: stage: build script: - echo "rest of script" only: refs: - master variables: - $CI_PIPELINE_SOURCE == "push"
规则生效说明
- 网页端手动点击「运行流水线」触发的任务,
$CI_PIPELINE_SOURCE值为web,不满足过滤条件,任务不会执行 - 本地直接push代码到master时,
$CI_PIPELINE_SOURCE值为push,分支匹配master,任务正常执行 - 其他分支合并到master完成后,系统自动推送合并提交到master触发的Pipeline,
$CI_PIPELINE_SOURCE值为push,任务正常执行 - 若开启MR合并前流水线、合并结果流水线,这类流水线触发源为
merge_request_event,代码尚未正式合入master,不会命中规则,任务不会提前执行
内容的提问来源于stack exchange,提问作者Maciej Małkowski
相关产品推荐
相关产品推荐

