对于发布管道,我想通过REST API(或任务)从构建工件中获取消耗的管道工件。
背景: 我在azure devops中有一个发布管道,它消耗了一个主要工件(即安装程序)。安装程序在其中打包了特定版本的几个二进制文件。在发布管道中,我想找到适合安装程序中打包的二进制文件的系统测试。这些系统测试与二进制文件一起作为工件发布。
我有以下几个点,它们是一个接一个地触发的:
问题: 发布管道应使用与构建设置所使用的相同构建(BinaryPipeline)的工件“系统测试”。
我试图用REST API解决问题,但是
https://dev.azure.com/<company>/<project>/_apis/build/builds/<buildid>/artifacts
仅返回产生的工件,而不返回消耗的工件。
我看到以下解决方法,但我仍然不喜欢它们:
如何通过Azure Devops中的REST API从构建中获取已消耗管道工件?
答案 0 :(得分:1)
根据我的请求Trigger release with defined artifacts从Visual Studio社区获得(私人)帮助后,事实证明,没有内置且舒适的方法来获取消耗的工件。解决方案4)(见上文)是VSCommunity的一项建议。
我现在正在生产中的解决方案: 在发布版本(SetupPipeline)上:
创建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")
将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脚本下载的):
以下一些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任务下载工件时,可以指定要下载的构建版本: