我正在创建一个模板来从另一个管道下载工件。我计划在同一项工作中多次使用此模板,例如需要 2 个工件。对于我下载的每个工件,我想打印与其关联的“构建”信息。
- task: DownloadPipelineArtifact@2
name: Download${{parameters.ArtifactName}}
inputs:
buildType: 'specific'
project: 'myproject'
definition: '${{parameters.PipelineRootName}}-${{parameters.ArtifactName}}-Build'
specificBuildWithTriggering: false
buildVersionToDownload: 'latestFromBranch'
branchName: 'refs/heads/release/${{parameters.ReleaseBranch}}'
artifactName: ${{ parameters.ArtifactName }}
targetPath: '$(Pipeline.Workspace)\${{parameters.ArtifactName}}'
- task: Powershell@2
displayName: '${{parameters.ArtifactName}} Artifact Version Print'
inputs:
targetType: inline
script: |
### this line is the problem!! ###
$BuildNumber = '$[ variables['${{parameters.ArtifactName}}.BuildNumber']]'
Write-Host "${{parameters.ArtifactName}}.BuildNumber=$BuildNumber"
$headers = @{
Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
$uri="https://dev.azure.com/mycompany/myproject/_apis/build/builds/$($BuildNumber)?api-version=7.0"
$result = Invoke-RestMethod -Uri $uri -Method get -Headers $Headers -ContentType "application/json"
$result | select id, sourceBranch, sourceVersion, buildNumber, status, result, startTime, finishTime, reason, tags | convertTo-Json
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
挑战是检索“下载”任务的输出变量。由于同一作业需要所有工件,因此我无法将其拆分为不同的作业。我曾经将名称简单地称为“DownloadArtifact”,然后我可以使用 $(DownloadArtifact.BuildNumber) 获取内部版本号。但是,如果我使用该模板两次,我会收到重复的任务名称错误。我找不到适用于获取适当作业的内部版本号的语法。我已经审查了几个 SO 示例,但到目前为止还没有找到类似的问题,并且通常的解决方法对这种情况没有帮助。
错误示例:
char:31
+ $BuildNumber = '$[ variables['commonScripts.BuildNumber']]'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unexpected token 'commonScripts.BuildNumber']]'' in expression or statement.
在写这个问题的过程中,我偶然发现了一个解决方案。作业输出变量被写入环境变量,因此我们实际上可以通过这种方式访问它们。
$DownloadJobName = 'Download${{parameters.ArtifactName}}'
$BuildNumber = get-childitem env: | where name -eq "$DownloadJobName`_BuildNumber" | select -ExpandProperty Value
Write-Host "$DownloadJobName.BuildNumber=$BuildNumber"
关键是你必须处理字符的转义方式,例如“。”变成“_”,但这非常微不足道。
从 YAML 示例中,您正在 Pipeline 中使用嵌套变量。
使用格式时我可以重现相同的问题:
'$[ variables['${{parameters.ArtifactName}}.BuildNumber']]'
我建议您可以使用以下格式在Pipeline中使用嵌套变量:
$BuildNumber = '$(Download${{parameters.ArtifactName}}.BuildNumber)'
例如:
- task: Powershell@2
displayName: '${{parameters.ArtifactName}} Artifact Version Print'
inputs:
targetType: inline
script: |
$BuildNumber = '$(Download${{parameters.ArtifactName}}.BuildNumber)'
Write-Host "${{parameters.ArtifactName}}.BuildNumber=$BuildNumber"
结果: