Använda ett PowerShell-skript för att anpassa din pipeline

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

När du är redo att gå längre än grunderna för att kompilera och testa din kod använder du ett PowerShell-skript för att lägga till teamets affärslogik i bygg-pipelinen. Du kan köra Windows PowerShell på en Windows-byggagent. PowerShell Core körs på valfri plattform.

Lägga till ett PowerShell-skript

Syntaxen för att inkludera PowerShell Core skiljer sig något från syntaxen för Windows PowerShell.

  1. Push-överför PowerShell-skriptet till lagringsplatsen.

  2. Lägg till ett pwsh eller powershell steg. Nyckelordet pwsh är en genväg för PowerShell-uppgiften för PowerShell Core. Nyckelordet powershell är en annan genväg för PowerShell-aktiviteten.

# for PowerShell Core
steps:
- pwsh: ./my-script.ps1

# for Windows PowerShell
steps:
- powershell: .\my-script.ps1

Exempel på PowerShell-skript: versionssammansättningar

Här är ett exempelskript för att version dina sammansättningar. För att skriptet ska kunna köras måste du uppdatera versionsnumret så att det använder ett format med fyra punkter (till exempel: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)). Versionsnummer kan också kallas körningsnummer.

Du kan anpassa ditt versionsnummer i en YAML-pipeline med name egenskapen .

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

pool:
  vmImage: windows-latest

steps:
- pwsh: echo $(Build.BuildNumber) //output updated build number
# If found use it to version the assemblies.
#
# For example, if the 'Build number format' build pipeline parameter 
# $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
# then your build numbers come out like this:
# "Build HelloWorld_2013.07.19.1"
# This script would then apply version 2013.07.19.1 to your assemblies.
	
# Enable -Verbose option
[CmdletBinding()]
	
# Regular expression pattern to find the version in the build number 
# and then apply it to the assemblies
$VersionRegex = "\d+\.\d+\.\d+\.\d+"
	
# If this script is not running on a build server, remind user to 
# set environment variables so that this script can be debugged
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\FabrikamTFVC\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 is 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 "Could not find version number data in BUILD_BUILDNUMBER."
         exit 1
      }
   1 {}
   default 
      { 
         Write-Warning "Found more than instance of version data in BUILD_BUILDNUMBER." 
         Write-Warning "Will assume 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 "Will apply $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."
}

Exempel på PowerShell-skript: åtkomst till REST API

I det här exemplet använder du variabeln SYSTEM_ACCESSTOKEN för att komma åt REST-API:et för Azure Pipelines.

Du kan använda $env:SYSTEM_ACCESSTOKEN i skriptet i en YAML-pipeline för att komma åt OAuth-token.

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

Vanliga frågor

Vilka variabler är tillgängliga för mig att använda i mina skript?

Du kan använda fördefinierade variabler i skripten. Mer information om tillgängliga variabler och hur du använder dem finns i Använda fördefinierade variabler.

Hur gör jag för att ange en variabel så att den kan läsas av efterföljande skript och uppgifter?

Mer information om hur du definierar byggvariabler i ett skript finns i Definiera och ändra dina byggvariabler i ett skript.

Mer information om hur du definierar versionsvariabler i ett skript finns i Definiera och ändra dina versionsvariabler i ett skript

Vilken gren av skriptet körs bygget?

Versionen använder den aktiva grenen av koden. Om pipelinekörningen använder grenen main använder skriptet även grenen main .

Vilka typer av parametrar kan jag använda?

Du kan använda namngivna parametrar. Andra typer av parametrar, till exempel växelparametrar, stöds inte. Du får felmeddelanden om du försöker använda växelparametrar.

Jag använder TFS lokalt och jag ser inte några av dessa funktioner. Varför inte?

Vissa av dessa funktioner är endast tillgängliga i Azure Pipelines och är ännu inte tillgängliga lokalt. Vissa funktioner är tillgängliga lokalt om du har uppgraderat till den senaste versionen av TFS.