Gitlab CI - 定义对其他条件作业的作业依赖

GitlabCI - define a job dependency on some other conditional job

在我的例子中,我想 运行 作业 smoke-test 只有当作业 deploy 成功完成时。有一个关键字 needs,应该可以做到这一点。

然而在文档中也写着:

In GitLab 13.9 and older, if needs: refers to a job that might not be added to a pipeline because of only, except, or rules, the pipeline might fail to create.

这正是我的情况(管道甚至没有启动,因为 deploy 作业不存在)。 deploy 作业是有条件的,使用非常复杂的 rules 条件:

  rules:
    - if: $CI_KUBERNETES_DEPLOYMENT_ENABLED != "true"
      when: never
    - if: $STAGING_CHART_DIRECTORY == ""
      when: never
    - if: $STAGING_NAMESPACE == ""
      when: never
    - if: $CI_REVIEW_DEPLOYMENT_ENABLED != "true" && $CI_MERGE_REQUEST_ID
      when: never
    - if: $CI_MERGE_REQUEST_ID && $CI_COMMIT_REF_PROTECTED == "true"
      when: never
    - when: on_success

我不想为 smoke-test 工作定义重复的 rules 条件 - 保持一致性会很痛苦。

如何在这种情况下简单地说“运行 smoke-test 作业仅当 deploy 作业成功完成时”?这里的最佳做法是什么?

如有任何提示,我将不胜感激:)

// gitlab版本:GitLab企业版14.4.2-ee

我认为您可以利用触发器功能来创建执行 smoke-test 步骤的子管道,请参阅 here and there

基本上,下游管道将由您的 deploy 步骤触发并执行两个步骤(deploysmoke-test

这不是您要找的东西,但是有一种方法可以避免两次维护规则。实际上有 3 种方式:)

  1. 使用扩展又名继承 - 您定义规则并从中扩展

.rules:
   rules:
     - if: ....

deploy:
   extends:
     - .rules

smoke-test:
   extends:
     - .rules
  1. 参考资料 - 又名组合 - https://docs.gitlab.com/ee/ci/yaml/yaml_optimization.html#reference-tags

deploy:
   rules:
     - if: ....

smoke-test:
   rules:
     - !reference ['deploy', rules]
  1. yaml anchors

这 3 种方式可以让您轻松地重用规则,并且应该可以帮助您解决问题