1. CI 流水线如何按分支、标签与 MR/PR 配置触发和执行策略?
在 CI 流水线中,如何根据分支、标签与合并请求(MR/PR)来配置不同的触发与执行策略?
- 分支、标签、MR 三类触发事件在各类 CI 中的含义与优先级
- 环境隔离:feature 分支跑轻量校验、主干跑完整流水线、标签跑发布
- 并发与去重:同一分支多次提交的合并、重复触发抑制
通过触发条件区分事件至少要在三个维度上配置:分支(branch)触发用于日常特性迭代,通常只做编译、单元测试与静态检查;MR/PR 触发用于合并前校验,在交互式场景下还需配置"合并后处理"(post-merge)来跑集成测试;标签(tag)触发用于真正发布,往往仅允许在主干上打符合语义版本规则的标签,并串联完整的构建、镜像推送与发布门禁。GitLab CI 用 rules/only/except,GitHub Actions 用 on.push.branches、on.pull_request、on.tags。执行策略上核心是"分支决定深度、标签决定发布":feature 分支缩短流水线、主干跑全量、发布标签走受控的晋升流。同时要处理并发去重(同一分支快速连续提交时用 concurrency 组取消旧任务)与受保护分支/标签的权限约束,避免任意分支触发生产发布。
这样设计既保证开发反馈速度(短分支快校验),又保证生产质量(主干全量、发布受控),同时避免重复构建浪费资源。触发事件与执行范围强关联,是"环境即门禁"思想在触发器层面的落地。
# GitLab CI 触发与执行策略
stages: [build, test, release]
workflow:
rules:
- if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/'
variables: { RELEASE: "true" }
- if: '$CI_COMMIT_BRANCH == "main"'
variables: { FULL: "true" }
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
variables: { CHECK: "true" }
build:
stage: build
script: make build
test:
stage: test
rules:
- if: '$CHECK == "true" || $FULL == "true"'
script: make test
release:
stage: release
rules:
- if: '$RELEASE == "true"'
script: make release