GitLab流水线规则失效:my_stage不符合条件仍运行
问题分析与解决方案
你的问题出在GitLab CI规则的默认行为以及路径匹配的细节上:
规则默认行为漏洞:
你当前只定义了一个触发规则,当事件不是merge_request_event或src/test/resources目录无变更时,没有明确的规则阻止job运行。GitLab CI中,若没有任何规则匹配,job会默认按when:always执行,这就是提交src/main/java文件时该阶段仍启动的原因。路径匹配范围不足:
src/test/resources/*仅匹配该目录下的直接文件,无法覆盖子目录中的文件变更。如果需要匹配所有层级的文件,得用递归通配符**。
修正后的配置
写法一:明确条件+兜底规则
stages: - my_stage my_stage_mr: stage: my_stage image: myimage-11-slim rules: # 仅在合并请求事件且目标目录有变更时运行 - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' changes: - src/test/resources/**/* when: on_success # 其他所有情况直接跳过该job - when: never
写法二:先排除非MR事件
stages: - my_stage my_stage_mr: stage: my_stage image: myimage-11-slim rules: # 非合并请求事件直接跳过 - if: '$CI_PIPELINE_SOURCE != "merge_request_event"' when: never # MR事件下检查目录变更 - changes: - src/test/resources/**/*
关键说明
- 新增的
- when: never规则彻底兜底,确保所有不满足前置条件的场景都不会触发该job。 src/test/resources/**/*能匹配目录下所有层级的文件和子目录变更,覆盖更全面的修改场景。
内容的提问来源于stack exchange,提问作者SereneAtk
相关产品推荐
相关产品推荐

