Как проверить, был ли завершен предыдущий выпуск, прежде чем развертывать новый выпуск - PullRequest
2 голосов
/ 05 ноября 2019

В рамках нашего конвейера релизов у ​​нас есть задача (последняя задача) объединить ветвь релиза с мастер.

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

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

1 Ответ

0 голосов
/ 05 ноября 2019

Нельзя использовать API-интерфейс Invoke Rest с URL-адресом API DevOps Azure, поскольку для проверки состояния последнего выпуска необходимо проверить состояние среды (этапа), а для этого вам потребуется идентификатор выпуска (чтобы вы моглине могу знать, что это будет, и поместить его в URL-адрес остального API-интерфейса).

Но вы можете использовать PowerShell, чтобы проверить последний выпуск и, если это не удалось, просто пропустите этап.

Добавьте задачу PowerShell в свой выпуск, чтобы проверить последний выпуск:

$headers = @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"  }

# Replace {org} with your organization
# Replace {project} with your project
# Replace {defId} with your release definition id

$url = "https://vsrm.dev.azure.com/{org}/{project}/_apis/release/releases?definitionId={defId}&api-version=5.1"
$releases = Invoke-RestMethod -Method Get -Uri $url -Headers $headers -ContentType 'application/json'

$releaseUrl = "https://vsrm.dev.azure.com/{org}/{project}/_apis/release/releases/$($releases.value[1].id)?api-version=5.1"
$releaseInfo = Invoke-RestMethod -Method Get -Uri $releaseUrl -Headers $headers -ContentType 'application/json'

$releaseEvnriomentId =  $releaseInfo.environments.Where({ $_.name -eq 'THE STAGE NAME WHERE YOU DO MERGE' }).id

$envUrl = "https://vsrm.dev.azure.com/{org}/{project}/_apis/Release/releases/$($releases.value[1].id)/environments/$($releaseEvnriomentId)?api-version=5.1-preview.1"
$environment = Invoke-RestMethod -Method Get -Uri $envUrl -Headers $headers -ContentType 'application/json'

$envStatus = $environment.status

if($envStatus -ne "succeeded")
{
    Write-Error "Previous release not succeeded!"
}
else
{
    Write-Host "Previous release succeeded :)" 
}

В параметрах задания агента необходимо разрешить сценариям доступ к токену OAuth:

enter image description here

Функции Azure также поддерживают PowerShell, поэтому вы можете сделать это также с помощью шлюза функций Azure:

1) Создайте новую функцию Azure с кодом VS, как описано здесь .

2) В вашем файле run.ps1 замените код следующим кодом:

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

$defnitionId = $Request.Query.DefinitionId

# Generate PAT and put it in the {YOUR PAT}
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,"{YOUR PAT}")))
$headers = @{Authorization=("Basic {0}" -f $base64AuthInfo)}

# Replace {org} with your organization
# Replace {project} with your project

$url = "https://vsrm.dev.azure.com/{org}/{project}/_apis/release/releases?definitionId=$($defnitionId)&api-version=5.1"
$releases = Invoke-RestMethod -Method Get -Uri $url -Headers $headers -ContentType 'application/json'
Write-Debug $releases

$releaseUrl = "https://vsrm.dev.azure.com/{org}/{project}/_apis/release/releases/$($releases.value[1].id)?api-version=5.1"
$releaseInfo = Invoke-RestMethod -Method Get -Uri $releaseUrl -Headers $headers -ContentType 'application/json'
Write-Debug $releaseInfo

$releaseEvnriomentId =  $releaseInfo.environments.Where({ $_.name -eq 'THE STAGE NAME WHERE YOU DO MERGE' }).id

$envUrl = "https://vsrm.dev.azure.com/{org}/{project}/_apis/Release/releases/$($releases.value[1].id)/environments/$($releaseEvnriomentId)?api-version=5.1-preview.1"
$environment = Invoke-RestMethod -Method Get -Uri $envUrl -Headers $headers -ContentType 'application/json'
Write-Debug $environment

$envStatus = $environment.status
Write-Debug $envStatus

if($envStatus -ne "succeeded")
{
    $status = [HttpStatusCode]::BadRequest
    $body = "failed"
}
else
{
    $status = [HttpStatusCode]::OK
    $body = "success"
}


# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = $status
    Body = $body
})

3) Опубликуйте функцию в Azure.

4) Создайте в вашей версии шлюз Invoke Azure Function:

enter image description here

Другой вариант, взять приведенный выше код, преобразовать его в C # или другой язык и использоватьRest API, разверните на нем веб-сервер и используйте Invoke Rest API gate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...