首页 > 解决方案 > 获取从另一个管道下载的最后一个工件的值

问题描述

我创建了一个任务来从另一个管道下载最新的工件,并依次识别文件以通过命令行进行静默安装。

 - task: DownloadPipelineArtifact@2
            inputs:
              source: 'specific'
              project: 'TestApp'
              pipeline: 'TestApp'
              runVersion: 'latest'
              branchName: 'refs/heads/master'
              allowPartiallySucceededBuilds: true
              patterns: '**/*.msi'
              downloadPath: $(Build.ArtifactStagingDirectory)
              
          - task: CmdLine@2
            inputs:
                  script: |
                    cd $(Build.ArtifactStagingDirectory)/TestApp-20201015.2
                    TestApp.1-setup.msi /s /v     

是否存在存储从管道生成的最后一个工件的名称的变量?像这样:

- task: CmdLine@2
            inputs:
                  script: |
                    cd $(Build.ArtifactStagingDirectory)/$(latestArtifact)
                    $(latestInstaller).msi /s /v 

我尝试使用 $(Build.DefinitionName) 或 TestApp-$(Build.BuildNumber),但它不起作用。我现在道歉,因为我是 Azure 的初学者,我无法理解管道的工作原理。

标签: azureazure-devopsazure-functions

解决方案


恐怕没有开箱即用的变量可以代表最新下载的工件。

但是您可以在管道中创建一个变量来获取 Artifacts 名称。

根据我的测试,当你使用 . 时Download Pipeline Artifacts task,管道会生成一个环境变量:$(DOWNLOADPIPELINEARTIFACT.BUILDNUMBER).

然后您可以使用 Powershell 运行 Rest API 来获取工件名称。

这是我的示例:

steps:
- powershell: |
   $token = "PAT"
   
   $url=" https://dev.azure.com/{Organization Name}/{Project Name}/_apis/build/builds/$(DOWNLOADPIPELINEARTIFACT.BUILDNUMBER)/artifacts?api-version=6.0"
   
   $token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
   
   
   
   $response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Get -ContentType application/json
   
   $latestvalue = $response.value.name
   
   echo $latestvalue
   
   echo "##vso[task.setvariable variable=latest]$latestvalue"
  displayName: 'PowerShell Script'

然后你可以创建一个变量名:$(latest). 它的值是最新工件的名称(例如TestApp-20201015.2)。

您可以在下一个任务中使用该变量。

cd $(Build.ArtifactStagingDirectory)/$(latest)

TestApp.1-setup.msi /s /v 

对于最新的安装程序名称

您可以硬编码此值。从.msi文件的名字看,似乎和管道的变量没有关系,所以不确定是否可以创建一个变量来表示。


推荐阅读