Share via


Een PowerShell-script gebruiken om uw pijplijn aan te passen

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

Wanneer u klaar bent om verder te gaan dan de basisprincipes van het compileren en testen van uw code, gebruikt u een PowerShell-script om de bedrijfslogica van uw team toe te voegen aan uw build-pijplijn. U kunt Windows PowerShell uitvoeren op een Windows-buildagent. PowerShell Core wordt uitgevoerd op elk platform.

Een PowerShell-script toevoegen

De syntaxis voor het opnemen van PowerShell Core verschilt enigszins van de syntaxis voor Windows PowerShell.

  1. Push uw PowerShell-script naar uw opslagplaats.

  2. Voeg een pwsh of powershell stap toe. Het pwsh trefwoord is een snelkoppeling voor de PowerShell-taak voor PowerShell Core. Het powershell trefwoord is een andere snelkoppeling voor de PowerShell-taak.

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

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

PowerShell-voorbeeldscript: versieassembly's

Hier volgt een voorbeeldscript voor het versiebeheer van uw assembly's. Als het script goed kan worden uitgevoerd, moet u het buildnummer bijwerken om een notatie met vier perioden te gebruiken (bijvoorbeeld: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)). Buildnummer kan ook worden aangeduid als uitvoeringsnummer.

U kunt uw buildnummer in een YAML-pijplijn aanpassen met de name eigenschap.

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

PowerShell-voorbeeldscript: toegang tot REST API

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

U kunt in uw script in een YAML-pijplijn toegang $env:SYSTEM_ACCESSTOKEN krijgen tot het 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)

Veelgestelde vragen

Welke variabelen zijn beschikbaar voor mij om te gebruiken in mijn scripts?

U kunt vooraf gedefinieerde variabelen in uw scripts gebruiken. Zie Vooraf gedefinieerde variabelen gebruiken voor meer informatie over beschikbare variabelen en hoe u deze kunt gebruiken.

Hoe kan ik een variabele zo instellen dat deze kan worden gelezen door volgende scripts en taken?

Zie Build-variabelen definiëren en wijzigen in een script voor meer informatie over het definiëren van buildvariabelen.

Zie Uw releasevariabelen definiëren en wijzigen in een script voor meer informatie over het definiëren van releasevariabelen in een script

Welke vertakking van het script wordt uitgevoerd door de build?

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

Welke soorten parameters kan ik gebruiken?

U kunt benoemde parameters gebruiken. Andere soorten parameters, zoals switchparameters, worden niet ondersteund. Er worden fouten weergegeven als u switchparameters probeert te gebruiken.

Ik gebruik TFS on-premises en ik zie sommige van deze functies niet. Waarom niet?

Sommige van deze functies zijn alleen beschikbaar in Azure Pipelines en zijn nog niet on-premises beschikbaar. Sommige functies zijn on-premises beschikbaar als u een upgrade hebt uitgevoerd naar de nieuwste versie van TFS.