GitLab CI/CD构建Job的changes规则不生效,如何修复?
问题分析与修正方案
错误原因
你的配置存在两个核心问题:
- 规则逻辑完全倒置:你设置的
when: never是当docker文件夹有变更时阻止job执行,这和你“仅在docker变更时触发build”的需求完全相反。 - 通用规则冲突:在错误规则后引用了通用规则,当docker没有变更时,错误规则不匹配,通用规则中的分支条件会触发,导致job无论docker是否变更都会执行。
修正后的配置
build:non-prod 修正版
build:non-prod: <<: *build rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: never # feature分支且docker有变更 → 设置环境变量并执行 - if: "$CI_COMMIT_BRANCH !~ /^(development|staging|main)$/" changes: - docker/**/* variables: ENVIRONMENT: "feature" # development/staging分支且docker有变更 → 执行 - if: "$CI_COMMIT_BRANCH =~ /^(development|staging)$/" changes: - docker/**/* # 符合non-prod分支但docker无变更 → 不执行 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH when: never tags: !reference [.tags_non_prod]
build:prod 修正版
build:prod: <<: *build rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: never # 默认分支且docker有变更 → 设置环境变量并执行 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH changes: - docker/**/* variables: ENVIRONMENT: prod # 默认分支但docker无变更 → 不执行 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH when: never tags: !reference [.tags_prod]
修正逻辑说明
- 首先排除合并请求事件,保持原有逻辑。
- 先匹配分支符合条件且docker有变更的场景,触发job执行并设置对应环境变量。
- 最后匹配分支符合条件但docker无变更的场景,直接阻止job执行。
- 利用GitLab CI规则的顺序匹配特性,确保只有docker变更时才会触发job,其他情况均不执行。
内容的提问来源于stack exchange,提问作者André Quintino
相关产品推荐
相关产品推荐

