通过REST API从Azure Devops构建中获取消耗的管道工件

时间:2020-10-28 12:32:45

标签: azure rest azure-devops azure-pipelines azure-pipelines-release-pipeline

对于发布管道,我想通过REST API(或任务)从构建工件中获取消耗的管道工件。

背景: 我在azure devops中有一个发布管道,它消耗了一个主要工件(即安装程序)。安装程序在其中打包了特定版本的几个二进制文件。在发布管道中,我想找到适合安装程序中打包的二进制文件的系统测试。这些系统测试与二进制文件一起作为工件发布。

我有以下几个点,它们是一个接一个地触发的:

  1. BinaryPipeline ->发布工件:“二进制文件” “系统测试”
  2. SetupPipeline ->使用BinaryPipeline中的工件“ binaries” ,发布工件:“ setup”
  3. 发布管道->从设置管线消耗工件“设置” ,从BinaryPipeline消耗“系统测试”

问题: 发布管道应使用与构建设置所使用的相同构建(BinaryPipeline)的工件“系统测试”。

我试图用REST API解决问题,但是

https://dev.azure.com/<company>/<project>/_apis/build/builds/<buildid>/artifacts

仅返回产生的工件,而不返回消耗的工件。

我看到以下解决方法,但我仍然不喜欢它们:

  1. 发布包含版本信息的文本文件 ->最佳解决方法。我不喜欢我必须依赖工件中的特殊文件。
  2. 设置构建属性(尽管我没有发现如何在构建过程中设置属性) ->没找到方法
  3. 在我的设置版本中重新发布系统测试 ->复制伪影的错误提示
  4. 解析日志 ->不好,因为我必须依靠任务的标题名称

如何通过Azure Devops中的REST API从构建中获取已消耗管道工件?

2 个答案:

答案 0 :(得分:1)

根据我的请求Trigger release with defined artifacts从Visual Studio社区获得(私人)帮助后,事实证明,没有内置且舒适的方法来获取消耗的工件。解决方案4)(见上文)是VSCommunity的一项建议。

我现在正在生产中的解决方案: 在发布版本(SetupPipeline)上:

  1. 创建BuildInfo.XML文件,其中包含消耗的版本信息

    [xml]$Doc = New-Object System.Xml.XmlDocument
    $dec = $Doc.CreateXmlDeclaration("1.0","UTF-8",$null)
    $doc.AppendChild($dec)
    $root = $doc.CreateNode("element","ConsumedBuilds",$null)
    $build = $doc.CreateNode("element", "Build", $null)
    $build.SetAttribute("BuildVersion", "$(RESOURCES.PIPELINE.build.RUNNAME)")
    $build.SetAttribute("BuildId", "$(RESOURCES.PIPELINE.build.RUNID)")
    $root.AppendChild($build)
    $Doc.AppendChild($root)
    $doc.Save("$BuildInfoXml")
    
  2. 将BuildInfo.XML作为单独的工件发布(以便您可以单独下载)

在发布管道上:

  • 使用BuildInfo.xml下载工件

  • 在Powershell中解析XML

    $ovf = New-Object System.XML.XMLDocument
    $ovf.Load("$($BuildInfoXmlPath.FullName)")
    $build= $ovf.ConsumedBuilds.Build | Where { ... }
    
  • 通过REST和powershell下载工件版本(因为无法对Download Pipeline Artifact任务进行参数设置)

    $artifactUri = ("https://dev.azure.com/{organization}/{0}/_apis/build/builds/{1}/artifacts?artifactName={2}&api-version=4.1" -f $azureProjectName, $buildId, $artifactName)
    $artifact = Invoke-RestMethod -Uri "$artifactUri"  -Method get -Headers $AzureDevOpsAuthenicationHeader -ContentType 'application/zip' 
    $downloadUrl = "$($artifact.resource.downloadUrl)"
    $wc = New-Object System.Net.WebClient
    $wc.Headers.Add('Authorization','Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($accessToken)")) )
    $file = $wc.DownloadFile("$downloadUrl", $outputFile)
    

由于后者不是很透明,因为下载的工件不会像在发布管道中显示的那样显示出来(它是通过powershell脚本下载的):

  • 创建一个由SetupPipeline触发的触发器管道,等待片刻,然后使用XML中的工件在ReleasePipeline中将新版本排队。注意:您无法从未选择和(完成)完成的构建中触发发布管道。

以下一些Powershell代码可触发发布管道:

  $AzureDevOpsAuthenicationHeader = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($accessToken)")) }
  $createReleaseBody = 
  @"
  {
      "definitionId": $(ReleasePipelineDefinitionId),
      "description": "...",
      "artifacts": [
      {
            "alias": "buildName",
            "instanceReference": {
            "id": "$($build.BuildId)",
            "name": "$($build.BuildVersion)"
            }
        },
      {
         ...
      }
      ],
     "isDraft": false,
     "reason": "none",
     "manualEnvironments": null
  }
  "@
  Invoke-RestMethod -Uri "https://vsrm.dev.azure.com/{org}/{project}/_apis/release/releases?api-version=5.0" -Method post -Headers $AzureDevOpsAuthenicationHeader -Body $createReleaseBody -ContentType 'application/json' 

答案 1 :(得分:0)

使用DownloadBuildArtifacts任务下载工件时,可以指定要下载的构建版本:

enter image description here