You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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  # 确保和实际文件名大小写一致

关键说明

  1. 排除手动触发:通过if: $CI_PIPELINE_SOURCE == "web"捕获手动触发场景,设置when: never直接跳过该阶段
  2. 文件名大小写:Git是大小写敏感的,确认仓库中的文件名为Dockerfile而非dockerfile,否则changes规则无法匹配
  3. 命令修正:原脚本中的docker logout ${CI_REGISTRY_PASSWORD}是错误的,docker logout需要传入仓库地址,无需密码

如果需要排除其他非代码变更触发的流水线(如API触发、计划任务),可以扩展第一条规则:

- if: $CI_PIPELINE_SOURCE =~ /web|api|schedule/
  when: never

内容的提问来源于stack exchange,提问作者Arslan Zaidi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:10:36