Azure YAML从上一阶段运行的作业中获取变量



我正在Azure DevOps中创建由两个阶段组成的YAML管道。

第一个阶段(先决条件(负责读取git提交,并创建一个逗号分隔的变量,其中包含受提交影响的服务列表。

第二阶段(Build(负责构建和单元测试项目。该阶段由许多templates组成,每个服务一个。在模板脚本中,作业将检查在上一阶段创建的变量中是否存在相关的Service。如果作业找到服务,它将继续构建和测试服务。但是,如果找不到服务,它将跳过该作业。

运行.yml:

stages:
- stage: Prerequisites
jobs:
- job: SetBuildQueue
steps:
- task: powershell@2
name: SetBuildQueue
displayName: 'Set.Build.Queue'
inputs:
targetType: inline
script: |
## ... PowerShell script to get changes - working as expected
Write-Host "Build Queue Auto: $global:buildQueueVariable"
Write-Host "##vso[task.setvariable variable=buildQueue;isOutput=true]$global:buildQueueVariable"
- stage: Build
jobs:
- job: StageInitialization
- template: Build.yml
parameters:
projectName: Service001
projectLocation: src/Service001
- template: Build.yml
parameters:
projectName: Service002
projectLocation: src/Service002

内部版本yml:

parameters:
projectName: ''
projectLocation: ''
jobs:
- job:
displayName: '${{ parameters.projectName }} - Build'
dependsOn: SetBuildQueue
continueOnError: true
condition: and(succeeded(), contains(dependencies.SetBuildQueue.outputs['SetBuildQueue.buildQueue'], '${{ parameters.projectName }}'))
steps:
- task: NuGetToolInstaller@1
displayName: 'Install Nuget'

问题:

当第一阶段运行时,它将创建一个名为buildQueue的变量,该变量如PowerShell脚本任务的控制台输出中所示进行填充:

Service001 Changed
Build Queue Auto: Service001;

然而,当它进入第二阶段并尝试运行构建模板时,当它检查条件时,它会返回以下输出:

Started: Today at 12:05 PM
Duration: 16m 7s
Evaluating: and(succeeded(), contains(dependencies['SetBuildQueue']['outputs']['SetBuildQueue.buildQueue'], 'STARS.API.Customer.Assessment'))
Expanded: and(True, contains(Null, 'service001'))
Result: False

所以我的问题是,我如何设置dependsOncondition来获得前一阶段的信息?

这是因为您希望在定义变量的不同阶段访问变量。目前,这是不可能的,每个阶段都是一个新代理的新实例。

在这个博客中,您可以找到一种解决方法,包括将变量写入磁盘,然后将其作为文件传递,利用管道工件。

将变量FOO从一个作业传递到不同阶段的另一个作业:

  1. 创建一个文件夹,其中包含要传递的所有变量;任何文件夹都可以工作,但像mkdir -p $(Pipeline.Workspace)/variables这样的文件夹可能是个好主意
  2. 将变量的内容写入一个文件,例如echo "$FOO" > $(Pipeline.Workspace)/variables/FOO。尽管名称可以是您想要的任何名称,但为文件提供与变量相同的名称可能是个好主意
  3. $(Pipeline.Workspace)/variables文件夹发布为名为variables的管道工件
  4. 在第二阶段,下载变量管道工件
  5. 将每个文件读取到一个变量中,例如FOO=$(cat $(Pipeline.Workspace)/variables/FOO)
  6. 暴露当前作业中的变量,就像我们在第一个示例中所做的那样:echo "##vso[task.setvariable variable=FOO]$FOO"
  7. 然后,您可以通过在Azure Pipelines($(FOO))中展开该变量来访问该变量,或者将其用作bash脚本($FOO)中的环境变量

由于sprint 168,可以使用引用其他阶段的依赖项

以下示例来自文件

stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
condition: and(succeeded(), eq(dependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
dependsOn: A
jobs:
- job: B1
steps:
- script: echo hello from Stage B

最新更新