首页/开发/CI/CD 与发布速查/合并请求流水线(MR/PR Pipeline)
流水线设计54 条

合并请求流水线(MR/PR Pipeline)

以「合并后的结果」为准验证变更:GitLab 合并请求事件管道、GitHub pull_request 事件,通过后合并按钮才可点。

CI/CD 与发布速查开发更新于 2026-10-13

合并请求流水线是什么

以合并后的结果为准验证变更:GitLab 的合并请求事件管道(merge_request_event)针对合并结果运行,GitHub 的 pull_request 事件默认对合并视图验证,通过后合并按钮才可点。它解决的是分支各自全绿、合并后主干变红的两段式问题:验证对象从分支头换成合并产物,语义冲突(两边各自能过、合起来编译失败)在合并前暴露。配套机制是分支保护:要求该检查通过后才允许合并。

基本信息

价值防止分支全绿、合并后主干红
验证对象合并结果,而非仅分支头
配套分支保护要求该检查通过后才允许合并
触发示例GitLab merge_request_event、GitHub on pull_request
安全边界fork 贡献的 PR 默认不拿到密钥,设计要以此为前提

典型使用场景

  • 主干保护:要求 MR 检查通过才可合并,杜绝带病合入。
  • 多人并行开发:每个 MR 独立验证合并结果,提前发现语义冲突。
  • 评审联动:评审意见与流水线结果在同一界面,评审者直接看到验证结论。
  • 流水线去重:推送触发与 MR 触发并存时收敛配置,配合取消策略避免同一提交跑两遍。
  • 分层检查:轻量检查放 MR,重量级全量回归放主分支或夜间任务。
  • 合并队列:高流量仓库用合并队列在合并前重验(GitLab 合并列车、GitHub merge queue),降低主干红灯概率。
  • 外部贡献流程:fork 下的 PR 先跑无密钥检查,维护者批准后再进入需要凭据的阶段。

GitLab 配置

GitLab 配置
workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

GitHub 配置

GitHub 配置
on:
  pull_request:
    branches: [main]
pull_request 与 push 两种触发的验证对象不同:前者是合并结果,后者是分支头;两者同时启用时要理解同一提交为什么跑了两条流水线。
fork 仓库的 PR 默认不向发起方暴露密钥:需要密钥的阶段应设计为维护者批准后运行,别把它当默认可用。
作业重命名后分支保护里引用的检查名可能失效:合并门禁静默消失,改名要同步更新保护规则。

易错点

  • 只跑分支头不跑合并结果:两个各自全绿的分支合并后可能编译失败,应启用 MR 事件管道或合并队列。
  • 每推一次都重跑全量:配合并发取消(concurrency)取消旧运行,节省队列与算力。
  • 把密钥直接给不受信任的 PR 运行:外部贡献者代码可读取并外传,需审批门与最小权限。
  • 分支保护与检查名不一致:重命名作业后保护规则失配,合并门禁失效而没人察觉。
  • MR 检查与主干检查环境不一致:合并后才暴露的问题依然存在,尽量让两者复用同一套验证定义。

数据来源与参考

  • GitLab Docs《Merge request pipelines》
  • GitHub Docs《Events that trigger workflows》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌