首页 > 解决方案 > 天蓝色 DevOps 管道中的依赖关系和条件 oder

问题描述

在 Azure 管道 yaml 文件中,当在单个阶段定义多个作业时,可以指定它们之间的依赖关系。还可以指定每个作业运行的条件。

代码 #1

jobs:
- job: A
  steps:
  - script: echo hello

- job: B
  dependsOn: A
  condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/master'))
  steps:
  - script: echo this only runs for master

代码 #2

jobs:
- job: A
  steps:
  - script: "echo ##vso[task.setvariable variable=skipsubsequent;isOutput=true]false"
    name: printvar

- job: B
  condition: and(succeeded(), ne(dependencies.A.outputs['printvar.skipsubsequent'], 'true'))
  dependsOn: A
  steps:
  - script: echo hello from B

问题:

上面的代码 #1 和 #2 具有不同的依赖和条件顺序。顺序重要吗?如果有,有什么关系?(不同订单有什么区别)

标签: yamlazure-pipelines

解决方案


分别讨论 1 和 2。

代码#1

job1由于和之间没有数据连接job2,这里的数据连接是指变量共享等。

所以,对于#1,顺序没有问题。这里可以忽略指定的,而对和dependsOn之间的执行顺序没有特殊要求。job Ajob B

但是,您需要注意的一件事是,当您不指定dependsOn. 例如,大多数时候,他们会尊重订单job A, job B。有时,它们会随机运行为job B, job A

代码#2

这必须做出dependsOn指定。因为您job B使用的是在创建/生成的输出变量job A。由于我们的系统允许相同的变量名存在于不同的作业中,因此您必须指定dependsOn以便系统可以知道应该从其他人那里job B找到变量。只有指定了这个关键字,生成的变量才能被暴露并用于下一个作业。skipsubsequentjob Ajob A

因此,简而言之,一旦作业之间存在任何数据连接,例如变量传递,您必须指定dependsOn使作业相互连接。


推荐阅读