Menggunakan skrip PowerShell untuk mengkustomisasi alur Anda

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

Saat Anda siap untuk melampaui dasar-dasar mengkompilasi dan menguji kode Anda, gunakan skrip PowerShell untuk menambahkan logika bisnis tim Anda ke alur build Anda. Anda dapat menjalankan Windows PowerShell pada agen build Windows. PowerShell Core berjalan pada platform apa pun.

Menambahkan skrip PowerShell

Sintaks untuk menyertakan PowerShell Core sedikit berbeda dari sintaks untuk Windows PowerShell.

  1. Dorong skrip PowerShell Anda ke repositori Anda.

  2. pwsh Tambahkan langkah atau powershell . Kata pwsh kunci adalah pintasan untuk tugas PowerShell untuk PowerShell Core. Kata powershell kunci adalah pintasan lain untuk tugas PowerShell.

# for PowerShell Core
steps:
- pwsh: ./my-script.ps1

# for Windows PowerShell
steps:
- powershell: .\my-script.ps1

Contoh skrip PowerShell: rakitan versi

Berikut adalah contoh skrip untuk membuat versi rakitan Anda. Agar skrip berhasil dijalankan, Anda harus memperbarui nomor build untuk menggunakan format dengan empat periode (misalnya: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)). Nomor build juga dapat disebut sebagai nomor eksekusi.

Anda dapat menyesuaikan nomor build Anda dalam alur YAML dengan name properti .

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

pool:
  vmImage: windows-latest

steps:
- pwsh: echo $(Build.BuildNumber) //output updated build number
# If found use it to version the assemblies.
#
# For example, if the 'Build number format' build pipeline parameter 
# $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
# then your build numbers come out like this:
# "Build HelloWorld_2013.07.19.1"
# This script would then apply version 2013.07.19.1 to your assemblies.
	
# Enable -Verbose option
[CmdletBinding()]
	
# Regular expression pattern to find the version in the build number 
# and then apply it to the assemblies
$VersionRegex = "\d+\.\d+\.\d+\.\d+"
	
# If this script is not running on a build server, remind user to 
# set environment variables so that this script can be debugged
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\FabrikamTFVC\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 is 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 "Could not find version number data in BUILD_BUILDNUMBER."
         exit 1
      }
   1 {}
   default 
      { 
         Write-Warning "Found more than instance of version data in BUILD_BUILDNUMBER." 
         Write-Warning "Will assume 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 "Will apply $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 PowerShell: mengakses REST API

Dalam contoh ini, Anda akan menggunakan SYSTEM_ACCESSTOKEN variabel untuk mengakses AZURE Pipelines REST API.

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

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

FAQ

Variabel apa yang tersedia untuk saya gunakan dalam skrip saya?

Anda dapat menggunakan variabel yang telah ditentukan sebelumnya dalam skrip Anda. Untuk informasi selengkapnya tentang variabel yang tersedia dan cara menggunakannya, lihat Menggunakan variabel yang telah ditentukan sebelumnya.

Bagaimana cara mengatur variabel sehingga dapat dibaca oleh skrip dan tugas berikutnya?

Untuk mempelajari selengkapnya tentang menentukan variabel build dalam skrip, lihat Menentukan dan memodifikasi variabel build Anda dalam skrip.

Untuk mempelajari selengkapnya tentang menentukan variabel rilis dalam skrip, lihat Menentukan dan memodifikasi variabel rilis Anda dalam skrip

Cabang skrip mana yang dijalankan build?

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

Jenis parameter apa yang dapat saya gunakan?

Anda dapat menggunakan parameter bernama. Jenis parameter lain, seperti parameter pengalihan, tidak didukung. Anda akan melihat kesalahan jika mencoba menggunakan parameter pengalihan.

Saya menggunakan TFS lokal dan saya tidak melihat beberapa fitur ini. Mengapa bukan?

Beberapa fitur ini hanya tersedia di Azure Pipelines dan belum tersedia secara lokal. Beberapa fitur tersedia secara lokal jika Anda telah meningkatkan ke TFS versi terbaru.