はじめに
(2019年7月現在)
Windows (特にVisual Studio)で開発をしているソフトウェアのUnit TestのCIを回すには、当たり前だがWindows環境が必要である。1
つまり、WindowsとVisual StudioがインストールされたVMが必要である。Windowsを無料で使える環境を準備してくれているCIサービスはいくつかある2が、その中でもVisual StudioのC++コンパイラをプライベートレポジトリに対して利用できるサービスは、ライセンス料の観点からか、MicrosoftのAzure DevOps中のAzure Pipelinesくらいしか見つけられなかった。Azure Pipelinesでは同時実行1で月間30時間まで無料で使えます3。
ただし、Azure Pipelinesでの設定例・実行例の多くは.NetアプリだったりWebアプリで、Windows + Visual Studio C++で開発するアプリケーションでのCI/CDに関しては、日本語の情報どころか、英語の情報も少ない。それどころかユーザーが少ないからか、今回セットアップが成功するまでWorkaroundが必要な問題点がいくつもあった。
Azure Pipelinesを使う
Azure Pipelinesとは
(2019年7月現在)
Azure Pipelinesとは、Azure DevOpsの中の1サービスである。
Azure DevOpsはMicrosoftの開発プラットフォームであり、マイナビの「Azure DevOps」でチーム開発を行おうによると、以下の5つのサービスをまとめたものになっている。
- Azure Boards
アジャイル開発やスクラムにおけるタスク管理システムである「カンバン」を提供するサービス。
- Azure Repos
Gitベースのソースコードバージョン管理のためのサービス。4
- Azure Pipelines
アプリケーションのビルドやデプロイを自動化するCI/CDサービス。
- Azure Artifacts
自身で作成したライブラリ、パッケージをチームで共有するためのホスティングサービス。
- Azure Test Plans
探索的テストを実行するためのサービス。探索的テストは事前に作成したテストケースをもとにテストを実施する記述式テストとは異なり、テストを実施しながらシステムの振る舞いに応じて次のテストを考えるテスト。
つまり、提供機能や見た目はGitLabとよく似ている。今回はこの中のPipelinesだけ使うことにする。
新規プロジェクト作成
Azure DevOpsにもGitLabやGitHubのようにOrganization, Projectといった単位があり、自由に作成できる。ここでは、あるアプリケーションのレポジトリのユニットテストをするとする。
まず、空のプロジェクトを作り、Pipelinesを選択すると次のような画面になる。Pipelinesから直接外部の
New pipneline
を選んでWebベースで作っていくことにする。
今回はOther Git
を選んで、GUIでPipelineの設定をする。
入力 | 説明 |
---|---|
Connection name |
gitの接続先のわかりやすい名前 |
Git repository URL |
レポジトリのURL(httpsで指定) |
User name |
(もし認証が必要なら)https認証のユーザ名 |
Password |
(もし認証が必要なら)https認証のパスワード |
注意点としては、ssh接続を指定すると、秘密鍵を指定する方法がないため接続できないので、https接続を指定すること。
今回はWindows classic desktop solution
に相当するので、.NET Desktop
を選択する。
すると、なんかそれっぽいパイプラインができている。VSのソリューションファイルがあるならこれでSave & queue
すればCIできそうな気がする。しかし、VC2019でもVC2017でもそのままでは動かない。
VC環境の闇(VC2019編)
(2019年7月現在)
早速だが、Azure PipelinesのAgent poolに登録されているHosted Windows 2019 with VC2019
は腐っている。どうやら、一つのイメージにインストールされているソフトウェアが多すぎてレジストリが壊れているらしい。
によると、PowerShellでレジストリを治せばいいらしい。
Set-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots' -Name KitsRoot10 -Value 'C:\Program Files (x86)\Windows Kits\10\'
このためには次のようにPowerShell Script
タスクを足して、Inline
を選択して、上のコマンドレットを実行すればよい。
Google Test Integrationの闇(VS2017編)
(2019年7月現在)
VC2017では、Google Test Integrationを自動では見つけてくれないというバグがある。
そのため、TestAdapterPath
のPath to custom test adapters
に以下の設定が必要である。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Extensions\drknwe51.xnq
実行結果の表示
(2019年7月現在)
そんなこんなで準備を終えると、右上のSave & queue
またはQueue
を押すとPipelineを実行することができる。ビルドとテストが成功すると、以下のようなテスト結果が表示される。
少しでもテスト結果が表示できれば、あとはどんどんテストを増やすのみ。どんどん書いていこう!
(参考)テスト設定のダウンロード
テストの設定はダウンロードできます。Builds
のQueue
ボタンの右側のメニューからExport
を選ぶと、json形式のファイルをダウンロードできます。手元で編集したjsonを使いたい場合はNew
からImport a pipeline
を選ぶとjsonファイルをアップロードできます。
まとめ
Visual StudioでのC++ソフトウェアの開発は、Intellisenseの存在など、開発環境としては素晴らしいのだが、CIサービスとしての利用が進んではいないのか、設定にはLinuxにはない闇が多くて、なかなか大変である。しかし、CIできるということは、開発者本人以外のビルド環境を構築できるということなので、開発を属人化させないためにも大切である。みんなどんどんテストを回そう!
-
ビルドツールであるMSBuildは無償で使えるし、Clangを利用すれば正確にはVisual Studioのライセンスを利用する必要はないはずだが、まだ未テストである。 ↩
-
2019年7月現在、Travis CIはC++コンパイラがないし、AppVeyorは非オープンソースでは有料になる。 ↩
-
https://docs.microsoft.com/en-us/azure/devops/organizations/billing/buy-more-build-vs?view=azure-devops を参照 ↩
-
gitのレポジトリホスティングサービスですが、MicrosoftはGitHubを買って持っています。今後これをどうするつもりなんだろうか? ↩