Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020
この記事では、PowerShell スクリプトで Azure Pipelines にビジネス ロジックを追加する方法について説明します。 PowerShell v2 (PowerShell@2) タスクは、Azure DevOps REST API にアクセスしたり、Azure DevOps 作業項目を操作したり、テストを管理したり、他のサービスを呼び出したりできる PowerShell スクリプトを実行します。
PowerShell スクリプトでは、定義済みの変数またはユーザー定義変数を使用できます。 複数ジョブ出力変数を設定して、変数を他のジョブで使用できるようにすることもできます。 詳細については、「変数の定義」をご覧ください。
PowerShell スクリプトで名前付きパラメーターを使用することもできます。 スイッチ パラメーターなど、他の種類の パラメーターはサポートされていません。 詳細については、「 コマンドレット パラメーターを宣言する方法を参照してください。
PowerShell スクリプト タスク
PowerShell スクリプトを使用するには、 PowerShell v2 (PowerShell@2) タスクをパイプラインに追加し、インライン PowerShell スクリプトを入力するか、PowerShell スクリプト ファイルを呼び出します。
ビルドでは、コードのアクティブなブランチを使用します。 パイプライン実行でコードの main ブランチを使用する場合、スクリプトでは main ブランチも使用されます。
次の例では、 targetType: 'inline' を使用し、 script プロパティにインライン スクリプトを追加します。
steps:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: Write-Host "Hello world!"
次の例では、 PowerShell@2 ステップを YAML パイプラインに追加します。 このコードは、リポジトリのルートにある test.ps1 という名前の PowerShell スクリプト ファイルを呼び出します。
steps:
- task: PowerShell@2
inputs:
targetType: 'filePath'
filePath: 'test.ps1'
Note
既定では、 PowerShell@2 タスクでは Windows エージェントには Windows PowerShell 5.1、Linux/macOS エージェントには PowerShell 7.x が使用されます。 Windows エージェントで PowerShell 7.x を使用するには、PowerShell 7.x をインストールし、 pwsh パラメーターを true に設定して追加する必要があります。
Microsoft でホストされるエージェント には、既定で PowerShell 7.x がインストールされています。
pwsh ステップのショートカットとして、powershellまたはPowerShell@2ステップを YAML パイプラインに追加することもできます。
pwshショートカットは、macOS、Linux、または Windows で PowerShell 7.x を実行します。
powershell ショートカットは、Windows では Windows PowerShell 5.1、Linux および macOS では PowerShell 7.x を実行します。
steps:
- pwsh: test.ps1
steps:
- pwsh: Write-Host Hello
アセンブリにバージョンを適用するスクリプトの例
次の PowerShell スクリプトは、ビルド番号に基づいてバージョンをアセンブリに適用します。 たとえば、ビルド番号フォーマット定義 $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) がビルド番号 HelloWorld_2024.07.19.1 を生成する場合、スクリプトはアセンブリに対してバージョン 2024.07.19.1 を適用します。
このスクリプトを正常に実行するには、ビルド番号の形式に 4 つのセグメントが必要です。 詳細については、「 実行番号またはビルド番号」を参照してください。
Note
ビルド番号は、実行番号とも呼ばれます。
パイプラインのルート レベルで
nameプロパティを使用して、YAML パイプラインのビルド番号定義をカスタマイズします。name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)次の PowerShell スクリプトをリポジトリのルートにファイルとして保存します。
PowerShell@2タスク ステップまたはpwshまたはpowershellのショートカットをパイプラインに追加し、作業ディレクトリを基準にして PowerShell スクリプト ファイルのファイル パスを呼び出します。
アセンブリにバージョンを適用する PowerShell スクリプト:
# 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 にアクセスするためのスクリプトの例
次の PowerShell スクリプトでは、環境変数を使用して Azure Pipelines REST API にアクセスし、パイプライン定義を取得します。
YAML パイプラインでは、$env:SYSTEM_ACCESSTOKEN タスクで環境変数PowerShell@2を定義し、それをインライン スクリプトで使用して、REST API にアクセスするための 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)