Microsoftが提供するMicrosoft hostedエージェントは便利なのですが、性能(2コア)やディスクが足りない(上限10GB)、などの理由で独自エージェントを立てたいという理由はよくあります。
OSに一からVSなどを入れるのは少々めんどくさいです。そんなときのためにMicrosoftからMicrosoft Hosted agentと同じエージェントを作るための仕組みが提供されています。
PowerShell DSCではなく、Packerで作ります。LinuxやmacOSもサポートしないといけないからでしょう。
GitHubのリリースのページから作りたいイメージをダウンロードします…といっても、同じバージョン(M150等)であれば、どれを選んでも中身は一緒です。レポジトリをgit cloneして固めてるだけなので。
今回はVS2019 on Windows Server 2019を選びます。
- 展開したファイルのazure-pipelines-image-generation-vs2019-150.1\images\winフォルダを開きます。
- vs2019-Server2019-Azure.json というファイルがテンプレートファイルです。このファイルから一か所変更します。
"install_password": null
となっています。ここもほかの値と同様に外だしの変数として取得するようにします。
"install_password": "{{env `ARM_PASSWORD`}}"
次にPackerで使用するclient_id, client_secret, subscription_id, tenant_id, object_idを取得します。とはいっても難しいことはなくて、Azureのドキュメントで解説されているので、ここにあるPowerShellスクリプトを動かすだけです。
Visual Studio 2017を入れてしまっている人は、アプリと機能から"Microsoft Azure PowerShell - April 2018"を削除して、AZモジュールを使ってください。ドキュメントは今Azモジュール前提で書かれています。
- Connect-AzAccount
- リソースグループ作成
- 資格情報の作成
ここまでは上のドキュメントにも載っています。次、このスクリプトを実行するためにはリソースグループと同じリージョンにストレージアカウントが必要です。PackerそのものはManaged Diskをサポートしているようですが、このAzure DevOpsエージェントを作るjsonはストレージアカウント前提です。
この辺の値が取れたら、必要な値を別のjsonに書いて、packerを実行します。
{ "client_id": "ないしょ", "client_secret": "ないしょ", "tenant_id": "ないしょ", "subscription_id": "ないしょ", "object_id": "ないしょ", "location": "Japan East", "resource_group": "リソースグループ名", "storage_account": "ストレージアカウント名", "install_password": "パスワード" }
packer build -var-file=作ったjson vs2019-Server2019-Azure.json
これでひたすら待ちます。私はVSのインストールが無応答状態になって、結局諦めたんですが、たぶんこのjsonをそのまま使ったら少なくとも6-7時間はかかると思います。サーバーなどの起動しっぱなしマシンでやるのがいいと思います。
このテンプレートから必要ない古いコンポーネントを削除するとか、逆に必要なDockerイメージをキャッシュしておくとか、カスタマイズはいろいろできると思います。
一度ゴールデンイメージができたら、あとはsysprep済みのVMイメージがストレージアカウントに入っているので、VMとして起動するとか、もしくはダウンロードしてローカルのHyper-Vにマウントしてしまうとか、いろいろ方法はあると思います。