YAML中如何配置仅在特定分支发起Pull Request时运行stage
配置方法
不同CI/CD系统的YAML流水线语法略有差异,核心逻辑是同时校验两个条件:当前流水线触发源是Pull Request(GitLab中叫Merge Request)、PR的目标分支匹配你指定的分支规则,两个条件同时满足时才执行对应stage。下面给两种最常用场景的配置样例:
GitHub Actions 配置
如果用GitHub Actions做流水线,要实现「仅当PR目标分支为main、所有release/*前缀分支时,才执行deploy阶段」,配置如下:
name: Project CI # 第一层校验:仅指定分支的PR事件才触发流水线 on: pull_request: branches: - 'main' - 'release/*' jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm run build # 需要条件触发的deploy阶段 deploy: needs: build runs-on: ubuntu-latest # 第二层校验:双重确认触发源和目标分支,避免配置疏漏误触发 if: ${{ github.event_name == 'pull_request' && (startsWith(github.base_ref, 'release/') || github.base_ref == 'main') }} steps: - run: npm run deploy:staging
GitLab CI 配置
如果用GitLab CI,对应配置如下:
stages: - build - deploy build_job: stage: build script: - npm run build only: - merge_requests # 仅当MR目标分支匹配规则时才执行deploy阶段 deploy_job: stage: deploy script: - npm run deploy:staging rules: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'main' || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^release\//) when: on_success - when: never
配置注意事项
- 分支匹配支持通配符、正则两种写法,根据你用的CI系统语法选择即可
- 不要只在事件触发层做过滤,建议在对应stage的执行条件里再加一层校验,避免其他触发源(比如手动触发、分支推送)意外跑起该阶段
- 分支规则统一放在配置顶部维护,不要零散写在各个job的判断逻辑里,后续调整规则更方便
内容的提问来源于stack exchange,提问作者itye1970
相关产品推荐
相关产品推荐

