在.gitlab-ci.yml中能否用阶段名代替作业名配置作业依赖?
解决方案
GitLab CI 提供两种主流方式实现你的需求,无需为每个测试作业配置两套独立逻辑:
方案1:直接指定阶段作为依赖(适用于 GitLab 14.3 及以上版本)
GitLab 14.3 版本后needs关键字支持直接指定阶段作为依赖,会自动匹配当前流水线中该阶段下所有已触发的有效作业;GitLab 15.3 版本后dependencies也支持该写法,可直接拉取对应阶段所有作业的制品。
配置示例
stages: - build - deploy - tests build-job: stage: build script: echo "build" deploy-feature: stage: deploy except: - master when: manual allow_failure: false # 必须配置,否则未执行的手动作业会被判定为允许失败,测试作业仍会提前执行 deploy-prod: stage: deploy only: - master when: manual allow_failure: false test-cases: stage: tests needs: - stage: deploy # 依赖整个deploy阶段所有触发的作业 # 需要拉取制品时加上下面的配置,不需要则可省略 dependencies: - stage: deploy script: echo "run test"
由于你的deploy-feature和deploy-prod是分支互斥的,每次流水线只会有一个deploy作业生效,该配置会自动匹配对应分支的部署作业作为依赖。
方案2:基于规则的模板继承(兼容低版本GitLab)
如果你的GitLab版本不支持阶段级别的依赖,可将测试作业的依赖逻辑抽为通用模板,所有测试作业直接继承模板即可,无需重复编写配置。
配置示例
stages: - build - deploy - tests # 测试作业通用模板,统一配置依赖逻辑 .base_test: stage: tests rules: - if: $CI_COMMIT_BRANCH == "master" needs: ["deploy-prod"] dependencies: ["deploy-prod"] - if: $CI_COMMIT_BRANCH != "master" needs: ["deploy-feature"] dependencies: ["deploy-feature"] build-job: stage: build script: echo "build" deploy-feature: stage: deploy except: - master when: manual allow_failure: false deploy-prod: stage: deploy only: - master when: manual allow_failure: false # 所有测试作业直接继承模板即可,17个测试作业仅需各写自身的执行逻辑 test-cases-1: extends: .base_test script: echo "run test 1" test-cases-2: extends: .base_test script: echo "run test 2" # ...其余15个测试作业同理
注意事项
所有手动触发的部署作业必须配置allow_failure: false,否则GitLab会默认将未执行的手动作业标记为「允许失败」,不会阻塞后续阶段的测试作业执行,导致测试提前运行。
内容的提问来源于stack exchange,提问作者Vibhav Chaddha
相关产品推荐
相关产品推荐

