首页 > 解决方案 > Powershell 在 Azure DevOps 中触发构建

问题描述

我们刚刚将代码从现场 TFS 迁移到 Azure DevOps。

使用 TFS,我使用 powershell 脚本来构建和部署应用程序。部署部分仍然可以正常工作,但我不知道如何触发构建。我在旧 TFS 中使用的命令行是:

& "F:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\TFSBuild" start [repository URL] [project] "[build definition]" 

我知道 DevOps 有一个 REST API https://docs.microsoft.com/en-us/rest/api/azure/devops/build/builds/queue?view=azure-devops-rest-5.0但有很多选择那里没有例子。我还看到了这篇文章:How to QUEUE a new build using VSTS REST API但是那里的解决方案不会等待构建完成并且它使用 API 4.1 - 不确定它是否对 DevOps 有效?我已经在 DevOps 中配置了构建定义。

在 DevOps 中配置构建的 URL 采用以下格式:开发运维网址

我所需要的只是从一个 powershell 脚本排队构建并等待构建完成,即相当于我上面的 TFSBuild 脚本。有人可以帮忙吗?

标签: powershellazure-devops

解决方案


您可以使用以下脚本触发新构建并等待构建完成。

$tfsUrl = "http://{tfsServer}:{Port}/{Organization}/{Collection}/{Project}"
$buildsURI = $tfsUrl + '/_apis/build/builds?api-version=2.0'
$BuildDefsUrl = $tfsUrl + '/_apis/build/definitions?api-version=2.0'
$buildLog =  "$tfsUrl/_apis/build/builds"

$allbuildDefs = (Invoke-RestMethod -Uri ($BuildDefsUrl) -Method GET -UseDefaultCredentials).value | Where-Object {$_.name -eq "BuildName"} | select id,name ## get all relevant builds

foreach ($build in $allbuildDefs)
{
    $body = "
    { 
        definition: { 
            id: $($buildDef.id) 
        }, 
        reason: 'Manual', 
        priority: 'Normal',
        parameters: ""{
            'system.debug':'true'
        }""
    }" # build body
   
   Write-Output "Queueing $($build.name)" # print build name

   $buildOutput = Invoke-RestMethod -Method Post -Uri $buildsURI -UseDefaultCredentials -ContentType 'application/json' -Body $body -Verbose # trigger new build 
   $buildID = $buildOutput.id

   $buildInfo =  (Invoke-RestMethod -Uri "$buildLog/$buildID"  -UseDefaultCredentials -Method get)  # get build info by build ID
   while($buildInfo.status -eq "inProgress" -or $buildInfo.status -eq "notStarted") # keep checking till build completed
   {
      Write-Output "Build is $($buildInfo.status)... Sleep for 5 seconds.."
      Start-Sleep -Seconds 5 # Start sleep for 5 seconds
      $buildInfo =  (Invoke-RestMethod -Uri "$buildLog/$buildID"  -UseDefaultCredentials -Method get) ## get status 
   }

   Write-Output "Build Status : $($buildInfo.status)" # print build status
   Write-Output "Build Result : $($buildInfo.result)" # print build result
}

请注意,我使用的是 TFS 2017 而不是 Azure DevOps Services REST API 5.0。因此,您可能需要进行一些小改动。


推荐阅读