PowerShell-skript för att anpassa pipelines
Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019
Den här artikeln beskriver hur du kan gå längre än att kompilera och testa kod och använda PowerShell-skript för att lägga till affärslogik i pipelines. Azure Pipelines PowerShell-aktiviteten kör PowerShell-skript i dina pipelines. Du kan använda PowerShell för att komma åt Rest-API:et för Azure DevOps, arbeta med Azure DevOps-arbetsobjekt och testhantering eller anropa andra tjänster efter behov.
Du kan använda variabler i dina PowerShell-skript, inklusive användardefinierade variabler som du anger själv. Du kan också använda fördefinierade variabler som är tillgängliga i alla Azure Pipelines och ange utdatavariabler för flera jobb för att göra variabler tillgängliga för framtida jobb. Mer information finns i Definiera variabler.
Du kan använda namngivna parametrar i dina PowerShell-skript. Andra typer av parametrar, till exempel växelparametrar, stöds inte och orsakar fel om du försöker använda dem. Mer information finns i Deklarera cmdlet-parametrar.
Lägga till ett PowerShell-skript i en pipeline
Versionen använder den aktiva grenen av koden. Om pipelinekörningen använder grenen main
använder skriptet även grenen main
.
Du kan köra Windows PowerShell på en Windows-byggagent eller köra PowerShell Core på valfri plattform. Syntaxen för att inkludera PowerShell Core skiljer sig något från Windows PowerShell.
När du har push-överfört PowerShell-skriptet till lagringsplatsen lägger du till ett pwsh
eller powershell
ett steg i pipelinen. Nyckelorden pwsh
och powershell
nyckelorden är båda genvägar för att köra PowerShell-aktiviteten.
Exempel för PowerShell Core:
steps:
- pwsh: ./my-script.ps1
Exempel för Windows PowerShell:
steps:
- powershell: .\my-script.ps1
Exempelskript för att tillämpa version på sammansättningar
Exempelskriptet i det här avsnittet tillämpar en version på sammansättningsegenskapsfiler. För att skriptet ska kunna köras måste det definierade versionsnummerformatet ha fyra punkter, till exempel $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
.
Kommentar
Versionsnummer kallas även för körningsnummer.
Anpassa ditt versionsnummer i YAML-pipelinen med hjälp name
av egenskapen . Egenskapen name
måste vara på rotnivån för pipelinen. Mer information finns i Konfigurera körnings- eller byggnummer.
name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
Följande PowerShell-exempelskript tillämpar en version på sammansättningar. Om ditt definierade versionsnummerformat $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
till exempel genererar versionsnummer Build HelloWorld_2024.07.19.1
tillämpar skriptet version 2024.07.19.1
på dina sammansättningar.
# Enable -Verbose option
[CmdletBinding()]
# Regular expression pattern to find the version in the build number
$VersionRegex = "\d+\.\d+\.\d+\.\d+"
# If not running on a build server, remind user to set environment variables for debugging
if(-not ($Env:BUILD_SOURCESDIRECTORY -and $Env:BUILD_BUILDNUMBER))
{
Write-Error "You must set the following environment variables"
Write-Error "to test this script interactively."
Write-Host '$Env:BUILD_SOURCESDIRECTORY - For example, enter something like:'
Write-Host '$Env:BUILD_SOURCESDIRECTORY = "C:\code\Fabrikam\HelloWorld"'
Write-Host '$Env:BUILD_BUILDNUMBER - For example, enter something like:'
Write-Host '$Env:BUILD_BUILDNUMBER = "Build HelloWorld_0000.00.00.0"'
exit 1
}
# Make sure path to source code directory is available
if (-not $Env:BUILD_SOURCESDIRECTORY)
{
Write-Error ("BUILD_SOURCESDIRECTORY environment variable is missing.")
exit 1
}
elseif (-not (Test-Path $Env:BUILD_SOURCESDIRECTORY))
{
Write-Error "BUILD_SOURCESDIRECTORY does not exist: $Env:BUILD_SOURCESDIRECTORY"
exit 1
}
Write-Verbose "BUILD_SOURCESDIRECTORY: $Env:BUILD_SOURCESDIRECTORY"
# Make sure there's a build number
if (-not $Env:BUILD_BUILDNUMBER)
{
Write-Error ("BUILD_BUILDNUMBER environment variable is missing.")
exit 1
}
Write-Verbose "BUILD_BUILDNUMBER: $Env:BUILD_BUILDNUMBER"
# Get and validate the version data
$VersionData = [regex]::matches($Env:BUILD_BUILDNUMBER,$VersionRegex)
switch($VersionData.Count)
{
0
{
Write-Error "Couldn't find version number data in BUILD_BUILDNUMBER."
exit 1
}
1 {}
default
{
Write-Warning "Found more than one instance of version data in BUILD_BUILDNUMBER."
Write-Warning "Assuming first instance is version."
}
}
$NewVersion = $VersionData[0]
Write-Verbose "Version: $NewVersion"
# Apply the version to the assembly property files
$files = gci $Env:BUILD_SOURCESDIRECTORY -recurse -include "*Properties*","My Project" |
?{ $_.PSIsContainer } |
foreach { gci -Path $_.FullName -Recurse -include AssemblyInfo.* }
if($files)
{
Write-Verbose "Applying $NewVersion to $($files.count) files."
foreach ($file in $files) {
$filecontent = Get-Content($file)
attrib $file -r
$filecontent -replace $VersionRegex, $NewVersion | Out-File $file
Write-Verbose "$file.FullName - version applied"
}
}
else
{
Write-Warning "Found no files."
}
Exempelskript för att komma åt REST-API:et
I det här exemplet används variabeln SYSTEM_ACCESSTOKEN
för att komma åt REST-API:et för Azure Pipelines.
Du kan använda $env:SYSTEM_ACCESSTOKEN
i ett infogat skript i YAML-pipelinen för att komma åt OAuth-token.
Följande infogade PowerShell-skript i en YAML-pipeline använder OAuth-token för att komma åt REST-API:et för Azure Pipelines som hämtar pipelinedefinitionen.
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/definitions/$($env:SYSTEM_DEFINITIONID)?api-version=5.0"
Write-Host "URL: $url"
$pipeline = Invoke-RestMethod -Uri $url -Headers @{
Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)