quickstarts/microsoft.devcenter/devbox-ready-to-code-image/tools/run-image-build.ps1 (80 lines of code) (raw):

$ErrorActionPreference = "Stop" Set-StrictMode -Version Latest $ProgressPreference = 'SilentlyContinue' $imageTemplateName = ${env:imageTemplateName} function Log([string] $message, [switch] $asError) { $formattedTime = Get-Date -Format "yyyy/MM/dd HH:mm:ss.ff" $formattedMessage = "[$formattedTime $imageTemplateName] $message" if ($asError) { Write-Error $formattedMessage } else { Write-Host $formattedMessage } } RunWithRetries { Connect-AzAccount -Identity | Out-Null } RunWithRetries { Install-Module -Name Az.ImageBuilder -AllowPrerelease -Force -Verbose } $preBuildPauseSeconds = 30 Log "=== Pausing for $preBuildPauseSeconds seconds for the template and prerequisites to complete initialization" Start-Sleep -Seconds $preBuildPauseSeconds Log "=== Starting the image build" RunWithRetries { $info = $null try { $info = Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName ${env:resourceGroupName} } catch { Log "$_`n=== The template might still be initializing - wait a bit more before starting the build" Start-Sleep -Seconds 60 } if ($info -and $info.LastRunStatusRunState) { Log "=== Already started" } else { Invoke-AzResourceAction -ResourceName "$imageTemplateName" -ResourceGroupName "${env:resourceGroupName}" -ResourceType "Microsoft.VirtualMachineImages/imageTemplates" -ApiVersion "2020-02-14" -Action Run -Force } } Log "=== Waiting for the image build to complete" # https://learn.microsoft.com/en-us/dotnet/api/microsoft.azure.powershell.cmdlets.imagebuilder.support.runstate?view=az-ps-latest $global:status = 'UNKNOWN' while ($global:status -ne 'Succeeded' -and $global:status -ne 'Failed' -and $global:status -ne 'Canceled') { Start-Sleep -Seconds 15 RunWithRetries { $global:info = Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName ${env:resourceGroupName} $global:status = $info.LastRunStatusRunState } } $buildStatusShort = "status '$global:status', message '$($global:info.LastRunStatusMessage)'" Log "=== Image build completed with $buildStatusShort" $ignoreBuildFailure = [bool]::Parse("${env:ignoreBuildFailure}") if ( (!$ignoreBuildFailure) -and ($global:status -ne 'Succeeded')) { Start-Sleep -Seconds 15 # Appears to help with the script output being captured in full Log -asError "!!! [ERROR] Image build failed with $buildStatusShort" } $printCustomizationLogLastLines = [int]::Parse("${env:printCustomizationLogLastLines}") if ($printCustomizationLogLastLines -ne 0) { $stagingResourceGroupName = ${env:stagingResourceGroupName} $logsFile = 'customization.log' Log "=== Looking for storage account in staging RG '$stagingResourceGroupName'" $stagingStorageAccountName = (Get-AzResource -ResourceGroupName $stagingResourceGroupName -ResourceType "Microsoft.Storage/storageAccounts")[0].Name $stagingStorageAccountKey = $(Get-AzStorageAccountKey -StorageAccountName $stagingStorageAccountName -ResourceGroupName $stagingResourceGroupName)[0].value $ctx = New-AzStorageContext -StorageAccountName $stagingStorageAccountName -StorageAccountKey $stagingStorageAccountKey $logsBlob = Get-AzStorageBlob -Context $ctx -Container packerlogs | Where-Object { $_.Name -like "*/$logsFile" } if ($logsBlob) { Log "=== Downloading $logsFile from storage account '$stagingStorageAccountName'" Get-AzStorageBlobContent -Context $ctx -CloudBlob $logsBlob.ICloudBlob -Destination $logsFile -Force | Format-List if ($printCustomizationLogLastLines -gt 0) { Log "=== Last $printCustomizationLogLastLines lines of $logsFile :`n" Log "$(Get-Content $logsFile -Tail $printCustomizationLogLastLines | Out-String)" } else { Log "=== Content of $logsFile :`n" Log "$(Get-Content $logsFile | Out-String)" } } else { Log "Could not find customization.log in storage account: $stagingStorageAccountName" } } Log "=== DONE" Start-Sleep -Seconds 15 # Appears to help with the script output being captured in full