Sdílet prostřednictvím


Skripty PowerShellu pro přizpůsobení kanálů

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

Tento článek vysvětluje, jak můžete přejít mimo kompilaci a testování kódu a použití skriptů PowerShellu k přidání obchodní logiky do kanálů. Úloha Azure Pipelines PowerShellu spouští skripty PowerShellu ve vašich kanálech. Pomocí PowerShellu můžete získat přístup k rozhraní REST API Azure DevOps, pracovat s pracovními položkami Azure DevOps a správou testů nebo podle potřeby volat jiné služby.

Proměnné můžete použít ve skriptech PowerShellu, včetně uživatelem definovaných proměnných , které nastavíte sami. Můžete také použít předdefinované proměnné , které jsou dostupné ve všech azure Pipelines, a nastavit výstupní proměnné s více úlohami , aby byly proměnné dostupné pro budoucí úlohy. Další informace naleznete v tématu Definování proměnných.

Pojmenované parametry můžete použít ve skriptech PowerShellu. Jiné druhy parametrů, jako jsou parametry přepínače, nejsou podporované a při pokusu o jejich použití způsobují chyby. Další informace naleznete v tématu Jak deklarovat parametry rutiny.

Přidání skriptu PowerShellu do kanálu

Sestavení používá aktivní větev kódu. Pokud vaše spuštění kanálu používá main větev, skript také používá main větev.

Windows PowerShell můžete spustit v agentu sestavení windows nebo spustit PowerShell Core na libovolné platformě. Syntaxe zahrnutí PowerShellu Core se mírně liší od windows PowerShellu.

Po nasdílení skriptu PowerShellu do úložiště přidejte pwsh do kanálu nějaký nebo powershell krok. Klíčové pwsh slovo a powershell klíčová slova jsou obě klávesové zkratky ke spuštění úlohy PowerShellu.

Příklad pro PowerShell Core:

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

Příklad pro Windows PowerShell:

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

Ukázkový skript pro použití verze na sestavení

Ukázkový skript v této části použije verzi pro soubory vlastností sestavení. Aby se skript úspěšně spustil, musí mít definovaný formát čísla sestavení čtyři tečky, například $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r).

Poznámka:

Číslo buildu se také nazývá číslo spuštění.

Přizpůsobte číslo sestavení v kanálu YAML pomocí name vlastnosti. Vlastnost name musí být na kořenové úrovni kanálu. Další informace najdete v tématu Konfigurace čísel spuštění nebo sestavení.

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

Následující ukázkový skript PowerShellu aplikuje verzi na sestavení. Pokud například definovaný formát $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) čísla sestavení vytvoří číslo Build HelloWorld_2024.07.19.1sestavení, skript použije verzi 2024.07.19.1 pro sestavení.

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

Ukázkový skript pro přístup k rozhraní REST API

Tento příklad používá proměnnou SYSTEM_ACCESSTOKEN pro přístup k rozhraní REST API služby Azure Pipelines.

Pro přístup k tokenu OAuth můžete použít $env:SYSTEM_ACCESSTOKEN vložený skript v kanálu YAML.

Následující vložený skript PowerShellu v kanálu YAML používá token OAuth pro přístup k rozhraní REST API služby Azure Pipelines, který načte definici kanálu.

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