我正在由两个阶段组成的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
所以我的问题是如何设置dependsOn
和condition
来获取上一阶段的信息?
答案 0 :(得分:1)
这是因为您要在与定义变量不同的阶段访问变量。目前,这是不可能的,每个阶段都是新代理的新实例。
在this博客中,您可以找到一种解决方法,其中涉及利用pipeline artifacts将变量写入磁盘,然后将其作为文件传递。
要将变量FOO从一项作业传递到另一个阶段的另一项:
mkdir -p $(Pipeline.Workspace)/variable
这样的文件夹可能是个好主意。echo "$FOO" > $(Pipeline.Workspace)/variables/FOO
。即使名称可以是您想要的任何名称,也可以为文件指定与变量相同的名称。$(Pipeline.Workspace)/variables
文件夹发布为名为variables
的管道工件FOO=$(cat $(Pipeline.Workspace)/variables/FOO)
echo "##vso[task.setvariable variable=FOO]$FOO"
($(FOO))
中展开变量来访问变量,或将其用作bash脚本($FOO)
中的环境变量。