如何将前序作业的输出变量作为后续作业的池需求条件?
问题背景与需求
我有两台标记为RESERVED的机器,分别在环境变量MAC_GROUP中设置了"TX"或"NY"。RUNFILES类型的代理具备对应的能力标签:TX=true或NY=true。我希望后续作业能和前序作业在同一地理位置的机器上运行,已经编写了如下YAML流水线:
jobs: - job: MountShare pool: demands: RESERVED steps: - powershell: | write-host "MAC_GROUP: '$env:MAC_GROUP'" Write-Host "##vso[task.setvariable variable=MAC_GROUP;isOutput=true]$env:MAC_GROUP" displayName: "Mount Share" - job: GetFiles dependsOn: MountShare pool: demands: - RUNFILES - $[[ dependencies.MountShare.outputs['MountStep.MAC_GROUP'] ]] variables: MacGroup: $[dependencies.MountShare.outputs['MountStep.MAC_GROUP']] steps: - powershell: | Write-Host 'group: $(MacGroup)' displayName: "Get Files"
目前$(MacGroup)变量能正确解析,但无法作为字面量需求生效,需要解决这个问题。
解决方法
问题出在两个地方:
- 前序作业的输出变量步骤缺少引用名称,导致后续作业无法正确获取输出值;
- 需求列表中直接使用变量值,没有构造成代理能力要求的
标签名=值格式。
修改步骤:
- 给
MountShare作业中的PowerShell步骤添加name属性,确保输出变量的引用路径正确; - 在
GetFiles作业的demands中,使用运行时表达式$[ ]结合format函数,将输出变量构造成TX=true或NY=true的需求格式,匹配代理的能力标签。
修改后的完整YAML:
jobs: - job: MountShare pool: demands: RESERVED steps: - name: MountStep # 添加步骤名称,用于后续引用输出变量 powershell: | write-host "MAC_GROUP: '$env:MAC_GROUP'" Write-Host "##vso[task.setvariable variable=MAC_GROUP;isOutput=true]$env:MAC_GROUP" displayName: "Mount Share" - job: GetFiles dependsOn: MountShare pool: demands: - RUNFILES # 用format函数构造需求格式:变量值=true - $[format('{0}=true', dependencies.MountShare.outputs['MountStep.MAC_GROUP'])] variables: MacGroup: $[dependencies.MountShare.outputs['MountStep.MAC_GROUP']] steps: - powershell: | Write-Host 'group: $(MacGroup)' displayName: "Get Files"
说明:
- 运行时表达式
$[ ]会在流水线运行阶段解析变量,动态生成符合要求的需求字符串; format('{0}=true', ...)将输出的TX或NY拼接成TX=true/NY=true,正好匹配代理的能力标签,这样就能让后续作业调度到和前序同组的机器上。
内容的提问来源于stack exchange,提问作者B.McKee
相关产品推荐
相关产品推荐

