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
关键调整说明
- 分支规则添加文件变更检查:将原有的
develop/release分支规则合并,同时添加changes条件,确保只有对应项目的文件发生变更时,该分支上的流水线才会触发。 - 修正job名称:把
project改为projectB,避免配置混淆。 - 简化分支条件:用
||合并develop和release的分支判断,减少冗余规则。
调整后,无论是合并请求还是直接推送到develop/release分支,只有当对应项目的文件发生变更时,才会触发对应的流水线,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Christian Sauer
相关产品推荐
相关产品推荐

