Freigeben über


PowerShell-Skripts zum Anpassen von Pipelines

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

In diesem Artikel wird erläutert, wie Sie über das Kompilieren und Testen von Code hinausgehen und PowerShell-Skripts verwenden können, um Geschäftslogik zu Pipelines hinzuzufügen. Die PowerShell-Aufgabe "Azure Pipelines" führt PowerShell-Skripts in Ihren Pipelines aus. Sie können PowerShell verwenden, um auf die Azure DevOps-REST-API zuzugreifen, mit Azure DevOps-Arbeitsaufgaben und Testverwaltung zu arbeiten oder andere Dienste nach Bedarf aufzurufen.

Sie können Variablen in Ihren PowerShell-Skripts verwenden, einschließlich benutzerdefinierter Variablen , die Sie selbst festgelegt haben. Sie können auch vordefinierte Variablen verwenden, die in allen Azure-Pipelines verfügbar sind, und Multiauftragsausgabevariablen festlegen, um Variablen für zukünftige Aufträge verfügbar zu machen. Weitere Informationen finden Sie unter Definieren von Variablen.

Sie können benannte Parameter in Ihren PowerShell-Skripts verwenden. Andere Arten von Parametern, z. B. Schalterparameter, werden nicht unterstützt und verursachen Fehler, wenn Sie versuchen, sie zu verwenden. Weitere Informationen finden Sie unter Deklarieren von Cmdlet-Parametern.

Hinzufügen eines PowerShell-Skripts zu einer Pipeline

Der Build verwendet den aktiven Branch Ihres Codes. Wenn die Pipelineausführung den main-Branch verwendet, verwendet auch Ihr Skript den main-Branch.

Sie können Windows PowerShell auf einem Windows-Build-Agent ausführen oder PowerShell Core auf einer beliebigen Plattform ausführen. Die Syntax für das Einschließen von PowerShell Core unterscheidet sich geringfügig von windows PowerShell.

Nachdem Sie Ihr PowerShell-Skript an Ihr Repository übertragen haben, fügen Sie ihrer Pipeline einen oder powershell einen pwsh Schritt hinzu. Das pwsh Schlüsselwort und powershell die Schlüsselwörter sind beide Tastenkombinationen zum Ausführen der PowerShell-Aufgabe.

Beispiel für PowerShell Core:

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

Beispiel für Windows PowerShell:

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

Beispielskript zum Anwenden der Version auf Assemblys

Das Beispielskript in diesem Abschnitt wendet eine Version auf Assemblyeigenschaftendateien an. Damit das Skript erfolgreich ausgeführt werden kann, muss das definierte Buildnummernformat vier Punkte aufweisen, z. B $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r). .

Hinweis

Buildnummer wird auch als Ausführungsnummer bezeichnet.

Passen Sie Ihre Buildnummer in der YAML-Pipeline mithilfe der name Eigenschaft an. Die name Eigenschaft muss sich auf der Stammebene der Pipeline befinden. Weitere Informationen finden Sie unter Konfigurieren von Ausführungs- oder Buildnummern.

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

Das folgende PowerShell-Beispielskript wendet eine Version auf Assemblys an. Wenn ihr definiertes Buildnummernformat $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) beispielsweise eine Buildnummer Build HelloWorld_2024.07.19.1erzeugt, wendet das Skript die Version 2024.07.19.1 auf Ihre Assemblys an.

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

Beispielskript für den Zugriff auf die REST-API

In diesem Beispiel wird die SYSTEM_ACCESSTOKEN Variable verwendet, um auf die REST-API von Azure Pipelines zuzugreifen.

Sie können in einem Inlineskript in Ihrer YAML-Pipeline verwenden $env:SYSTEM_ACCESSTOKEN , um auf das OAuth-Token zuzugreifen.

Das folgende Inline-PowerShell-Skript in einer YAML-Pipeline verwendet das OAuth-Token für den Zugriff auf die Azure Pipelines-REST-API, die die Pipelinedefinition abruft.

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