Dela via


PowerShell-skript för pipelines

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.

  1. Anpassa din versionsnummerdefinition i YAML-pipelinen med hjälp av name-egenskapen på pipelinens rotnivå.

    name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
    
  2. Spara följande PowerShell-skript som en fil i roten på ditt repository.

  3. Lägg till ett PowerShell@2 aktivitetssteg eller pwsh en powershell genvä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)