Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
Den här artikeln beskriver hur PowerShell-skript kan lägga till affärslogik i Azure Pipelines. PowerShell v2-aktiviteten (PowerShell@2) kör PowerShell-skript som kan komma åt Rest-API:et för Azure DevOps, arbeta med Azure DevOps-arbetsobjekt, hantera tester eller anropa andra tjänster.
Du kan använda fördefinierade variabler eller användardefinierade variabler i PowerShell-skript . Du kan också ange utdatavariabler för flera jobb för att göra variabler tillgängliga för andra jobb. Mer information finns i Definiera variabler.
Du kan också använda namngivna parametrar i dina PowerShell-skript. Andra typer av parametrar, till exempel växelparametrar, stöds inte. Mer information finns i Deklarera cmdlet-parametrar.
PowerShell-skriptaktivitet
Om du vill använda ett PowerShell-skript lägger du till uppgiften PowerShell v2 (PowerShell@2) i pipelinen och anger sedan ett infogat PowerShell-skript eller anropar en PowerShell-skriptfil.
Bygget använder den aktiva grenen av din kod. Om pipelinekörningen använder grenen main av koden använder skriptet även grenen main .
I följande exempel används targetType: 'inline' och läggs till ett infogat skript i egenskapen script.
steps:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: Write-Host "Hello world!"
I följande exempel läggs PowerShell@2 steget till i en YAML-pipeline. Koden anropar en PowerShell-skriptfil med namnet test.ps1 som finns i roten på lagringsplatsen.
steps:
- task: PowerShell@2
inputs:
targetType: 'filePath'
filePath: 'test.ps1'
Kommentar
Som standard PowerShell@2 använder aktiviteten Windows PowerShell 5.1 för Windows-agenter och PowerShell 7.x för Linux/macOS-agenter. Om du vill använda PowerShell 7.x på Windows-agenter måste du ha PowerShell 7.x installerat och lägga till parametern pwsh inställd på true. Microsoft-värdbaserade agenter har PowerShell 7.x installerat som standard.
Du kan också lägga till ett pwsh- eller powershell-steg i YAML-pipelinen som en genväg för PowerShell@2-steget. Genvägen pwsh kör PowerShell 7.x på macOS, Linux eller Windows. Genvägen powershell kör Windows PowerShell 5.1 på Windows eller PowerShell 7.x i Linux och macOS.
steps:
- pwsh: test.ps1
steps:
- pwsh: Write-Host Hello
Exempelskript för att tillämpa version på sammansättningar
Följande PowerShell-skript tillämpar en version baserat på versionsnummer för sammansättningar. Om definitionen $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) av versionsnummer till exempel genererar versionsnumret Build HelloWorld_2024.07.19.1 tillämpas version 2024.07.19.1 på dina sammansättningar.
För att det här skriptet ska kunna köras måste versionsnummerformatet ha fyra segment. Mer information finns i Kör eller skapa nummer.
Kommentar
Versionsnummer kallas även för körningsnummer.
Anpassa din versionsnummerdefinition i YAML-pipelinen med hjälp av
name-egenskapen på pipelinens rotnivå.name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)Spara följande PowerShell-skript som en fil i roten på ditt repository.
Lägg till ett
PowerShell@2aktivitetssteg ellerpwshenpowershellgenväg till din pipeline och anropa filsökvägen för PowerShell-skriptfilen i förhållande till arbetskatalogen.
PowerShell-skript för att tillämpa version på 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
Följande PowerShell-skript använder miljövariabler för att komma åt REST-API:et för Azure Pipelines och hämta pipelinedefinitionen.
I YAML-pipelinen kan du definiera miljövariabeln $env:SYSTEM_ACCESSTOKEN i en PowerShell@2 aktivitet och använda den i det infogade skriptet för att hämta OAuth-token för att få åtkomst till REST-API:et.
- 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)