如何实现GitLab CI运行主配置任务或引入的外部配置任务二选一
GitLab CI二选一执行任务配置方案
你之前的配置失效的核心原因是 workflow.rules 作用于整个流水线,当匹配到 $DONT_RUN_DEFAULT_PIPELINE 变量时会直接禁止生成整个流水线,自然包含你要运行的configuration.yml中的任务也不会被执行。
最优方案:使用default默认规则控制主配置任务
GitLab 14.3及以上版本支持为所有未单独配置rules的任务设置全局默认规则,你只需要在主配置.gitlab-ci.yml中添加default配置块即可,原有30个任务不需要做任何修改:
include: - local: '/path/to/local/configuration.yml' # 新增的全局默认规则,所有未单独写rules的任务都会继承 default: rules: - if: '$DONT_RUN_DEFAULT_PIPELINE' when: never - when: on_success # 保持原有默认执行逻辑 # 原有任务完全不需要修改 test: script: - echo "hello world" # ... 其余30个任务保持原样
配套configuration.yml配置
你需要对应调整configuration.yml中的任务规则,保证只有设置了$DONT_RUN_DEFAULT_PIPELINE变量时该文件中的任务才会执行,示例规则参考:
# configuration.yml中的任务配置示例 single_job: script: - echo "run single job" rules: - if: '$DONT_RUN_DEFAULT_PIPELINE' when: on_success - when: never
实现效果
- 未设置
$DONT_RUN_DEFAULT_PIPELINE变量时:主配置所有任务正常执行,configuration.yml中的任务跳过 - 设置
$DONT_RUN_DEFAULT_PIPELINE变量时:主配置所有任务跳过,仅运行configuration.yml中的单个任务
注意:如果你原有30个任务中存在单独配置了
rules的任务,默认规则不会生效,只需要给这部分任务的rules开头添加- if: '$DONT_RUN_DEFAULT_PIPELINE'\n when: never即可,不需要修改全部任务。
低版本兼容方案
如果你的GitLab版本低于14.3不支持default rules,可以通过隐藏模板批量继承规则,相比逐个修改rules工作量更小:
# 主配置中先定义隐藏的规则模板 .default_job_rules: rules: - if: '$DONT_RUN_DEFAULT_PIPELINE' when: never - when: on_success # 原有任务只需要加一行extends即可 test: extends: .default_job_rules script: - echo "hello world"
内容的提问来源于stack exchange,提问作者eckes
相关产品推荐
相关产品推荐

