GitLab手动触发流水线时,禁用仅Dockerfile变更才执行的阶段
解决GitLab CI手动触发时build_base_container阶段自动运行的问题
问题原因
GitLab CI中,手动触发流水线(CI_PIPELINE_SOURCE为web)时,默认不会严格校验changes规则——因为手动触发没有明确的基准提交用于对比文件变更,因此GitLab会判定changes条件满足,导致目标阶段执行。此外还要确认你的文件名是否为Dockerfile(Git大小写敏感,原配置写的dockerfile可能和实际文件名不匹配)。
解决方案
修改.gitlab-ci.yml中的rules配置,明确排除手动触发的场景,同时保留仅当Dockerfile变更时执行阶段的逻辑:
stages: - build_base_container - build build_base_container: stage: build_base_container image: docker:latest services: - docker:dind script: - | docker login registry.gitlab.com -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} docker build -t $CI_REGISTRY_IMAGE . docker push $CI_REGISTRY_IMAGE docker logout registry.gitlab.com # 修正原错误命令:注销需指定仓库地址而非密码 rules: # 排除手动触发的流水线 - if: $CI_PIPELINE_SOURCE == "web" when: never # 仅当Dockerfile有变更时执行 - changes: - Dockerfile # 确保和实际文件名大小写一致
关键说明
- 排除手动触发:通过
if: $CI_PIPELINE_SOURCE == "web"捕获手动触发场景,设置when: never直接跳过该阶段 - 文件名大小写:Git是大小写敏感的,确认仓库中的文件名为
Dockerfile而非dockerfile,否则changes规则无法匹配 - 命令修正:原脚本中的
docker logout ${CI_REGISTRY_PASSWORD}是错误的,docker logout需要传入仓库地址,无需密码
如果需要排除其他非代码变更触发的流水线(如API触发、计划任务),可以扩展第一条规则:
- if: $CI_PIPELINE_SOURCE =~ /web|api|schedule/ when: never
内容的提问来源于stack exchange,提问作者Arslan Zaidi
相关产品推荐
相关产品推荐

