Azure DevOps Pipelines セルフホステッドエージェントをローカルのWindows x WSL2 x Dockerで実行する
はじめに
Azure DevOps の Pipelines ではホストマシンを自前で用意して pipeline を実行できる機能があります。
ローカルでもエージェントを設定して実行できることがわかったため、備忘として残します。
サイトはこちらを参考にしました。
ただ、古い情報なのか Windows の Docker が Hyper-V を前提としていて WSL2 じゃないんですよね。
ですので、Linux 側の手順を参考にしました。
準備
-
Docker を使えるようにしておく(Docker Desktop で OK)
-
参考リンクの手順通り以下を実施する
- Dockerfile を作成する(azp-agent-linux.dockerfile) ※1 ※2
- エージェント設定用スクリプトを作成する(azp-agent-in-docker/start.sh)
- Docker ビルドを実行する
-
Pipelines 側に定義の追加
- Azure Devops の Project Settings > Pipelines > Agent pools の画面にて「Add pool」ボタンを押下する

- 追加するエージェントプールの設定を入力する

- Azure Devops の Project Settings > Pipelines > Agent pools の画面にて「Add pool」ボタンを押下する
-
エージェント用の個人トークンを取得
- Azure DevOps 右上の設定アイコンから Personal Access Tokens を開く

New Tokenより追加する
- Azure DevOps 右上の設定アイコンから Personal Access Tokens を開く
注釈
- [※1]Docker イメージは既存 pipeline と合わせるため、ubuntu を選択しました。
- [※2]必要に応じて AWS CLI などのパッケージインストールを追加してください。(sudo は使えません)
実行
コマンドにてコンテナを起動しエージェントを開始します。
docker run -e AZP_URL="<Azure DevOps instance>" -e AZP_TOKEN="<Personal Access Token>" -e AZP_POOL="<Agent Pool Name>" -e AZP_AGENT_NAME="Docker Agent - Linux" --name "azp-agent-linux" azp-agent:linux
ファイルにしておくと便利です。
AZP_URL=https://dev.azure.com/[oragnization]
AZP_TOKEN=
AZP_POOL=test-agent-pool
docker run -e AZP_URL=$AZP_URL -e AZP_TOKEN=$AZP_TOKEN -e AZP_POOL=$AZP_POOL -e AZP_AGENT_NAME="Docker Agent - Linux" --name "azp-agent-linux" azp-agent:linux
AZP_URL はプロジェクトではなく、組織の URL で OK です。
起動すると Azure DevOps の設定 > Pipelines > Agent pool > 対象の pool > Agents に表示されるようになります。


pipeline の実行
セルフホステッドエージェントを使用する場合、yml 内の pool の指定を変更しておく必要があります。
pool:
name: "test-agent-pool"
この状態で pipeline が起動されると指定のセルフホステッドエージェント上で動くようになります。
サービスコネクションやセキュアファイルなどはそのまま使えました。
その他注意
onceオプションは JOB 単位で終了
JOB の単位で一旦実行停止されるため、複数 Stage ある場合、都度 docker run する必要があります。
パイプライン ジョブごとに新しいエージェント コンテナーが必要な場合は、—once フラグを run コマンドに渡します。
試してないですが、Kubernetes などのコンテナオーケストレーションシステムを使用すると、新しいコピーで開始できるらしいです。
コンテナオーケストレーション側にコンテナ終了したら新しいコンテナを立ち上げられる設定があるということですかね?
この辺全くわからないので、機会があるときに調べてみよう。
—once フラグを使用すると、Kubernetes や Azure Container Instances などのコンテナー オーケストレーション システムを使用して、ジョブの完了時にコンテナーの新しいコピーを開始できます
さいごに
Microsoft が用意したエージェントでできないことが発生した場合はセルフホステッドエージェントを検討するのはありだと思います。
無料分だと実行が遅い(らしい)というのもありますし、自前マシンで試してみるのもいいですね。
