Last active
January 29, 2020 19:25
-
-
Save kevinhillinger/f5faaf0421f251b2660e0a66861b5821 to your computer and use it in GitHub Desktop.
Azure DevOps REST API usage from Azure DevOps
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Setting the script to authenticate using the system access token on the Azure DevOps Build Agent | |
# Set the agent job to "Allow scripts to access OAuth token" in the build | |
$pat = "Bearer $env:System_AccessToken" | |
# this will be the correlation value used to collect all the builds | |
$sourceVersion = $env:BUILD_SOURCEVERSION | |
Write-Output ("##vso[task.setvariable variable=sourceVersion;]$sourceVersion") | |
$organizationName = ([System.Uri]$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI).Host.split('.')[0] | |
$baseUrl = "https://dev.azure.com/$organizationName/$env:SYSTEM_TEAMPROJECTID" | |
# build reason filter. Use 'pullRequest' to further refine if possible | |
$reasonFilter = 'all' | |
$buildsUrl = "$baseUrl/_apis/build/builds?queryOrder=startTimeDescending&reasonFilter=$reasonFilter&statusFilter=all&properties=id,sourceBranch,sourceVersion&`$top=10&api-version=5.1" | |
Write-Output "builds url: $buildsUrl" | |
$data = Invoke-RestMethod -Uri "$buildsUrl" -Headers @{Authorization = $pat} | |
if ($env:SYSTEM_DEBUG -eq $true) { | |
Write-Output "Response: $($data.count)" | |
ConvertTo-Json $data.value | |
} | |
# get all the build Ids | |
$buildIds = $ids = $($data.value | Where-Object { ($_.sourceVersion -eq $sourceVersion) -and ($_.id -ne $env:BUILD_BUILDID) } | Select-Object -ExpandProperty id) | |
$buildIdsFilter = $buildIds -join "," | |
if ([boolean]$env:SYSTEM_DEBUG) { | |
Write-Output "Build IDs:" | |
$buildIdsFilter | |
} | |
Write-Output ("##vso[task.setvariable variable=buildIds;]$buildIdsFilter") | |
# use the list of ids to then perform a filter status of completed. Once the number of builds return to match the count in buildIds, we can continue | |
$wereThereAnyFailures = $false | |
$areAllBuildsInStatusComplete = $false | |
$pollingInterval = 10 | |
$maxRetries = 5 | |
$retryCount = 0 | |
while ($areAllBuildsInStatusComplete -eq $false) { | |
$buildsUrl = "$baseUrl/_apis/build/builds?buildIds=$buildIdsFilter&api-version=5.1" | |
$data = Invoke-RestMethod -Uri "$buildsUrl" -Headers @{Authorization = $pat} | |
# if any of the builds failed, we have to stop | |
foreach($build in $data.value) { | |
if (($build.status -eq 'failed') -or ($build.status -eq 'cancelled')) { | |
Write-Output "Build $($build.id) failed or was cancelled." | |
$wereThereAnyFailures = $true | |
break | |
} | |
} | |
# if all builds completed, we're good | |
$areAllBuildsInStatusComplete = ($buildIds.Count -eq $($data.value | Where-Object { $_.status -eq 'completed' } ).Count) | |
if ($areAllBuildsInStatusComplete) { | |
Write-Output "All builds are completed." | |
break | |
} | |
if ($retryCount -eq $maxRetries) { | |
Write-Output "Max retry count reached. Cancelling" | |
break | |
} | |
Start-Sleep -s $pollingInterval | |
$retryCount += 1 | |
} | |
if ($wereThereAnyFailures) { | |
Write-Output "there was one or more builds that failed. Cannot proceed with release." | |
exit 1 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$pat = "Bearer $env:System_AccessToken" | |
$organizationName = ([System.Uri]$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI).Host.split('.')[0] | |
$projectName = "$($env:SYSTEM_TEAMPROJECTID)" | |
# this is a build variable you will need to create as releaseDefinitionId | |
$releaseDefinitionId = "$($env:releaseDefinitionId)" | |
$baseUrl = "https://dev.azure.com/$organizationName/$projectName" | |
$uri = "https://dev.azure.com/$organizationName/$projectName/_apis/release/releases?api-version=5.1" | |
$body = @{ | |
"definitionId" = $releaseDefinitionId; | |
"description" = "Creating Sample release"; | |
"artifacts" = @( | |
@{ | |
"alias": "Fabrikam.CI", | |
"instanceReference": { | |
"id" = "2"; | |
"name" = $null; | |
} | |
} | |
); | |
"isDraft" = $false; | |
"reason" = "continuousIntegration"; | |
"manualEnvironments" = $null; | |
} | |
# Invoke the REST call and capture the results | |
$result = Invoke-RestMethod -Uri $uri -Method POST -ContentType "application/json" -Body $body -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} | |
# This call should only provide a single result | |
if ($result.count -eq 0) | |
{ | |
throw "Unable to locate Release Definition for the Id $($releaseDefinitionId)" | |
} | |
$releaseId = $result.value[0].id | |
Write-Output "Release $releaseId created." |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Required setup
Build agent settings