Condividi tramite


Script di PowerShell per personalizzare le pipeline

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

Questo articolo illustra come andare oltre la compilazione e il test del codice e usare script di PowerShell per aggiungere logica di business alle pipeline. L'attività di PowerShell di Azure Pipelines esegue script di PowerShell nelle pipeline. È possibile usare PowerShell per accedere all'API REST di Azure DevOps, usare gli elementi di lavoro di Azure DevOps e la gestione dei test o chiamare altri servizi in base alle esigenze.

È possibile usare variabili negli script di PowerShell, incluse le variabili definite dall'utente impostate manualmente. È anche possibile usare variabili predefinite disponibili in tutte le pipeline di Azure e impostare variabili di output multi-processo per rendere disponibili le variabili per i processi futuri. Per altre informazioni, vedere Definire le variabili.

È possibile usare parametri denominati negli script di PowerShell. Altri tipi di parametri, ad esempio parametri switch, non sono supportati e causano errori se si tenta di usarli. Per altre informazioni, vedere Come dichiarare i parametri dei cmdlet.

Aggiungere uno script di PowerShell a una pipeline

La compilazione usa il ramo attivo del codice. Se l'esecuzione della pipeline usa il main ramo , lo script usa anche il main ramo .

È possibile eseguire Windows PowerShell in un agente di compilazione di Windows oppure eseguire PowerShell Core in qualsiasi piattaforma. La sintassi per l'inclusione di PowerShell Core è leggermente diversa rispetto a quella di Windows PowerShell.

Dopo aver eseguito il push dello script di PowerShell nel repository, aggiungere un pwsh passaggio o powershell alla pipeline. La pwsh parola chiave e powershell le parole chiave sono entrambi collegamenti per eseguire l'attività di PowerShell.

Esempio per PowerShell Core:

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

Esempio per Windows PowerShell:

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

Script di esempio per applicare la versione agli assembly

Lo script di esempio in questa sezione applica una versione ai file delle proprietà dell'assembly. Affinché lo script venga eseguito correttamente, il formato del numero di build definito deve avere quattro punti, ad esempio $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r).

Nota

Il numero di build viene chiamato anche numero di esecuzione.

Personalizzare il numero di build nella pipeline YAML usando la name proprietà . La name proprietà deve essere a livello radice della pipeline. Per altre informazioni, vedere Configurare numeri di esecuzione o compilazione.

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

Lo script di esempio di PowerShell seguente applica una versione agli assembly. Ad esempio, se il formato $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) del numero di build definito produce il numero Build HelloWorld_2024.07.19.1di build , lo script applica la versione 2024.07.19.1 agli assembly.

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

Script di esempio per accedere all'API REST

Questo esempio usa la SYSTEM_ACCESSTOKEN variabile per accedere all'API REST di Azure Pipelines.

È possibile usare $env:SYSTEM_ACCESSTOKEN in uno script inline nella pipeline YAML per accedere al token OAuth.

Lo script di PowerShell inline seguente in una pipeline YAML usa il token OAuth per accedere all'API REST di Azure Pipelines che recupera la definizione della 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)