Udostępnij za pośrednictwem


Skrypty programu PowerShell do dostosowywania potoków

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

W tym artykule wyjaśniono, jak można przejść poza kompilowanie i testowanie kodu oraz używać skryptów programu PowerShell do dodawania logiki biznesowej do potoków. Zadanie programu PowerShell usługi Azure Pipelines uruchamia skrypty programu PowerShell w potokach. Program PowerShell umożliwia uzyskiwanie dostępu do interfejsu API REST usługi Azure DevOps, pracę z elementami roboczymi usługi Azure DevOps i zarządzaniem testami lub wywoływanie innych usług zgodnie z potrzebami.

Zmienne można używać w skryptach programu PowerShell, w tym zmiennych zdefiniowanych przez użytkownika. Można również użyć wstępnie zdefiniowanych zmiennych , które są dostępne we wszystkich usługach Azure Pipelines, i ustawić zmienne wyjściowe z wieloma zadaniami, aby udostępnić zmienne przyszłym zadaniu. Aby uzyskać więcej informacji, zobacz Definiowanie zmiennych.

Nazwane parametry można używać w skryptach programu PowerShell. Inne rodzaje parametrów, takie jak parametry przełącznika, nie są obsługiwane i powodują błędy, jeśli spróbujesz ich użyć. Aby uzyskać więcej informacji, zobacz Jak zadeklarować parametry polecenia cmdlet.

Dodawanie skryptu programu PowerShell do potoku

Kompilacja używa aktywnej gałęzi kodu. Jeśli uruchomienie potoku main używa gałęzi , skrypt używa main również gałęzi .

Program Windows PowerShell można uruchomić na agencie kompilacji systemu Windows lub uruchomić program PowerShell Core na dowolnej platformie. Składnia dołączania programu PowerShell Core jest nieco inna niż w przypadku programu Windows PowerShell.

Po wypchnięciu skryptu programu PowerShell do repozytorium dodaj pwsh krok lub powershell do potoku. Słowo pwsh kluczowe i powershell słowa kluczowe są skrótami do uruchomienia zadania programu PowerShell.

Przykład dla programu PowerShell Core:

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

Przykład dla programu Windows PowerShell:

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

Przykładowy skrypt do stosowania wersji do zestawów

Przykładowy skrypt w tej sekcji stosuje wersję do plików właściwości zestawu. Aby skrypt został uruchomiony pomyślnie, zdefiniowany format numeru kompilacji musi zawierać cztery kropki, na przykład $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r).

Uwaga

Numer kompilacji jest również nazywany numerem uruchomienia.

Dostosuj numer kompilacji w potoku YAML przy użyciu name właściwości . Właściwość name musi znajdować się na poziomie głównym potoku. Aby uzyskać więcej informacji, zobacz Konfigurowanie numerów uruchamiania lub kompilacji.

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

Poniższy przykładowy skrypt programu PowerShell stosuje wersję do zestawów. Jeśli na przykład zdefiniowany format $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) numeru kompilacji generuje numer Build HelloWorld_2024.07.19.1kompilacji, skrypt stosuje wersję 2024.07.19.1 do zestawów.

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

Przykładowy skrypt umożliwiający uzyskanie dostępu do interfejsu API REST

W tym przykładzie użyto zmiennej SYSTEM_ACCESSTOKEN w celu uzyskania dostępu do interfejsu API REST usługi Azure Pipelines.

Aby uzyskać dostęp do tokenu OAuth, możesz użyć $env:SYSTEM_ACCESSTOKEN w skrypcie wbudowanym w potoku YAML.

Poniższy wbudowany skrypt programu PowerShell w potoku YAML używa tokenu OAuth do uzyskiwania dostępu do interfejsu API REST usługi Azure Pipelines, który pobiera definicję potoku.

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