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

时间:2019-10-30 12:25:02

标签: azure-devops dependencies yaml azure-pipelines

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

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

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

Run.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

Build.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来获取上一阶段的信息?

1 个答案:

答案 0 :(得分:1)

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

this博客中,您可以找到一种解决方法,其中涉及利用pipeline artifacts将变量写入磁盘,然后将其作为文件传递。

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

  1. 创建一个文件夹,其中将包含您要传递的所有变量;任何文件夹都可以使用,但是像mkdir -p $(Pipeline.Workspace)/variable这样的文件夹可能是个好主意。
  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)中的环境变量。