Share via


PowerShell-scripts voor het aanpassen van pijplijnen

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

In dit artikel wordt uitgelegd hoe u verder kunt gaan dan het compileren en testen van code en het gebruik van PowerShell-scripts om bedrijfslogica toe te voegen aan pijplijnen. De PowerShell-taak Azure Pipelines voert PowerShell-scripts uit in uw pijplijnen. U kunt PowerShell gebruiken voor toegang tot de Azure DevOps REST API, werken met Azure DevOps-werkitems en testbeheer, of andere services indien nodig aanroepen.

U kunt variabelen gebruiken in uw PowerShell-scripts, inclusief door de gebruiker gedefinieerde variabelen die u zelf instelt. U kunt ook vooraf gedefinieerde variabelen gebruiken die beschikbaar zijn in alle Azure Pipelines en uitvoervariabelen met meerdere taken instellen om variabelen beschikbaar te maken voor toekomstige taken. Zie Variabelen definiƫren voor meer informatie.

U kunt benoemde parameters gebruiken in uw PowerShell-scripts. Andere soorten parameters, zoals switchparameters, worden niet ondersteund en veroorzaken fouten als u ze probeert te gebruiken. Zie Cmdlet-parameters declareren voor meer informatie.

Een PowerShell-script toevoegen aan een pijplijn

De build maakt gebruik van de actieve vertakking van uw code. Als uw pijplijnuitvoering gebruikmaakt van de main vertakking, gebruikt uw script ook de main vertakking.

U kunt Windows PowerShell uitvoeren op een Windows-buildagent of PowerShell Core uitvoeren op elk platform. De syntaxis voor het opnemen van PowerShell Core is iets anders dan voor Windows PowerShell.

Nadat u uw PowerShell-script naar uw opslagplaats hebt gepusht, voegt u een pwsh of powershell meer stappen toe aan uw pijplijn. Het pwsh trefwoord en powershell de trefwoorden zijn beide sneltoetsen om de PowerShell-taak uit te voeren.

Voorbeeld voor PowerShell Core:

steps:
- pwsh: ./my-script.ps1

Voorbeeld voor Windows PowerShell:

steps:
- powershell: .\my-script.ps1

Voorbeeldscript voor het toepassen van versie op assembly's

Met het voorbeeldscript in deze sectie wordt een versie toegepast op assembly-eigenschapsbestanden. Het script kan alleen worden uitgevoerd als de gedefinieerde buildnummernotatie vier perioden heeft, bijvoorbeeld $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r).

Notitie

Buildnummer wordt ook wel run number genoemd.

Pas uw buildnummer in de YAML-pijplijn aan met behulp van de name eigenschap. De name eigenschap moet zich op het hoofdniveau van de pijplijn bevinden. Zie Run- of buildnummers configureren voor meer informatie.

name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)

Met het volgende PowerShell-voorbeeldscript wordt een versie toegepast op assembly's. Als de gedefinieerde buildnummernotatie $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) bijvoorbeeld een buildnummer Build HelloWorld_2024.07.19.1produceert, past het script versie 2024.07.19.1 toe op uw assembly's.

# 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."
}

Voorbeeldscript voor toegang tot de REST API

In dit voorbeeld wordt de SYSTEM_ACCESSTOKEN variabele gebruikt voor toegang tot de REST API van Azure Pipelines.

U kunt in een inlinescript in uw YAML-pijplijn gebruiken $env:SYSTEM_ACCESSTOKEN om toegang te krijgen tot het OAuth-token.

Het volgende inline PowerShell-script in een YAML-pijplijn maakt gebruik van het OAuth-token voor toegang tot de REST API van Azure Pipelines waarmee de pijplijndefinitie wordt opgehaald.

- 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)