共用方式為


自定義管線的PowerShell腳本

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

本文說明如何超越編譯和測試程序代碼,並使用PowerShell腳本將商業規則新增至管線。 Azure Pipelines PowerShell 工作 會在管線中執行 PowerShell 腳本。 您可以使用 PowerShell 來存取 Azure DevOps REST API、使用 Azure DevOps 工作專案和測試管理,或視需要呼叫其他服務。

您可以在 PowerShell 腳本中使用變數,包括 您自行設定的使用者定義變數 。 您也可以使用 所有 Azure Pipelines 中可用的預先定義變數 ,並設定 多作業輸出變數 ,讓變數可供未來的作業使用。 如需詳細資訊,請參閱 定義變數

您可以在 PowerShell 腳本中使用具名參數。 不支援其他類型的參數,例如參數參數,而且如果您嘗試使用這些參數,則會造成錯誤。 如需詳細資訊,請參閱 如何宣告 Cmdlet 參數

將 PowerShell 腳本新增至管線

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

您可以在 Windows 組建代理程式執行 Windows PowerShell,或在任何平台上執行 PowerShell Core。 包含 PowerShell Core 的語法與 Windows PowerShell 的語法稍有不同。

將 PowerShell 腳本推送至存放庫之後,請將 或 powershell 步驟新增pwsh至管線。 pwsh關鍵詞和powershell關鍵詞都是執行PowerShell工作的快捷方式。

PowerShell Core 的範例:

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

Windows PowerShell 的範例:

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

將版本套用至元件的範例腳本

本節中的範例腳本會將版本套用至元件屬性檔。 若要讓文稿順利執行,定義的組建編號格式必須有四個週期,例如 $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)

注意

組建編號也稱為執行編號。

使用 name 屬性,在 YAML 管線中自定義組建編號。 屬性 name 必須位於管線的根層級。 如需詳細資訊,請參閱 設定執行或組建編號

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

下列 PowerShell 範例腳本會將版本套用至元件。 例如,如果您的已定義組建編號格式 $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) 產生組建編號 Build HelloWorld_2024.07.19.1,腳本會將版本 2024.07.19.1 套用至您的元件。

# 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 的範例腳本

此範例會 SYSTEM_ACCESSTOKEN 使用 變數來存取 Azure Pipelines REST API

您可以在 $env:SYSTEM_ACCESSTOKEN YAML 管線的內嵌腳本中使用 ,以存取 OAuth 令牌。

YAML 管線中的下列內嵌 PowerShell 腳本會使用 OAuth 令牌來存取擷取管線定義的 Azure Pipelines REST API。

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