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

GitLab单仓多流水线触发异常:仅变更时运行需求未实现

问题描述

我正在构建一个包含两个独立构建流水线的monorepo,希望只有对应项目的文件变更时才触发对应的流水线,但目前两个流水线总会同时被触发,找不到原因。我的核心需求是:

  • 当发生合并请求(merge request)事件,且对应流水线的相关文件有变更时运行;
  • 在develop或release分支上运行,用于生成artifacts。

以下是我的.gitlab-ci.yml配置:

projectA:
  trigger:
    include: gitlab/ci-projectA.yml
    strategy: depend # 子流水线失败则主流水线失败
  rules:
    # 需求:合并请求事件且相关文件变更,或在develop/release分支时运行
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
      changes:
        paths:
          - projectA.sln
          - projectA/**/*
          - gitlab/ci-projectA.yml
          - .gitlab-ci.yml
      when: on_success
    - if: $CI_COMMIT_REF_NAME == "release"
      when: on_success
    - if: $CI_COMMIT_REF_NAME == "develop"
      when: on_success
    - when: never
    
project:
  trigger:
    include: gitlab/ci-projectB.yml
    strategy: depend # 子流水线失败则主流水线失败
  rules:
    # 需求:合并请求事件且相关文件变更,或在develop/release分支时运行
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
      changes:
        paths:
          - projectB.sln
          - projectB/**/*
          - gitlab/ci-projectB.yml
          - .gitlab-ci.yml
      when: on_success
    - if: $CI_COMMIT_REF_NAME == "release"
      when: on_success
    - if: $CI_COMMIT_REF_NAME == "develop"
      when: on_success
    - when: never
问题原因与修复方案

核心问题

当前配置中,develop和release分支的规则没有添加文件变更限制——只要处于这两个分支,无论修改了什么内容,两个流水线都会被触发,这违背了“仅对应项目文件变更时触发流水线”的需求。另外,project这个job名称属于笔误,应该改为projectB。

修复后的完整配置

projectA:
  trigger:
    include: gitlab/ci-projectA.yml
    strategy: depend # 子流水线失败则主流水线失败
  rules:
    # 合并请求事件:仅相关文件变更时运行
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
      changes:
        paths:
          - projectA.sln
          - projectA/**/*
          - gitlab/ci-projectA.yml
          - .gitlab-ci.yml
      when: on_success
    # develop/release分支:仅相关文件变更时运行
    - if: '$CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "release"'
      changes:
        paths:
          - projectA.sln
          - projectA/**/*
          - gitlab/ci-projectA.yml
          - .gitlab-ci.yml
      when: on_success
    - when: never
    
projectB: # 修正job名称为projectB
  trigger:
    include: gitlab/ci-projectB.yml
    strategy: depend # 子流水线失败则主流水线失败
  rules:
    # 合并请求事件:仅相关文件变更时运行
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
      changes:
        paths:
          - projectB.sln
          - projectB/**/*
          - gitlab/ci-projectB.yml
          - .gitlab-ci.yml
      when: on_success
    # develop/release分支:仅相关文件变更时运行
    - if: '$CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "release"'
      changes:
        paths:
          - projectB.sln
          - projectB/**/*
          - gitlab/ci-projectB.yml
          - .gitlab-ci.yml
      when: on_success
    - when: never

关键调整说明

  1. 分支规则添加文件变更检查:将原有的develop/release分支规则合并,同时添加changes条件,确保只有对应项目的文件发生变更时,该分支上的流水线才会触发。
  2. 修正job名称:把project改为projectB,避免配置混淆。
  3. 简化分支条件:用||合并develop和release的分支判断,减少冗余规则。

调整后,无论是合并请求还是直接推送到develop/release分支,只有当对应项目的文件发生变更时,才会触发对应的流水线,完全匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:50:25