访问作业的输出变量,其名称在同一作业的azure pipeline中动态确定

问题描述 投票:0回答:2

我正在创建一个模板来从另一个管道下载工件。我计划在同一项工作中多次使用此模板,例如需要 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.
azure-devops azure-pipelines
2个回答
0
投票

在写这个问题的过程中,我偶然发现了一个解决方案。作业输出变量被写入环境变量,因此我们实际上可以通过这种方式访问它们。

        $DownloadJobName = 'Download${{parameters.ArtifactName}}'
        $BuildNumber = get-childitem env: | where name -eq "$DownloadJobName`_BuildNumber" | select -ExpandProperty Value
        Write-Host "$DownloadJobName.BuildNumber=$BuildNumber"

关键是你必须处理字符的转义方式,例如“。”变成“_”,但这非常微不足道。


0
投票

从 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"

结果:

© www.soinside.com 2019 - 2024. All rights reserved.