次の方法で共有


パイプライン用の PowerShell スクリプト

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

ビルド番号は、実行番号とも呼ばれます。

  1. パイプラインのルート レベルで name プロパティを使用して、YAML パイプラインのビルド番号定義をカスタマイズします。

    name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
    
  2. 次の PowerShell スクリプトをリポジトリのルートにファイルとして保存します。

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