Help us understand the problem. What is going on with this article?

C++でGoogle Testを利用したWindowsアプリケーションのCI

はじめに

(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にもGitLabGitHubのようにOrganization, Projectといった単位があり、自由に作成できる。ここでは、あるアプリケーションのレポジトリのユニットテストをするとする。

まず、空のプロジェクトを作り、Pipelinesを選択すると次のような画面になる。Pipelinesから直接外部の

image.png

New pipneline を選んでWebベースで作っていくことにする。

image.png

今回はOther Gitを選んで、GUIでPipelineの設定をする。

image.png

入力 説明
Connection name gitの接続先のわかりやすい名前
Git repository URL レポジトリのURL(httpsで指定)
User name (もし認証が必要なら)https認証のユーザ名
Password (もし認証が必要なら)https認証のパスワード

注意点としては、ssh接続を指定すると、秘密鍵を指定する方法がないため接続できないので、https接続を指定すること。

image.png

今回はWindows classic desktop solutionに相当するので、.NET Desktopを選択する。

image.png

すると、なんかそれっぽいパイプラインができている。VSのソリューションファイルがあるならこれでSave & queueすればCIできそうな気がする。しかし、VC2019でもVC2017でもそのままでは動かない。

VC環境の闇(VC2019編)

(2019年7月現在)

早速だが、Azure PipelinesのAgent poolに登録されているHosted Windows 2019 with VC2019は腐っている。どうやら、一つのイメージにインストールされているソフトウェアが多すぎてレジストリが壊れているらしい。

https://developercommunity.visualstudio.com/content/problem/539158/hosted-windows-2019-with-vs2019-is-failing-builds.html

によると、PowerShellでレジストリを治せばいいらしい。

Set-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots' -Name KitsRoot10 -Value 'C:\Program Files (x86)\Windows Kits\10\'

このためには次のようにPowerShell Scriptタスクを足して、Inlineを選択して、上のコマンドレットを実行すればよい。

image.png

Google Test Integrationの闇(VS2017編)

(2019年7月現在)

VC2017では、Google Test Integrationを自動では見つけてくれないというバグがある。

https://developercommunity.visualstudio.com/content/problem/215878/vstestconsoleexe-fails-to-run-the-gtest-unit-tests.html

そのため、TestAdapterPathPath to custom test adaptersに以下の設定が必要である。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Extensions\drknwe51.xnq

image.png

実行結果の表示

(2019年7月現在)

そんなこんなで準備を終えると、右上のSave & queueまたはQueueを押すとPipelineを実行することができる。ビルドとテストが成功すると、以下のようなテスト結果が表示される。

image.png

少しでもテスト結果が表示できれば、あとはどんどんテストを増やすのみ。どんどん書いていこう!

(参考)テスト設定のダウンロード

テストの設定はダウンロードできます。BuildsQueueボタンの右側のメニューからExportを選ぶと、json形式のファイルをダウンロードできます。手元で編集したjsonを使いたい場合はNewからImport a pipelineを選ぶとjsonファイルをアップロードできます。

image.png

まとめ

Visual StudioでのC++ソフトウェアの開発は、Intellisenseの存在など、開発環境としては素晴らしいのだが、CIサービスとしての利用が進んではいないのか、設定にはLinuxにはない闇が多くて、なかなか大変である。しかし、CIできるということは、開発者本人以外のビルド環境を構築できるということなので、開発を属人化させないためにも大切である。みんなどんどんテストを回そう!


  1. ビルドツールであるMSBuildは無償で使えるし、Clangを利用すれば正確にはVisual Studioのライセンスを利用する必要はないはずだが、まだ未テストである。 

  2. 2019年7月現在、Travis CIはC++コンパイラがないし、AppVeyorは非オープンソースでは有料になる。 

  3. https://docs.microsoft.com/en-us/azure/devops/organizations/billing/buy-more-build-vs?view=azure-devops を参照 

  4. gitのレポジトリホスティングサービスですが、MicrosoftはGitHubを買って持っています。今後これをどうするつもりなんだろうか? 

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away