Bagikan melalui


Skrip PowerShell untuk menyesuaikan alur

Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019

Artikel ini menjelaskan bagaimana Anda dapat bergerak melampaui pengkompilasi dan pengujian kode dan menggunakan skrip PowerShell untuk menambahkan logika bisnis ke alur. Tugas Azure Pipelines PowerShell menjalankan skrip PowerShell di alur Anda. Anda dapat menggunakan PowerShell untuk mengakses Rest API Azure DevOps, bekerja dengan item kerja Azure DevOps dan manajemen pengujian, atau memanggil layanan lain sesuai kebutuhan.

Anda dapat menggunakan variabel dalam skrip PowerShell, termasuk variabel yang ditentukan pengguna yang Anda tetapkan sendiri. Anda juga dapat menggunakan variabel yang telah ditentukan sebelumnya yang tersedia di semua Azure Pipelines, dan mengatur variabel output multi-pekerjaan untuk membuat variabel tersedia untuk pekerjaan di masa mendatang. Untuk informasi selengkapnya, lihat Menentukan variabel.

Anda dapat menggunakan parameter bernama di skrip PowerShell Anda. Jenis parameter lain, seperti parameter pengalihan, tidak didukung dan menyebabkan kesalahan jika Anda mencoba menggunakannya. Untuk informasi selengkapnya, lihat Cara mendeklarasikan parameter cmdlet.

Menambahkan skrip PowerShell ke alur

Build menggunakan cabang aktif kode Anda. Jika eksekusi alur Anda menggunakan main cabang, skrip Anda juga menggunakan main cabang.

Anda dapat menjalankan Windows PowerShell pada agen build Windows, atau menjalankan PowerShell Core di platform apa pun. Sintaks untuk menyertakan PowerShell Core sedikit berbeda dari untuk Windows PowerShell.

Setelah Anda mendorong skrip PowerShell ke repositori Anda, tambahkan pwsh atau powershell langkah ke alur Anda. Kata pwsh kunci dan powershell kata kunci adalah pintasan untuk menjalankan tugas PowerShell.

Contoh untuk PowerShell Core:

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

Contoh untuk Windows PowerShell:

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

Contoh skrip untuk menerapkan versi ke rakitan

Contoh skrip di bagian ini menerapkan versi ke file properti rakitan. Agar skrip berhasil dijalankan, format angka build yang ditentukan harus memiliki empat periode, misalnya $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r).

Catatan

Nomor build juga disebut nomor eksekusi.

Sesuaikan nomor build Anda di alur YAML dengan menggunakan name properti . Properti name harus berada di tingkat akar alur. Untuk informasi selengkapnya, lihat Mengonfigurasi nomor eksekusi atau build.

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

Contoh skrip PowerShell berikut menerapkan versi ke rakitan. Misalnya, jika format $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) nomor build yang Ditentukan menghasilkan nomor Build HelloWorld_2024.07.19.1build , skrip menerapkan versi 2024.07.19.1 ke rakitan Anda.

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

Contoh skrip untuk mengakses REST API

Contoh ini menggunakan SYSTEM_ACCESSTOKEN variabel untuk mengakses AZURE Pipelines REST API.

Anda dapat menggunakan $env:SYSTEM_ACCESSTOKEN dalam skrip sebaris di alur YAML Anda untuk mengakses token OAuth.

Skrip PowerShell sebaris berikut dalam alur YAML menggunakan token OAuth untuk mengakses REST API Azure Pipelines yang mengambil definisi alur.

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