|
# This is an updated and tweaked version of a script designed to find if changes |
|
# have occurred since the last build. We've moved to the latest API and tweaked to spot changes in a file. |
|
# Original Source: http://workingwithdevs.com/azure-devops-services-api-powershell-hosted-build-agents/ |
|
|
|
param( |
|
# The variable in AZDO to set when changes are found |
|
[string]$outputVariableName = "changesFound", |
|
# This can be 'containers/IMAGETAG.txt' or '.*/IMAGETAG.txt'. Expression is passed to powershell '-match' so valid regex NOT minimatch/glob |
|
[string]$fileMatchExpression = $env:FILE_TO_CHECK, |
|
# The build definition ID. In this case it's 20, look at the URL when editing a build to find it. |
|
[string]$buildDefinitionId = "20", |
|
[string]$branch = "refs/heads/main" |
|
) |
|
|
|
# Configuring this PS script to use the Azure DevOps Service Rest API |
|
# Attempting to follow steps at: http://donovanbrown.com/post/how-to-call-team-services-rest-api-from-powershell |
|
|
|
$pat = "Bearer $env:System_AccessToken" |
|
|
|
# Set $env:LocalTest to test things out locally |
|
if ($env:LocalTest) { |
|
# When testing locally use the below to authenticate |
|
$pat = $env:PAT_TOKEN # <- set this env to your pat token |
|
$pat = "Basic " + [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(":$pat")) |
|
$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI = "https://dev.azure.com/{ORGNAME}/" |
|
$env:SYSTEM_TEAMPROJECTID = "{PROJECT NAME}" |
|
$env:BUILD_BUILDID = 1163 # <- pick the build you'd like to pretend to be |
|
} |
|
|
|
Write-Host $env:System_AccessToken |
|
|
|
# Setting the script to authenticate using the system access token on the Azure DevOps Build Agent |
|
# Note: Remember to set the agent job to "Allow scripts to access OAuth token" (under "Additional options") |
|
|
|
# FINDING THE PREVIOUS SUCCESSFUL BUILD |
|
# Note: Combining double quotes and single quotes below because double quotes allow variable substitution |
|
# (desired in first part) but single quotes do not (not desired in second part) |
|
$env:SYSTEM_TEAMPROJECTID = [uri]::EscapeUriString($env:SYSTEM_TEAMPROJECTID) |
|
$lastGreenBuildUrl = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/builds?branchName=$branch&definitions=$buildDefinitionId&queryOrder=finishTimeDescending&resultFilter=succeeded&api-version=6.0" |
|
|
|
Write-Host "url: $lastGreenBuildUrl" |
|
$data = Invoke-RestMethod –Uri "$lastGreenBuildUrl" –Headers @{Authorization = $pat} |
|
Write-Host "Raw data returned from Green Build API call: $data" |
|
$lastGreenBuild = $data.value.id | Select-Object –First 1 |
|
Write-Host "Last successfult build was $lastGreenBuild" |
|
|
|
# FINDING ALL COMMITS SINCE THE LAST SUCCESSFUL COMMIT |
|
$from = $lastGreenBuild |
|
$to = $env:BUILD_BUILDID |
|
|
|
Write-Host "from: $from" |
|
Write-Host "to: $to" |
|
$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/changes?fromBuildId=$from&toBuildId=$to&api-version=5.0-preview.2" |
|
Write-Host "url: $url" |
|
|
|
$commits = Invoke-RestMethod –Uri $url –Headers @{Authorization = $pat } |
|
|
|
Write-Host "Raw data returned from API call: $commits" |
|
|
|
# saving all commit ids into a list |
|
$commitHashes = @() |
|
|
|
foreach ($id in $commits.value) { |
|
$rawData = Get-Member –inputObject $id –name "id" | Out-String |
|
|
|
# $rawData is in format "string id=<hash> ". We need to clean it up. |
|
$label, $hash = $rawData.Split("=") |
|
$hash = $hash.trim() |
|
|
|
# Adding $hash to $commitHashes |
|
$commitHashes += $hash |
|
} |
|
|
|
Write-Host "Commit hashes associated with this build:" |
|
foreach ($hash in $commitHashes) { |
|
Write-Host $hash |
|
} |
|
|
|
# We can use this function to check if a given directory has been updated since last build |
|
$lastCommit = $commitHashes | Select-Object –Last 1 |
|
$currentCommit = git rev–parse HEAD |
|
$currentCommit = $currentCommit.Trim() |
|
|
|
Write-Host "Finding files changed between $lastCommit and $currentCommit" |
|
|
|
# Show diff between |
|
# See: https://stackoverflow.com/questions/3368590/show-diff-between-commits |
|
$changedFiles = git diff $lastCommit^..$currentCommit —name–only |
|
|
|
Write-Host "Changed files" |
|
$changedFiles |
|
|
|
|
|
# Check if the file we're interested in changed |
|
$relevantChanges = $changedFiles -match $fileMatchExpression |
|
if ($relevantChanges) { |
|
Write-Host ">>>>> CHANGED FOUND in file $fileMatchExpression since last successful build $from. Build var $outputVariableName set to 'true'" |
|
# Updating the build variables accordingly |
|
Write-Output ("##vso[task.setvariable variable=$outputVariableName;]true") |
|
} else { |
|
Write-Host "No relevant changes found.. variable set to $changesFound" |
|
} |