Sdílet prostřednictvím


Skripty PowerShellu pro kanály

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

Tento článek vysvětluje, jak můžou skripty PowerShellu přidat obchodní logiku do Azure Pipelines. Úloha PowerShellu v2 (PowerShell@2) spouští skripty PowerShellu , které mají přístup k rozhraní REST API Azure DevOps, pracují s pracovními položkami Azure DevOps, spravují testy nebo volají jiné služby.

Ve skriptech PowerShellu můžete použít předdefinované proměnné nebo uživatelem definované proměnné . Můžete také nastavit výstupní proměnné s více úlohami , aby byly proměnné k dispozici pro jiné úlohy. Další informace naleznete v tématu Definování proměnných.

Pojmenované parametry můžete použít také ve skriptech PowerShellu. Jiné typy parametrů, jako jsou parametry přepínače, se nepodporují. Další informace naleznete v tématu Jak deklarovat parametry cmdletu.

Úloha skriptu PowerShellu

Pokud chcete použít skript PowerShellu, přidáte do kanálu úlohu PowerShellu v2 (PowerShell@2) a pak zadáte vložený skript PowerShellu nebo zavoláte soubor skriptu PowerShellu.

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

Následující příklad používá targetType: 'inline' a přidá vložený skript do script vlastnosti.

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

Následující příklad přidá PowerShell@2 krok do kanálu YAML. Kód vyvolá soubor skriptu PowerShellu s názvem test.ps1 umístěný v kořenovém adresáři úložiště.

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

Poznámka:

Ve výchozím nastavení úloha PowerShell@2 používá Windows PowerShell 5.1 pro agenty Windows a PowerShell 7.x pro agenty Linux/macOS. Pokud chcete používat PowerShell 7.x v agentech Windows, musíte mít nainstalovaný PowerShell 7.x. a přidat pwsh parametr nastavený na true. Agenti hostovaní Microsoftem mají ve výchozím nastavení nainstalovaný PowerShell 7.x.

Do kanálu YAML můžete také přidat krok nebo pwsh ho powershell přidat PowerShell@2 jako zástupce kroku. Zástupce pwsh spustí PowerShell 7.x v systému macOS, Linux nebo Windows. Zástupce powershell používá Windows PowerShell 5.1 ve Windows nebo PowerShellu 7.x v Linuxu a macOS.

steps:
- pwsh: test.ps1

steps:
- pwsh: Write-Host Hello

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

Následující skript PowerShellu použije verzi založenou na čísle sestavení pro sestavení. Pokud například definice $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) formátu čísla sestavení vytvoří číslo sestavení HelloWorld_2024.07.19.1, skript použije pro sestavení verzi 2024.07.19.1 .

Aby se tento skript úspěšně spustil, musí mít formát čísla sestavení čtyři segmenty. Další informace najdete v tématu Čísla spuštění nebo sestavení.

Poznámka:

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

  1. Přizpůsobte definici čísla buildu v kanálu YAML pomocí name vlastnosti na kořenové úrovni kanálu.

    name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
    
  2. Uložte následující skript PowerShellu jako soubor v kořenovém adresáři úložiště.

  3. PowerShell@2 Přidejte krok úkolu nebo pwshpowershell zástupce do kanálu a volejte cestu k souboru skriptu PowerShellu vzhledem k pracovnímu adresáři.

Skript PowerShellu pro použití verze u 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

Následující skript PowerShellu používá proměnné prostředí pro přístup k rozhraní REST API služby Azure Pipelines a načtení definice kanálu.

V kanálu YAML můžete definovat proměnnou $env:SYSTEM_ACCESSTOKENPowerShell@2 prostředí v úloze a použít ji ve vloženém skriptu k získání tokenu OAuth pro přístup k rozhraní REST API.

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