(Azure Pipelines)手動トリガー時に Agent.Name を指定して実行する方法
ビルドタスクを Self hosted な環境で実行する場合に、たまに手動トリガーを使うことがあります。 何らかの障害原因調査などで特定のエージェントに対してビルドを実行するようなケースはあります。 そんな要件を満たすにはランタイム パラメータを使用します。
ここでは、ランタイム パラメータを使用して手動トリガー実行時にエージェント名を指定する方法についてまとめています。
Azure Pipelines の Runtime Parameters については以下のリンクを参照してください。
通常の手動トリガー
手動トリガーを使用する場合、パイプラインを実行しようとしても Demands を入力することができないため、特定のエージェントで実行することはできません。 Classic editor だと Demands を設定できるんですが、yaml ではそういった手段は存在しません。
# azure-pipelines.yml trigger: none jobs: - job: steps: - script: echo Hello, world! displayName: 'Run a one-line script'
シンプルな yaml ですが、手動でパイプラインを実行しようとするとこのように Demands を入力することはできません。
Runtime parameters
ランタイムパラメータは、パイプラインを実行する際に値を渡すことができます。 この機能を使うことでパイプラインの実行時にユーザーが動作を制御することができます。
イメージとしては以下のリンクが参考になると思います。
Runtime parameters を使用して Agent.Name を指定する
パイプライン実行時に Agent.Name を指定するには以下のように yaml を書き換えます。
ポイントはparameters
とdemands
部分です。
# azure-pipelines.yml trigger: none parameters: - name: agentName displayName: エージェント名(Option) type: string default: 'any' jobs: - job: pool: name: Self hosted pool demands: - ${{ if ne(parameters.agentName, 'any') }}: - Agent.Name -equals ${{ parameters.agentName }} steps: - script: echo Hello, world! displayName: 'Run a one-line script'
今回は、通常であればエージェントを指定することがなく、特定のシチュエーションのみエージェントを指定するような想定にしました。
人間が使用することを考慮してdisplayName
で分かりやすい表示名をつけておきましょう。
日本語も使用できるのでわかりやすさ重視で良いと思います。
parameters.agentName
の初期値はany
とし、それ以外の値が入力されていればエージェント名と判断しています。
なお、ランタイムパラメータは必須入力のため、default
に何も指定しなかったり空文字だと、以下のように Run ボタンが非活性になります。
分かりやすいdefault
の値を設定しておくのが良いでしょう。
ルートの demands でランタイムパラメータを使用することはできない
yaml のルートにあるpool
- demands
でランタイムパラメータを使おうとしても以下のようなメッセージが出力されて実行できません。
何故かはよくわかってないのですが、必ずjob
あるいはstage
配下のdemads
を使用しましょう。
/azure-pipelines.yml (Line: 16, Col: 5): A mapping was not expected
# azure-pipelines.yml trigger: none parameters: - name: agentName displayName: エージェント名(Option) type: string # ここに書いても動かない。 pool: name: Self hosted pool demands: - ${{ if ne(parameters.agentName, 'any') }}: - Agent.Name -equals ${{ parameters.agentName }} jobs: - job: steps: - script: echo Hello, world! displayName: 'Run a one-line script'
手動トリガーはリリース時などによく使用されると思いますが、状況に応じて動作を制御したい場合にランタイムパラメータは必須になってきます。
他にもvalues
で選択肢を予め設定しておくこともできるので、要件に合わせて柔軟に対応しましょう。