Scripts PowerShell pour personnaliser les pipelines

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

Cet article explique comment vous pouvez aller au-delà de la compilation et du test du code et utiliser des scripts PowerShell pour ajouter une logique métier aux pipelines. La tâche PowerShell Azure Pipelines exécute des scripts PowerShell dans vos pipelines. Vous pouvez utiliser PowerShell pour accéder à l’API REST Azure DevOps, utiliser des éléments de travail Azure DevOps et une gestion des tests, ou appeler d’autres services en fonction des besoins.

Vous pouvez utiliser des variables dans vos scripts PowerShell, y compris les variables définies par l’utilisateur que vous avez définies vous-même. Vous pouvez également utiliser des variables prédéfinies disponibles dans tous les pipelines Azure et définir des variables de sortie à plusieurs travaux pour rendre les variables disponibles pour les travaux futurs. Pour plus d’informations, consultez Définir des variables.

Vous pouvez utiliser des paramètres nommés dans vos scripts PowerShell. D’autres types de paramètres, tels que les paramètres de commutateur, ne sont pas pris en charge et provoquent des erreurs si vous essayez de les utiliser. Pour plus d’informations, consultez Comment déclarer des paramètres d’applet de commande.

Ajouter un script PowerShell à un pipeline

La build utilise la branche active de votre code. Si votre exécution de pipeline utilise la branche main, votre script utilisera également la branche main.

Vous pouvez exécuter Windows PowerShell sur un agent de build Windows ou exécuter PowerShell Core sur n’importe quelle plateforme. La syntaxe d’inclusion de PowerShell Core est légèrement différente de celle de Windows PowerShell.

Après avoir envoyé votre script PowerShell à votre dépôt, ajoutez une ou powershell une pwsh étape à votre pipeline. Le pwsh mot clé et powershell les mots clés sont les deux raccourcis pour exécuter la tâche PowerShell.

Exemple pour PowerShell Core :

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

Exemple pour Windows PowerShell :

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

Exemple de script pour appliquer la version aux assemblys

L’exemple de script de cette section applique une version aux fichiers de propriétés d’assembly. Pour que le script s’exécute correctement, le format de numéro de build défini doit avoir quatre périodes, par exemple $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r).

Remarque

Le numéro de build est également appelé numéro d’exécution.

Personnalisez votre numéro de build dans le pipeline YAML à l’aide de la name propriété. La name propriété doit être au niveau racine du pipeline. Pour plus d’informations, consultez Configurer les numéros d’exécution ou de build.

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

L’exemple de script PowerShell suivant applique une version aux assemblys. Par exemple, si votre format $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) de numéro de build défini produit le numéro Build HelloWorld_2024.07.19.1de build, le script applique la version 2024.07.19.1 à vos 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."
}

Exemple de script pour accéder à l’API REST

Cet exemple utilise la SYSTEM_ACCESSTOKEN variable pour accéder à l’API REST Azure Pipelines.

Vous pouvez utiliser $env:SYSTEM_ACCESSTOKEN dans un script inline dans votre pipeline YAML pour accéder au jeton OAuth.

Le script PowerShell inline suivant dans un pipeline YAML utilise le jeton OAuth pour accéder à l’API REST Azure Pipelines qui récupère la définition du pipeline.

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