在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具有不同的依存关系和条件顺序。顺序重要吗?如果是这样,怎么回事? (不同订单之间有什么区别)答案 0 :(得分:1)
分别讨论1和2。
代码#1 :
由于job1
和job2
之间没有数据连接,因此此处的数据连接是指变量共享等。
因此,对于#1,没有任何订单要紧。在dependsOn
和job A
之间对执行顺序没有特殊要求的情况下,您可以忽略指定的job B
。
但是,您需要注意的一件事是,当您不指定dependsOn
时,实际的运行顺序将随机更改。例如,大多数时候,他们会遵守job A
,job B
的顺序。有时,它们会随机以job B
,job A
的身份运行。
代码#2 :
这必须使dependsOn
指定。因为您的job B
使用的是在job A
创建/生成的输出变量。由于我们的系统允许在不同的作业中存在相同的变量名称,因此必须指定dependsOn
,以便系统可以知道job B
应该从skipsubsequent
中找到变量job A
,而不是其他变量。只有指定的关键字,job A
中生成的变量才能公开,并可供下一个作业使用。
因此,简而言之,一旦作业之间存在任何数据连接(例如,变量传递),则必须指定dependsOn
才能使作业相互连接。