天青DevOps管道中的依赖关系和条件

时间:2020-04-15 09:31:53

标签: yaml azure-pipelines

在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具有不同的依存关系和条件顺序。顺序重要吗?如果是这样,怎么回事? (不同订单之间有什么区别)

1 个答案:

答案 0 :(得分:1)

分别讨论1和2。

代码#1

由于job1job2之间没有数据连接,因此此处的数据连接是指变量共享等。

因此,对于#1,没有任何订单要紧。在dependsOnjob A之间对执行顺序没有特殊要求的情况下,您可以忽略指定的job B

但是,您需要注意的一件事是,当您不指定dependsOn时,实际的运行顺序将随机更改。例如,大多数时候,他们会遵守job Ajob B的顺序。有时,它们会随机以job Bjob A的身份运行。

代码#2

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

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