GitLab CI配置:按Tag执行任务时根据Dockerfile存在性二选一
GitLab CI 按Dockerfile存在状态执行对应Job的正确配置
你需要实现的逻辑是:
- 仅当项目中不存在Dockerfile且触发条件为Tag时,执行
job01 - 仅当项目中存在Dockerfile且触发条件为Tag时,执行
job02 - 两个Job互斥,同一触发场景下仅运行其一
当前配置的问题在于job01的rules是按顺序匹配的,第一条if: '$CI_COMMIT_TAG'会直接匹配所有Tag触发的场景,后续的when: never规则不会生效,导致有Dockerfile时job01依然会运行,和job02同时执行。
正确配置方案
利用GitLab CI rules的逻辑组合,将条件合并为单条规则,确保只有完全匹配时才执行Job:
job01: script: - echo "Dockerfile is not exists" rules: - if: '$CI_COMMIT_TAG' exists: - '!Dockerfile' # 用!前缀表示匹配"不存在该文件"的场景 when: on_success job02: script: - echo "Dockerfile is exists" rules: - if: '$CI_COMMIT_TAG' exists: - Dockerfile when: on_success
配置说明
exists: ['!Dockerfile']:GitLab CI支持在文件路径前加!表示"该文件不存在",这是官方支持的反向匹配写法,无需额外指令- 每个Job的rules都只有一条匹配规则,确保只有当Tag条件和文件存在状态同时满足时,才会触发对应Job
- 两个Job的条件完全互斥,同一触发场景下只会有一个Job被执行
内容的提问来源于stack exchange,提问作者Vasai
相关产品推荐
相关产品推荐

