Last active
December 25, 2024 03:44
-
-
Save lawrencegripper/6904804849fe609daa9d1d736aa405e8 to your computer and use it in GitHub Desktop.
Trigger Job on file changes in 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
- job: ciml | |
displayName: "Machine Learning CI" | |
pool: | |
vmImage: 'Ubuntu 20.04' | |
steps: | |
- task: PowerShell@2 | |
displayName: 'Run CI Task from make.ps1 in Devcontainer' | |
inputs: | |
targetType: 'inline' | |
script: 'Install-Module -Name PSake -Force && Invoke-psake ./make.ps1 ciml' | |
errorActionPreference: 'stop' | |
pwsh: true | |
workingDirectory: $(Build.SourcesDirectory) | |
- task: PowerShell@2 | |
displayName: 'Check if IMAGETAG.txt has changed since last build on main' | |
env: | |
System_AccessToken: $(System.AccessToken) | |
inputs: | |
targetType: 'filePath' | |
filePath: ./scripts/build_scripts/changesSinceLastBuild.ps1 | |
arguments: >- | |
-outputVariableName 'ML_IMAGE_TAG_CHANGED' | |
-fileMatchExpression 'containers/IMAGETAG.txt' | |
-branch 'refs/heads/main' | |
-buildDefinitionId '20' | |
errorActionPreference: 'stop' | |
pwsh: true | |
workingDirectory: $(Build.SourcesDirectory) | |
- task: AzurePowerShell@5 | |
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'), eq(variables.ML_IMAGE_TAG_CHANGED, 'true')) | |
displayName: 'Build ML Container and Push to ACR' | |
inputs: | |
azureSubscription: $(azure_connection) | |
ScriptType: 'inlineScript' | |
pwsh: true | |
inline: 'Install-Module -Name PSake -Force && Invoke-psake ./make.ps1 ciml-docker; exit (!$psake.build_success)' | |
errorActionPreference: 'stop' | |
workingDirectory: $(Build.SourcesDirectory) | |
azurePowerShellVersion: 'LatestVersion' |
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
# 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" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment