Freigeben über


PowerShell-Skripts für Pipelines

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

In diesem Artikel wird erläutert, wie PowerShell-Skripts Azure-Pipelines Geschäftslogik hinzufügen können. Die PowerShell v2-Aufgabe (PowerShell@2) führt PowerShell-Skripts aus, die auf die Azure DevOps-REST-API zugreifen können, mit Azure DevOps-Arbeitsaufgaben arbeiten, Tests verwalten oder andere Dienste aufrufen können.

Sie können vordefinierte Variablen oder benutzerdefinierte Variablen in PowerShell-Skripts verwenden. Sie können auch Ausgabevariablen für mehrere Aufträge festlegen, um Variablen für andere Aufträge verfügbar zu machen. Weitere Informationen finden Sie unter Definieren von Variablen.

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

PowerShell-Skriptaufgabe

Um ein PowerShell-Skript zu verwenden, fügen Sie der Pipeline die PowerShell v2-Aufgabe (PowerShell@2) hinzu, und geben Sie dann ein Inline-PowerShell-Skript ein, oder rufen Sie eine PowerShell-Skriptdatei auf.

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

Im folgenden Beispiel werden targetType: 'inline' verwendet und ein Inline-Skript in der script-Eigenschaft hinzugefügt.

steps:
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: Write-Host "Hello world!"

Im folgenden Beispiel wird der PowerShell@2 Schritt zu einer YAML-Pipeline hinzugefügt. Der Code ruft eine PowerShell-Skriptdatei mit dem Namen test.ps1 im Stammverzeichnis Ihres Repositorys auf.

steps:
- task: PowerShell@2
  inputs:
    targetType: 'filePath'
    filePath: 'test.ps1'

Hinweis

Standardmäßig verwendet die PowerShell@2 Aufgabe Windows PowerShell 5.1 für Windows-Agents und PowerShell 7.x für Linux/macOS-Agents. Um PowerShell 7.x auf Windows-Agents zu verwenden, müssen Sie PowerShell 7.x installiert haben und den Parametersatz hinzufügen, der pwsh auf true. Microsoft-gehostete Agents haben PowerShell 7.x standardmäßig installiert.

Sie können Ihrer YAML-Pipeline auch einen pwsh-Schritt oder powershell-Schritt als Abkürzung für zum PowerShell@2-Schritt hinzufügen. Die pwsh Tastenkombination führt PowerShell 7.x unter macOS, Linux oder Windows aus. Die powershell Verknüpfung führt Windows PowerShell 5.1 unter Windows oder PowerShell 7.x unter Linux und macOS aus.

steps:
- pwsh: test.ps1

steps:
- pwsh: Write-Host Hello

Beispielskript zum Anwenden der Version auf Assemblys

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

Damit dieses Skript erfolgreich ausgeführt werden kann, muss das Buildnummernformat vier Segmente aufweisen. Weitere Informationen finden Sie unter Ausführen oder Erstellen von Nummern.

Hinweis

Buildnummer wird auch als Ausführungsnummer bezeichnet.

  1. Passen Sie Die Buildnummerndefinition in der YAML-Pipeline mithilfe der name Eigenschaft auf der Stammebene der Pipeline an.

    name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
    
  2. Speichern Sie das folgende PowerShell-Skript als Datei im Stammverzeichnis Ihres Repositorys.

  3. Fügen Sie Ihrer Pipeline einen PowerShell@2 Task-Schritt oder eine pwsh oder powershell Verknüpfung hinzu, und rufen Sie den Dateipfad der PowerShell-Skriptdatei relativ zum Arbeitsverzeichnis auf.

PowerShell-Skript zum Anwenden der Version auf Assemblys:

# 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

Das folgende PowerShell-Skript verwendet Umgebungsvariablen, um auf die REST-API von Azure Pipelines zuzugreifen und die Pipelinedefinition abzurufen.

In Ihrer YAML-Pipeline können Sie die Umgebungsvariable $env:SYSTEM_ACCESSTOKEN in einer PowerShell@2 Aufgabe definieren und im Inlineskript verwenden, um das OAuth-Token für den Zugriff auf die REST-API abzurufen.

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