Azure DevOpsのself hosted agentを試してみた
暑いので快適な仕事部屋で、CodeCoverageと戦っているわたなべです...
self hosted agent試すことになった理由
現在開発中の案件では、Azure DevOpsを利用して、CI/CD環境を構築しています。バックエンドはPHPで開発していて、UnitTestを結構しっかり書いています。
開発作業に追われてなかなか手をつけられていなかった Code Coverage を見ようと設定をしたところ、以下のようなエラーが発生してしまいました。
表示されているリンクの内容を確認すると...
For 60 minutes on Microsoft-hosted agents with a private project or private repository
ということで、Microsoft-hosted agentsでプライベートリポジトリのjobを実行する場合は、60分
の実行時間制限がある様子。
Web系のアプリのCI/CDであれば、実行に60分もかかることはほとんどないと思いますが、今回はCode Coverageを収集するために Xdebug を有効にしてテストを実施しているため通常より実行にかなりの時間がかかることが原因でした。(通常のCI/CDのpipelineではCode Coverageは取得していません)
phpdbgを利用すると速度はかなり改善するのですが、こちらはメモリの非常に大量に消費します。
また、今年公開されたばかりのPCOVを使用すると実行速度、メモリ使用量共に劇的に改善できそうなのですが、PHPUnit8でないと対応していないため、今回使用しているCakePHPのアプリには現状適用できません。
ということで、 Xdebug を使う方式でなんとか CodeCoverageを取るしかなさそうです...。
そこで、今まで使ったことのなかった、self hosted agentを試すことにしました。
agentの種類
Azure DevOpsのagentには以下の2つの提供方式があります。
Microsoft-hosted agents
Microsoft-hosted agentsは、MSさんが提供しているagentで以下のような種類があります。
- Windows Server 2012 R2 with Visual Studio 2015 (Hosted)
- Windows Server 2016 with Visual Studio 2017 (Hosted VS2017)
- Windows Server 2019 with Visual Studio 2019 (Hosted Windows 2019 with VS2019)
- Windows Server Core 1803 (Hosted Windows Container)
- Ubuntu 16.04 (Hosted Ubuntu 1604)
- macOS X Mojave 10.14 (Hosted maxOS)
- macOS X High Sierra 10.13 (Hosted macOS High Sierra)
Microsoft-hosted agentsの制限事項は以下の点。
Self-hosted agents
自前のVMなどに、agentをインストールしてAzure DevOpsから利用することが出来ます。Azure DevOpsにはSelf-hosted agents 1つであれば無料で利用することができるので、VMの利用料のみで使用可能です。また、Docker上での実行もサポートされているので、k8s上で実行することもできそうです。
Self-hosted agentsの場合は、実行時間の制限はありません。
self hosted agentの設定
今回は実験ということで、VMを1台立ててagentをインストールすることにします。
dockerのインストール
今回のjobではdocker-composeを使用するのでまずは、dockerをインストールします。
$ sudo apt install -y docker docker-compose $ sudo usermod -g docker user
agent用ディレクトリを作成
実験で使用するjobの設定がhosted agentのディレクトリ構成に依存しているので以下のディレクトリを作成しました。依存しないように直したほうが良いですね...
$ cd /home $ sudo mkdir vsts $ sudo chown user.user vsts
PAT(Private access token)を生成
ここを参考に、利用するdevops organizationのPATを作成する。
作成したPATは、agentインストール時に使用します。
agentのインストール
- Azure DevOpsの Organization SettingsからAgent Poolを選択します。
- Default poolを選択して、
New Agent
ボタンを押すと以下のようなインストール手順の解説が表示されます。
ここで取得できる、agentのダウンロードURLを使用して、指示通りに設定を進めます。
$ mkdir agent $ wget https://vstsagentpackage.azureedge.net/agent/2.155.1/vsts-agent-osx-x64-2.155.1.tar.gz $ cd agent $ ./config.sh >> End User License Agreements: Building sources from a TFVC repository requires accepting the Team Explorer Everywhere End User License Agreement. This step is not required for building sources from Git repositories. A copy of the Team Explorer Everywhere license agreement can be found at: /home/kaz/agent/externals/tee/license.html Enter (Y/N) Accept the Team Explorer Everywhere license agreement now? (press enter for N) > Y >> Connect: Enter server URL > https://dev.azure.com/[your organization]/ Enter authentication type (press enter for PAT) > PAT Enter personal access token > [your personal access token] Connecting to server ... >> Register Agent: Enter agent pool (press enter for default) > Enter agent name (press enter for devopsagent) > Scanning for tool capabilities. Connecting to the server. Successfully added the agent Testing agent connection. Enter work folder (press enter for _work) > /home/vsts/work 2019-08-03 01:55:47Z: Settings Saved.
agentの実行
以下のコマンドで、agentをserviceとして登録できます。
$ cd ~/agent $ sudo ./svc.sh install ## Start $ sudo ./svc.sh start ## Stop $ sudo ./svc.sh stop ## Status $ sudo ./svc.sh status
Pipelineの設定
agentが正常に起動すると、インストール時に指定したorganizationのagent poolに表示されます。
agent が登録されたら、あとは既存のbuild pipelineをコピーするなどして、以下のように使用するagent poolを指定すれば完了です。
まとめ
self hosted agentは以外に簡単に導入できました。
Docker上での実行もサポートされているようなので、今回のプロジェクトではステージング環境のAKSクラスタ上でカバレッジ用のagentを実行できないか検討しているところです。
CIが成長してくると、ビルド時間との戦いになることはよくあることではないかと思います。 テスト、ビルド手順の見直しも必要ですが、CI環境自体をパワーアップして改善する必要があることもあります。 その際の手法として、self hosted agentはかなり有効だと思います。