Share via


使用 PowerShell 腳本自定義管線

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

當您準備好超越編譯和測試程序代碼的基本概念時,請使用PowerShell腳本將小組的商業規則新增至組建管線。 您可以在 Windows 組建代理程式執行 Windows PowerShell。 PowerShell Core 在任何平台上執行。

新增 PowerShell 腳本

包含 PowerShell Core 的語法與 Windows PowerShell 的語法稍有不同。

  1. 將 PowerShell 腳本推送至存放庫。

  2. pwsh新增 或 powershell 步驟。 關鍵詞pwsh是 PowerShell Core PowerShell 工作的快捷方式。 關鍵詞powershell是 PowerShell 工作的另一個快捷方式

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

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

範例 PowerShell 腳本:版本元件

以下是用來為您的元件建立版本的範例腳本。 若要讓腳本順利執行,您必須更新組建編號,以使用具有四個句點的格式(例如: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r))。 組建編號也可以稱為執行編號。

您可以使用 屬性,在 YAML 管線name中自定義組建編號

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

範例 PowerShell 腳本:存取 REST API

在此範例中 SYSTEM_ACCESSTOKEN ,您將使用 變數來存取 Azure Pipelines REST API

您可以在 $env:SYSTEM_ACCESSTOKEN YAML 管線的腳本中使用 ,以存取 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)

常見問題集

哪些變數可供我在腳本中使用?

您可以在文稿中使用 預先定義的變數 。 如需可用變數及其使用方式的詳細資訊,請參閱 使用預先定義的變數

如何? 設定變數,以便後續的腳本和工作讀取變數?

若要深入瞭解如何在腳本中定義組建變數,請參閱 在腳本中定義和修改組建變數。

若要深入瞭解如何在腳本中定義發行變數,請參閱 在腳本中定義和修改發行變數

組建會執行哪個腳本分支?

組建會使用程序代碼的使用中分支。 如果您的管線執行使用 main 分支,您的腳本也會使用 main 分支。

我可以使用哪種類型的參數?

您可以使用具名參數。 不支援其他類型的參數,例如參數參數。 如果您嘗試使用 switch 參數,就會看到錯誤。

我使用內部部署 TFS,但看不到其中一些功能。 為什麼呢?

部分功能僅適用於 Azure Pipelines ,但尚未提供內部部署。 如果您已 升級至最新版的 TFS,某些功能可在內部部署使用。