Gitlab CI - 带有“when:always”的规则与不带“when:always”的规则之间有区别吗?

eya*_*uby 3 if-statement pipeline rules gitlab gitlab-ci

我在 Gitlab-CI 中有一个管道,其中一项作业有以下规则:

rules:
  - if: "$CI_PIPELINE_SOURCE == "merge_request_event"
Run Code Online (Sandbox Code Playgroud)

如果我将其更改为:会有什么不同吗?

  - if: "$CI_PIPELINE_SOURCE == "merge_request_event"
    when: always
Run Code Online (Sandbox Code Playgroud)

因为,第一个规则将在满足条件时执行,而替代规则(带有when:always的规则)将执行相同的操作。

那么“何时:总是”会发生什么变化呢?如果它能改变什么的话。

syt*_*ech 8

是,有一点不同。默认情况下,值为when:--on_success仅当前一阶段的作业成功时才运行作业。always即使前一阶段的作业失败,使用也会允许作业运行。

\n

根据文档,这些是可能的值when

\n
\n

on_success(默认):仅当早期阶段的所有作业都成功或allow_failure:true时才运行作业。
\n manual:仅在手动触发时运行作业。
\n always:无论早期阶段的作业状态如何,都运行作业。也可用于工作流程:规则。
\n on_failure:仅当早期阶段至少有一个作业失败时才运行作业。具有allow_failure: true 的作业始终被认为是成功的。
\n delayed:将作业的执行延迟指定的持续时间。
\n never: 不运行\xe2\x80\x99 作业。只能在规则部分或工作流程中使用:规则。

\n
\n

但如果您执行以下操作,它实际上与第一个示例相同:

\n
  - if: "$CI_PIPELINE_SOURCE == "merge_request_event"\n    when: on_success\n
Run Code Online (Sandbox Code Playgroud)\n

这也假设when:未在作业主体中使用。

\n

如果你的身体和规则中确实有when:,这会发生一些变化。

\n
myjob:\n  when: always\n  rules:\n    - if: ...\n      when: on_success  # this takes precedence if this rule matches\n    - if: ...  # uses the default "when:" if this rule matches\n\n
Run Code Online (Sandbox Code Playgroud)\n

在这种情况下,将 加入when:到规则中,当规则匹配时when:,规则中指定的内容将优先于when:作业正文中的设置。

\n

在旧版本的 GitLab 中,不允许混合job:when:和,并且会导致错误。job:rules:when:

\n