假设您有以下管道:
Job A (deploy) -> Job B (test) -> Job C (remove test deployment)
Run Code Online (Sandbox Code Playgroud)
管道应部署测试映像并在成功部署后对其进行测试。测试后,我想运行一个清理脚本,不管测试输出如何,但前提是测试映像(作业 A)已部署。
总结一下:我希望 Gitlab 只有在 Job A 成功时才执行 Job C ,但在 Job B 之后。
行不通的事情:
when: on-failure (作业 A 或作业 B 可能失败,但只有作业 A 重要)when: always (也许作业 A 失败导致作业 C 失败)when: on-success (要求所有工作都成功)我知道 GitLab 有一个名为 DAG Pipelines 的功能,它允许您使用needs关键字指定对其他作业的多个依赖项,但遗憾的when是,该关键字始终适用于所有先前的作业。所以你不能说这样的话:
Job A (deploy) -> Job B (test) -> Job C (remove test deployment)
Run Code Online (Sandbox Code Playgroud)
我错过了什么还是没有办法实现这种行为?
所述needsDAG字段可用于有条件地执行清除(作业C),如果作业B失败或成功,而不是在它被跳过,因为作业A失败。
创建 2 个符合以下布尔条件的清理作业:
(Job A succeeds and Job B succeeds):如果之前的所有任务都成功(作业 A 和作业 B),我们可以使用when: on_success. 但是,如果作业 A 成功而作业 B 失败,则不会触发。(Job A succeeds and Job B fails):为了通过未触发的清理(作业 C)规避前面的情况,我们利用了这样一个事实:如果作业 B 失败,这意味着作业 A 在管道中成功。通过创建重复的清理任务并needs在作业 B 和 上指定标记when: on_failure,清理任务将仅在作业 A 成功而作业 B 失败时运行。重申:如果(Job A succeeds and Job B succeeds)或(Job A succeeds and Job B fails),则清理作业将运行,通过布尔表达式缩减相当于(Job A succeeds).
这里一个明显的警告是现在有 2 个清理作业显示在管道中;然而,它们是相互排斥的,只能执行一个。
这是一个示例配置:
stages:
- deploy
- test
- cleanup
deploy_job:
stage: deploy
script:
- echo Deployed
- "true"
when: always
test_job:
stage: test
script:
- echo Executing tests
- "true"
when: on_success
# a YAML anchor reduces repetition
.cleanup_job: &cleanup_job
stage: cleanup
script:
- echo Cleaned up deployment
cleanup_deployment_success:
when: on_success
<<: *cleanup_job
cleanup_deployment_failure:
needs: ["test_job"]
when: on_failure
<<: *cleanup_job
Run Code Online (Sandbox Code Playgroud)
在各种有意失败的情况下,会产生以下管道状态:
从逻辑上讲,这表明无论Job B 成功还是失败,只要Job A 成功,Job C 就会运行。此外,故障状态保留在整个管道中。
\n\n需求 DAG 字段可用于在
\nC作业失败或成功时有条件地执行清理(作业)B,但当作业因作业失败而被跳过时则不执行A。
GitLab 13.11(2021 年 4 月)可能会改变这种情况
\n\n\nCI/CD 管道中的可选 DAG(\'需要:\')作业
\nGitLab CI/CD 中的有向无环图 (DAG) 允许您使用
\nneeds语法将作业配置为早于其阶段启动(一旦相关作业完成)。>\n我们还有rules、only或except关键字,它们确定是否将作业添加到管道中。不幸的是,如果您
\nneeds与这些其他关键字结合使用,当依赖作业未添加到管道时,您的管道可能会失败。在此版本中,我们将
\noptional关键字添加到needsDAG 作业的语法中。\n
\n- 如果依赖作业被标记为
\noptional但不存在于管道中,则该needs作业将忽略它。- 如果作业正在
\noptional管道中并且存在,则needs作业会在开始之前等待其完成。随着 DAG 的日益普及,这使得安全地结合
\n\n\nrules、only和变得更加容易。except
| 归档时间: |
|
| 查看次数: |
4727 次 |
| 最近记录: |