しばやん雑記

Azure Serverless とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Pipelines の Self-hosted agent を簡単に作ってみた

これまで Azure Pipelines は Microsoft-hosted agents しか使ってこなかったのですが、何となく Self-hosted agents を作って試しておきたくなったので Azure VM を使って作ってみました。

ドキュメントは OS 毎に用意されていますが、今回は Windows で試してみました。

まずは Azure DevOps で Personal Access Token を作成しておく必要があります。今回はテストだったので 90 日ぐらいの有効期間が短い PAT を作成しましたが、本来なら無制限ぐらいで作らないと数か月後に死ぬことになるでしょう。ドロップダウンには 90 日以降はないので、Custom defined を選択して自分で選びます。

Scopes は Agent Pools に Read & manage を付けるだけで良いです。Show all scopes を選ばないと Agent Pools の Scope は表示されないので、少し注意したいです。

f:id:shiba-yan:20200407020923p:plain

PAT を作成した後は、適当に Azure VM に Windows Server 2019 をデプロイしました。

インスタンスサイズは何でも良いですが、B シリーズを使っておきました。常時動くわけではないし、CPU のバーストは CI 用途では非常に都合が良いです。

f:id:shiba-yan:20200407021444p:plain

VM のデプロイが終われば、後は Azure Pipelines Agent をインストールするだけですが、Remote Desktop で設定するとかやりたくないので、VM Extension を使ってインストールさせました。

VM Extension を使うと Custom Script を実行できるので、それを使って Agent をインストールします。

本来なら Microsoft が公式に Azure Pipeline Agent の VM Extension を用意しておいてほしいところですが、残念ながら Deployment Agent 向けしか用意されていません。*1

とりあえず Agent 新規追加の時に表示されるコマンドを適当に posh に起こしました。

param ([string] $url, [string] $token, [string] $pool, [string] $agent)

mkdir "c:\agent"
cd "c:\agent"

Invoke-WebRequest -Uri https://vstsagentpackage.azureedge.net/agent/2.165.2/vsts-agent-win-x64-2.165.2.zip -Out vsts-agent-win-x64.zip

Expand-Archive -Path vsts-agent-win-x64.zip -DestinationPath $pwd

del vsts-agent-win-x64.zip

.\config.cmd --unattended --url "$url" --auth pat --token "$token" --pool "$pool" --agent "$agent" --replace --runAsService

適当なファイルとして保存して、Azure Portal で VM を開いて表示される Extensions から Custom Script を選ぶと、アップロードとスクリプトの引数を指定できます。

pool は DevOps の設定にある Agent pools から作るか、とりあえず最初から存在する Default を使えば良いです。agent 名は適当に付ければ良いです。

f:id:shiba-yan:20200407020939p:plain

今回は既に VM をデプロイしていたので後から VM Extension をインストールしましたが、デプロイのタイミングで同時に指定したり、ARM Template や Terraform を使って同時にデプロイしても問題ないです。

Agent のインストールが完了すると、Agent pools に作成した agent が表示されるようになります。

f:id:shiba-yan:20200407020955p:plain

この画面からインストールされている Agent のアップデートやメンテナンスが行えるので、Remote Desktop で都度メンテナンスをするといった運用が必要ないのは結構良い感じです。*2

これで Self-hosted agent が作成できたので、適当な YAML 定義を使って試してみます。

trigger:
- master

stages:
- stage: Windows
  jobs:
  - job: Windows
    pool:
      vmImage: 'windows-latest'
    steps:
    - script: ipconfig /all

- stage: Linux
  jobs:
  - job: Linux
    pool:
      vmImage: 'ubuntu-latest'
    steps:
    - script: ip addr

- stage: SelfHosted
  jobs:
  - job: SelfHosted
    pool: Default
    steps:
    - script: ipconfig /all

Microsoft-hosted の場合は vmImage を使って OS を指定していましたが、Self-hosted agent では Pool 名を指定します。Pool には複数の Agent を含めることが出来ますが、YAML 側で Agent が持つ情報に従ってどれを使うか指定できます。OS やインスタンスサイズを指定したいことは多いでしょう。

上の YAML を使って実行してみました。問題なく Self-hosted agent でも動作していることが確認できます。

f:id:shiba-yan:20200407021138p:plain

Windows だけではなく Linux でも試してみたかったのですが、Linux 力が低すぎて VM Extension や cloud-init で Azure Pipelines Agent を上手くインストールする方法が分かりませんでした。

とはいえ、手動でインストールするのは非常に簡単です。ドキュメントもあります。

途中まで書いていたスクリプトを置いておきます。基本的には Windows 版と同じです。

mkdir ~/agent
cd ~/agent

curl -Lso vsts-agent-linux-x64.tar.gz https://vstsagentpackage.azureedge.net/agent/2.165.2/vsts-agent-linux-x64-2.165.2.tar.gz

tar zxvf vsts-agent-linux-x64.tar.gz

rm vsts-agent-linux-x64.tar.gz

./config.sh --unattended --url $1 --auth pat --token $2 --pool $3 --agent $4 --replace

sudo ./svc.sh install
sudo ./svc.sh start

適当な名前で保存して、以下のようなパラメータを与えて実行するとインストールされます。

./install-pipelines-agent.sh https://dev.azure.com/*** <PAT> <POOL> <AGENT>

Agent はログイン中のユーザーとして動くようになるはずなので、そこだけは注意が必要です。

ここまで VM Extension を使って Azure Pipelines Agent を作ってみましたが、Terraform Module として公開してくれている人がいるので、Terraform で構築したい場合は使ってみると良いと思います。

個人的には Terraform で作る必要はないかなという印象を持ったので試していません。

そもそも出来る限り VM の利用は避けたいと思っているので、基本的には Microsoft-hosted な Agent を使っていき、どうしても必要な部分だけは Self-hosted な Agent を使うつもりでいます。具体的にはアプリケーションのデプロイ周りです。

*1:実体は同じなので問題なく動く気もするが試していない

*2:Azure Pipelines Agents - Azure Pipelines | Microsoft Docs