İşlem hatlarını özelleştirmek için PowerShell betikleri

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

Bu makalede kod derlemenin ve test etme işleminin ötesine geçme ve işlem hatlarına iş mantığı eklemek için PowerShell betiklerini kullanma işlemleri açıklanmaktadır. Azure Pipelines PowerShell görevi , işlem hatlarınızda PowerShell betiklerini çalıştırır. PowerShell'i kullanarak Azure DevOps REST API'sine erişebilir, Azure DevOps iş öğeleriyle çalışabilir ve yönetim testi yapabilir veya gerektiğinde diğer hizmetleri çağırabilirsiniz.

Kendi belirlediğiniz kullanıcı tanımlı değişkenler de dahil olmak üzere PowerShell betiklerinizde değişkenleri kullanabilirsiniz. Ayrıca, tüm Azure Pipelines'da kullanılabilen önceden tanımlanmış değişkenleri kullanabilir ve değişkenleri gelecekteki işlerde kullanılabilir hale getirmek için çok işli çıkış değişkenleri ayarlayabilirsiniz. Daha fazla bilgi için bkz . Değişkenleri tanımlama.

Adlandırılmış parametreleri PowerShell betiklerinizde kullanabilirsiniz. Anahtar parametreleri gibi diğer parametre türleri desteklenmez ve bunları kullanmaya çalışırsanız hatalara neden olur. Daha fazla bilgi için bkz . Cmdlet parametrelerini bildirme.

İşlem hattına PowerShell betiği ekleme

Derleme, kodunuzun etkin dalını kullanır. İşlem hattı çalıştırmanız dalı main kullanıyorsa betiğiniz de dalı main kullanır.

Windows PowerShell'i bir Windows derleme aracısı üzerinde veya PowerShell Core'u herhangi bir platformda çalıştırabilirsiniz. PowerShell Core ekleme söz dizimi Windows PowerShell'den biraz farklıdır.

PowerShell betiğinizi deponuza gönderdikten sonra işlem hattınıza bir pwsh veya powershell adımı ekleyin. pwsh Anahtar sözcük ve powershell anahtar sözcükler, PowerShell görevini çalıştırmaya yönelik kısayollardır.

PowerShell Core örneği:

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

Windows PowerShell örneği:

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

Derlemelere sürüm uygulamak için örnek betik

Bu bölümdeki örnek betik, derleme özellik dosyalarına bir sürüm uygular. Betiğin başarıyla çalışması için, tanımlı derleme numarası biçiminin dört dönemi olmalıdır, örneğin $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r).

Not

Derleme numarası, çalıştırma numarası olarak da adlandırılır.

özelliğini kullanarak YAML işlem hattında derleme numaranızı özelleştirin name . özelliği, name işlem hattının kök düzeyinde olmalıdır. Daha fazla bilgi için bkz . Çalıştırma veya derleme numaralarını yapılandırma.

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

Aşağıdaki PowerShell örnek betiği derlemelere bir sürüm uygular. Örneğin, tanımlı derleme numarası biçiminiz $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) derleme numarası Build HelloWorld_2024.07.19.1oluşturuyorsa, betik derlemelerinize sürüm 2024.07.19.1 uygular.

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

REST API'ye erişmek için örnek betik

Bu örnek, Azure Pipelines REST API'sine erişmek için değişkenini SYSTEM_ACCESSTOKEN kullanır.

OAuth belirtecine erişmek için YAML işlem hattınızdaki bir satır içi betikte kullanabilirsiniz $env:SYSTEM_ACCESSTOKEN .

YAML işlem hattındaki aşağıdaki satır içi PowerShell betiği, işlem hattı tanımını alan Azure Pipelines REST API'sine erişmek için OAuth belirtecini kullanır.

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