You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]

关键修改说明

  1. 调整Workflow规则顺序与条件:

    • 优先排除tag和test_分支的场景
    • 拆分推送(push)和MR事件的规则,用$CI_PIPELINE_SOURCE明确区分场景,避免依赖$CI_COMMIT_BRANCH导致MR流水线无法触发
    • 确保MR事件能匹配到对应规则,触发流水线
  2. 添加任务依赖:

    • 给analysis-longtest-job添加needs: [analysis-test-job],确保只有短测试成功后才会启动长测试
  3. 明确短测试的运行场景:给analysis-test-job补充rules,确保分支推送和MR场景都能执行短测试

内容的提问来源于stack exchange,提问作者Alejandro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:00:23