次の方法で共有


クロスプラットフォーム スクリプティング

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

Azure Pipelines では、Linux、macOS、および Windows マシンでパイプラインを実行できます。 .NET Core、Node.js、Python などのクロスプラットフォーム開発テクノロジを使用する場合、これらのクロスプラットフォーム ビルド機能は利点と課題の両方をもたらします。 たとえば、ほとんどのパイプラインには、ビルド プロセス中に実行する 1 つ以上のスクリプトが含まれていますが、スクリプト構文はプラットフォームと異なることがよくあります。

この記事では、クロスプラットフォーム スクリプトを使用してさまざまなビルド プラットフォームをサポートする方法について説明します。 Azure Pipelines script ステップを使用して、クロスプラットフォーム スクリプトの記述を容易にすることができます。 条件を使用して、特定のプラットフォームにスクリプトをターゲットにすることもできます。

スクリプト ステップ

script キーワードはコマンド ライン タスクのショートカットであり、Bash on Linux および macOS または windows で cmd.exe を実行します。

scriptを使用すると、クロスプラットフォーム ツールに引数を簡単に渡すことができます。 scriptステップは、各プラットフォームのネイティブ スクリプト インタープリター、Bash on macOS および Linux、または Windows 上の cmd.exe で実行されます。 次の例では、 script ステップを使用して、一連の引数で npm を呼び出します。

steps:
- script: |
    npm install
    npm test

環境変数

コマンド ライン、PowerShell、Bash では 、環境変数 の解決方法が異なります。 PATH などのシステム提供の値にアクセスするには、プラットフォームごとに異なる構文を使用する必要があります。

Azure Pipelines では、実行時に変数を参照するためのクロスプラットフォームの方法として マクロ構文 が使用されます。 マクロ構文を持つ変数は、実行時にタスクが実行される前に処理されます。 変数は、プラットフォーム シェルで検出される前に展開されます。

パイプラインでマクロ構文を使用するには、変数名を次のように囲みます: $(<variable name>)。 次のクロスプラットフォームのサンプル スクリプトは、パイプラインの ID をエコーします。

steps:
- script: echo This is pipeline $(System.DefinitionId)

この構文は、パイプライン内で定義する変数にも使用できます。

variables:
  Example: 'myValue'

steps:
- script: echo The value passed in is $(Example)

Bash タスク

より複雑なスクリプトが必要な場合は、Bash でスクリプトを記述し、パイプラインで Bash タスク を使用することを検討してください。 ほとんどの macOS および Linux エージェントはシェルとして Bash を使用し、Windows エージェントは Linux Bash 用の Git Bash または Windows サブシステムを 使用できます。 Microsoft でホストされるエージェント には、既定で Bash がプレインストールされています。

次の例では、ビルドをトリガーするかどうかの決定に役立つ Bash タスクを実行します。

trigger:
    batch: true
    branches:
        include:
        - main
steps:
- bash: |
    echo "Hello world from $AGENT_NAME running on $AGENT_OS"
    case $BUILD_REASON in
            "Manual") echo "$BUILD_REQUESTEDFOR manually queued the build." ;;
            "IndividualCI") echo "This is a CI build for $BUILD_REQUESTEDFOR." ;;
            "BatchedCI") echo "This is a batched CI build for $BUILD_REQUESTEDFOR." ;;
        *) $BUILD_REASON ;;
    esac
  displayName: Hello world

PowerShell は、スクリプトのオプションでもあります。 pwshショートカットは、macOS、Linux、または Windows で PowerShell 7.x を実行します。 エージェントには PowerShell 7.x がインストールされている必要があります。 Microsoft でホストされるエージェント には、既定で PowerShell 7.x がインストールされています。

プラットフォームに基づく切り替え

パイプライン ロジックを複製するためのプラットフォーム固有のスクリプトを作成すると、余分な作業が発生し、エラー リスクが増加します。 ただし、プラットフォーム固有のスクリプトを回避できない場合は、 条件 を使用して、使用しているプラットフォームを検出できます。

たとえば、ビルド エージェントの IP アドレスを取得するには、macOS、Ubuntu Linux ifconfig、Windows PowerShell の ip addr コマンドレットでGet-NetIPAddressを使用する必要があります。 次のパイプラインでは、条件を使用して、さまざまなプラットフォーム上のエージェントからその情報を取得します。

steps:
# Linux
- bash: |
    export IPADDR=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')
    echo "##vso[task.setvariable variable=IP_ADDR]$IPADDR"
  condition: eq( variables['Agent.OS'], 'Linux' )
  displayName: Get IP on Linux
# macOS
- bash: |
    export IPADDR=$(ifconfig | grep 'en0' -A3 | grep inet | tail -n1 | awk '{print $2}')
    echo "##vso[task.setvariable variable=IP_ADDR]$IPADDR"
  condition: eq( variables['Agent.OS'], 'Darwin' )
  displayName: Get IP on macOS
# Windows
- powershell: |
    Set-Variable -Name IPADDR -Value ((Get-NetIPAddress | ?{ $_.AddressFamily -eq "IPv4" -and !($_.IPAddress -match "169") -and !($_.IPaddress -match "127") } | Select-Object -First 1).IPAddress)
    Write-Host "##vso[task.setvariable variable=IP_ADDR]$IPADDR"
  condition: eq( variables['Agent.OS'], 'Windows_NT' )
  displayName: Get IP on Windows

# use the value
- script: |
    echo The IP address is $(IP_ADDR)