Powershell для запуска сборки в DevOps Azure - PullRequest
0 голосов
/ 01 апреля 2019

Мы только что перенесли наш код с 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, но вариантов много, а примеров нет. Я также видел этот пост: Как ОЧЕРЕДИТЬ новую сборку, используя VSTS REST API , но решение там не ждет завершения сборки и использует API 4.1 - не уверен, действительно ли это для DevOps? Я уже настроил определения сборки в DevOps.

URL-адрес, по которому конфигурация настроена в DevOps, имеет следующий формат: DevOps URL

Все, что мне нужно, это поставить в очередь сборку из скрипта powershell и дождаться завершения сборки, то есть эквивалент моего сценария TFSBuild, описанного выше. Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Я закончил тем, что делал это, и это работает:

Function Queue-Build ($definitionName, $branchName)
{
    Write-Host "Building $definitionName - $branchName"
    $build = (vsts build queue --project [project_name] --instance [server_name] --definition-name $definitionName --branch $branchName) | Out-String | ConvertFrom-Json

    #wait for the build to complete
    while ($build.status -ne "completed") {
        Start-Sleep -s 5
        $build = (vsts build show --id $build.id --instance [server_name] --project [project_name]) | Out-String | ConvertFrom-Json
        #Write-Host $build.status
    }
}

vsts login --token PAT_created_in_DevOps

$sourceBranch = [branch_name]
Queue-Build [build_definition_name] $sourceBranch 
1 голос
/ 02 апреля 2019

Вы можете использовать следующий скрипт, который запускает новую сборку и ожидает завершения сборки.

$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": '+ $build.id + '}, reason: "Manual", priority: "Normal"}' # 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 

   $allBuilds = (Invoke-RestMethod -Uri $buildsURI -Method get -UseDefaultCredentials).value # get all builds

   $buildID = ($allBuilds | where {$_.definition.name -eq $build.name })[0].id # get first build id 

   $buildInfo =  (Invoke-RestMethod -Uri "$buildLog/$buildID"  -UseDefaultCredentials -Method get)  # get build info by build ID
   while($buildInfo.status -eq "inProgress") # keep checking till build completed
   {
      Write-Output "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.result)" # print build result
}

Имейте в виду, что я работаю с TFS 2017, а не с API-интерфейсом REST API Azure DevOps Services 5.0. Поэтому могут потребоваться некоторые небольшие изменения.

...