如何仅当子目录(如box/)内文件变更时触发GitLab CI流水线?
解决GitLab CI子目录流水线仅在指定目录变更时触发的问题
你遇到的核心问题是:仅配置job的rules只能控制单个job是否执行,但流水线本身仍会被创建(空流水线)。要彻底阻止box目录外变更时触发流水线,需要通过workflow:rules控制整个流水线的创建逻辑。
正确配置示例
# 全局控制流水线是否触发 workflow: rules: # 合并请求场景:仅box目录有变更时创建流水线 - if: $CI_PIPELINE_SOURCE == "merge_request_event" changes: - box/**/* # 直接推送代码场景:仅box目录有变更时创建流水线 - if: $CI_PIPELINE_SOURCE == "push" changes: - box/**/* # 其他所有场景都不创建流水线 - when: never build: stage: build script: - *build_image # 可选:给job添加额外规则做双重验证 rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_PIPELINE_SOURCE == "push" changes: - box/**/*
关键说明
changes中的路径是相对于仓库根目录的,所以box/**/*写法正确,和.gitlab-ci.yml所在的子目录无关。- 如果需要支持其他流水线触发源(如标签推送、定时任务),可以在
workflow:rules中添加对应条件,否则这些场景会被when: never直接阻止。 - 配置
workflow:rules后,只有满足条件的情况才会创建流水线,从根源上避免了不必要的流水线触发。
内容的提问来源于stack exchange,提问作者skydriver
相关产品推荐
相关产品推荐

