GitLab CI仅在合并请求运行长测试任务失效问题排查
问题描述
我负责一个多人协作的GitLab项目,需求如下:
- 分支拉取到个人fork仓库时运行短测试工作流
- 向中央仓库master分支发起合并请求(MR)时运行长测试
目前短测试任务可正常执行,但长测试任务analysis-longtest-job从未运行。当前CI配置如下:
workflow: rules: # here the order matter! # does not run with changes in .md files - if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BEFORE_SHA !~ /0{40}/' changes: - "{*[^.]md*,*.[^m]*,*.m,*.m[^d]*,*.md?*,*[^d]}" # does not run when creating tags - if: $CI_COMMIT_TAG when: never # does not run if branches start with test_ - if: $CI_COMMIT_BRANCH =~ /test_/ when: never # it runs with any branch - if: $CI_COMMIT_BRANCH stages: - build - test - plot .... analysis-test-job: stage: test script: - source run_shorttest.sh analysis-longtest-job: stage: test script: - source run_longtest.sh rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
明确需求:analysis-longtest-job仅在向中央仓库master分支发起合并请求,且分支短测试通过后执行。请问配置存在什么问题?
问题分析与修复方案
核心问题1:Workflow规则未覆盖MR流水线触发条件
GitLab的合并请求流水线中,$CI_COMMIT_BRANCH变量不存在(MR流水线使用$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME等专属变量)。当前workflow的所有规则都依赖$CI_COMMIT_BRANCH,导致MR事件无法触发任何流水线,自然analysis-longtest-job不会运行。
核心问题2:长测试任务未设置短测试依赖
当前配置中analysis-test-job和analysis-longtest-job同属test阶段,默认会并行执行,无法满足“短测试通过后才执行长测试”的需求。
修正后的完整配置
workflow: rules: # 不运行在tag创建时 - if: $CI_COMMIT_TAG when: never # 不运行在以test_开头的分支 - if: $CI_COMMIT_BRANCH =~ /test_/ when: never # 分支推送(含fork仓库):仅当非.md文件变更时运行 - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BEFORE_SHA !~ /0{40}/' changes: - "{*[^.]md*,*.[^m]*,*.m,*.m[^d]*,*.md?*,*[^d]}" # 匹配向master发起的MR事件 - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"' # 匹配其他分支推送场景(含首次提交) - if: '$CI_PIPELINE_SOURCE == "push"' stages: - build - test - plot .... analysis-test-job: stage: test script: - source run_shorttest.sh # 分支推送和MR场景都要运行短测试 rules: - if: '$CI_PIPELINE_SOURCE == "push"' - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' analysis-longtest-job: stage: test script: - source run_longtest.sh rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"' # 依赖短测试任务成功完成后才执行 needs: [analysis-test-job]
关键修改说明
调整Workflow规则顺序与条件:
- 优先排除tag和test_分支的场景
- 拆分推送(push)和MR事件的规则,用
$CI_PIPELINE_SOURCE明确区分场景,避免依赖$CI_COMMIT_BRANCH导致MR流水线无法触发 - 确保MR事件能匹配到对应规则,触发流水线
添加任务依赖:
- 给
analysis-longtest-job添加needs: [analysis-test-job],确保只有短测试成功后才会启动长测试
- 给
明确短测试的运行场景:给
analysis-test-job补充rules,确保分支推送和MR场景都能执行短测试
内容的提问来源于stack exchange,提问作者Alejandro
相关产品推荐
相关产品推荐

