次の方法で共有


パイプラインをカスタマイズするための 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 で使用できる 定義済み変数 を使用し、 multi-job 出力変数 を設定して、将来のジョブで変数を使用できるようにすることもできます。 詳細については、「変数の定義」をご覧ください。

PowerShell スクリプトでは、名前付きパラメーターを使用できます。 スイッチ パラメーターなど、他の種類のパラメーターはサポートされておらず、使用しようとするとエラーが発生します。 詳細については、「 コマンドレット パラメーターを宣言する方法を参照してください。

PowerShell スクリプトをパイプラインに追加する

ビルドでは、コードのアクティブなブランチを使用します。 パイプライン実行で main ブランチが使用されている場合、スクリプトでも main ブランチが使用されます。

Windows PowerShell は、 Windows ビルド エージェントで実行することも、任意のプラットフォームで PowerShell Core を実行することもできます。 PowerShell Core を含める構文は、Windows PowerShell の構文とは若干異なります。

PowerShell スクリプトをリポジトリにプッシュしたら、パイプラインに pwsh または powershell ステップを追加します。 pwsh キーワードと powershell キーワードは、どちらも PowerShell タスクを実行するためのショートカットです

PowerShell Core の例:

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

Windows PowerShell の例:

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

アセンブリにバージョンを適用するスクリプトの例

このセクションのサンプル スクリプトは、アセンブリ プロパティ ファイルにバージョンを適用します。 スクリプトを正常に実行するには、定義されたビルド番号の形式に 4 つのピリオド (たとえば、 $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)) が必要です。

Note

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

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 にアクセスします。

YAML パイプラインのインライン スクリプトで $env:SYSTEM_ACCESSTOKEN を使用して、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)