Aracılığıyla paylaş


İşlem hatları için PowerShell betikleri

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

Bu makalede PowerShell betiklerinin Azure Pipelines'a nasıl iş mantığı ekleyebileceği açıklanmaktadır. PowerShell v2 (PowerShell@2) görevi, Azure DevOps REST API'sine erişebilen, Azure DevOps iş öğeleriyle çalışabilen, testleri yönetebilen veya diğer hizmetleri çağırabilen PowerShell betiklerini çalıştırır.

PowerShell betiklerinde önceden tanımlanmış değişkenleri veya kullanıcı tanımlı değişkenleri kullanabilirsiniz. Diğer işlerin kullanımına sunmak için işler arası çıkış değişkenlerini de ayarlayabilirsiniz. Daha fazla bilgi için bkz . Değişkenleri tanımlama.

Adlandırılmış parametreleri PowerShell betiklerinizde de kullanabilirsiniz. Diğer türdeki anahtar parametreler gibi parametreler desteklenmez. Daha fazla bilgi için bkz . Cmdlet parametrelerini bildirme.

PowerShell betik görevi

PowerShell betiği kullanmak için, işlem hattınıza PowerShell v2 (PowerShell@2) görevini ekler ve satır içi bir PowerShell betiği girer veya bir PowerShell betik dosyası çağırırsınız.

Derleme, kodunuzun aktif dalını kullanır. İşlem hattı çalıştırmanız kodunuzda main dalını kullanıyorsanız, betiğiniz de main dalını kullanmalıdır.

Aşağıdaki örnekte targetType: 'inline' kullanılır ve script özelliğine satır içi betik eklenir.

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

Aşağıdaki örnek, PowerShell@2 adımını bir YAML işlem hattına ekler. Kod, deponuzun kökünde bulunan test.ps1 adlı bir PowerShell betik dosyasını çağırır.

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

Not

Varsayılan olarak, PowerShell@2 görev Windows aracıları için Windows PowerShell 5.1 ve Linux/macOS aracıları için PowerShell 7.x kullanır. Windows aracılarında PowerShell 7.x'i kullanmak için PowerShell 7.x.'i yüklemiş olmanız ve parametresini pwsh olarak trueeklemeniz gerekir. Microsoft tarafından barındırılan aracılarda varsayılan olarak PowerShell 7.x yüklüdür.

YaML işlem hattınıza, pwsh adımına bir kısayol olarak powershell veya PowerShell@2 adımı da ekleyebilirsiniz. Kısayol pwsh macOS, Linux veya Windows üzerinde PowerShell 7.x'i çalıştırır. Kısayol, powershell Windows üzerinde Windows PowerShell 5.1 veya Linux ve macOS üzerinde PowerShell 7.x çalıştırır.

steps:
- pwsh: test.ps1

steps:
- pwsh: Write-Host Hello

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

Aşağıdaki PowerShell betiği bileşenlere yapı numarasına dayalı bir sürüm uygular. Örneğin, derleme numarası biçimi tanımınız $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) "Build HelloWorld_2024.07.19.1" derleme numarasını üretiyorsa, betik derlemelerinize 2024.07.19.1 sürümünü uygular.

Bu betiğin başarıyla çalışması için derleme numarası biçiminizin dört bölümden oluşması gerekir. Daha fazla bilgi için bkz . Sayıları çalıştırma veya derleme.

Not

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

  1. yaml işlem hattında derleme numarası tanımınızı, işlem hattının name kök düzeyindeki özelliğini kullanarak özelleştirin.

    name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
    
  2. Aşağıdaki PowerShell betiğini deponuzun köküne bir dosya olarak kaydedin.

  3. İşlem hattınıza bir PowerShell@2 görev adımı veya pwshpowershell kısayol ekleyin ve çalışma dizinine göre PowerShell betik dosyasının dosya yolunu çağırın.

Derlemelere sürüm uygulamak için PowerShell betiği:

# 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

Aşağıdaki PowerShell betiği, Azure Pipelines REST API'sine erişmek ve işlem hattı tanımını almak için ortam değişkenlerini kullanır.

YAML işlem hattınızda, bir $env:SYSTEM_ACCESSTOKEN görevde ortam değişkenini PowerShell@2 tanımlayabilir ve bunu satır içi betikte kullanarak OAuth belirtecinin REST API'ye erişmesini sağlayabilirsiniz.

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