GitLab CI配置优化:合并请求时避免生成两个独立流水线
GitLab CI 流水线优化配置方案
问题现状
- 向非master分支提交代码时,仅运行
test和node阶段的流水线 - 发起合并请求(MR)时,会生成两个独立流水线:
- 执行
test和node阶段的分支流水线 - 执行
prepare、build、run阶段及Secret-Detection安全检测的MR专属流水线
- 执行
- 核心问题:若MR专属流水线(含秘检)失败但分支流水线成功,MR仍可合并,存在安全风险;且双流水线占用有限runner资源,拖慢执行速度
需求目标
- MR及master分支提交代码时,所有阶段在同一流水线按顺序执行
- 非master分支提交代码时,仅执行
test和node阶段
修改后的完整配置
image: node:latest # 控制流水线生成逻辑,避免MR时产生双流水线 workflow: rules: # MR事件时,仅生成MR流水线 - if: $CI_PIPELINE_SOURCE == "merge_request_event" # master分支直接提交时生成流水线 - if: $CI_COMMIT_BRANCH == "master" # 其他分支提交时生成流水线(仅运行默认执行的任务) - if: $CI_COMMIT_BRANCH != "master" && $CI_PIPELINE_SOURCE != "merge_request_event" stages: - test - node - prepare - build - run node_18: stage: node image: node:18.20.2 script: - echo "Testing Node.js version 18.20.2" - npm i - cp config.example.json config.json - rm config.json node_20: stage: node image: node:20.13.1 script: - echo "Testing Node.js version 20.13.1" - npm i - cp config.example.json config.json - rm config.json node_22: stage: node image: node:22.2.0 script: - echo "Testing Node.js version 22.2.0" - npm i - cp config.example.json config.json - rm config.json prepare: stage: prepare script: - echo "Removing node_modules..." - rm -rf node_modules/ rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master" compile: stage: build image: node:20 script: - npm i - cp config.example.json config.json - node deploy-commands.js - npm run pm2start - npm run pm2stop rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master" testrun: stage: run script: - npm run test rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master" include: - template: Security/Secret-Detection.gitlab-ci.yml
配置说明
workflow规则:
- 明确限定流水线触发条件,MR事件仅生成单条MR流水线,彻底避免分支流水线与MR流水线重复生成的问题
- 区分master分支、其他分支的触发逻辑,确保非master分支仅运行基础阶段任务
替换
only为rules:- 将原
only: [master, merge_requests]替换为精准的rules条件,确保prepare、build、run阶段及Secret-Detection仅在MR或master分支提交时执行 node阶段的任务无额外规则,默认在所有流水线中运行,符合非master分支仅执行test、node阶段的需求
- 将原
Secret-Detection集成:
- 集成的安全检测模板会自动遵循全局
workflow规则,仅在MR或master分支的流水线中执行,不会单独触发额外流水线
- 集成的安全检测模板会自动遵循全局
内容的提问来源于stack exchange,提问作者AstroHWeston
相关产品推荐
相关产品推荐

