GitLabのWindows VMを使ってWindows Form App ( .NET Framework ) の CI [ビルド・テスト]

## はじめに
どうも！生産技術部のエンジニアです。[GitLabの公式ブログ 2020.01.21](https://about.gitlab.com/blog/2020/01/21/windows-shared-runner-beta/)によると、Windows Shared Runners ベータ版が利用可能になったということで実際に試してみました。ベータ版ということでこれから改善されていくことだろうと思いますが、まずはビルド、テストが通ったことに嬉しく思います。CIの結果は以下の通りです。

* ビルド結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/f331d84a-cd02-d1c7-93ec-c35a0f8b5c59.png)

* テスト結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/8c0d5286-9089-9ebf-b0b6-aa2bfb18b41a.png)


## 環境
* GitLab Enterprise Edition : 13.3.0-pre
* Microsoft Visual Studio Community 2019 : 16.7.1

## 前提条件
Visual Studioの導入及びプロジェクトの作成が実施済みであること。

* [Visual Studio で C# を使用して Windows フォーム アプリを作成する](https://docs.microsoft.com/ja-jp/visualstudio/ide/create-csharp-winform-visual-studio?view=vs-2019)
* [Windowsフォームアプリケーションの単体テストの作成方法](http://yakiben3584.blog.fc2.com/blog-entry-7.html)

## GitLabのプロジェクト作成
GitLab -> New project -> Create From template -> .NET Core のテンプレートで作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/5e31134b-ef63-24d1-285f-fb0efc5f718c.png)

## リポジトリに作成したVisual Studioのプロジェクトを追加
* ファイル構成は、GitLabからクローンしたテンプレートに、Visual Studioのプロジェクトをそのまま貼り付けました。
* テストは、Testsディレクトリを作成し、以下にテスト用のプロジェクトを追加しました。
* [.gitignore](https://www.toptal.com/developers/gitignore/api/visualstudio)は、gitignore.ioのvisual studio用テンプレートに置き換えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/23df7cd0-5b35-b7a1-72ba-16175a941f54.png)

## .gitlab-ci.ymlを追加
* 公式ブログの参考例に対してscript部分を追記しました。
* [.Net FrameworkやMSBuildなどのツール類](https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/gcp/windows-containers/-/tree/master/cookbooks/preinstalled-software)は、予めWindowsのVMにインストールされていますので、パスや実行方法を間違えなければインストール無しで実行できます。
* パスに空白が含まれるためダブルクウォートでくくり、PowerShellでEXEを実行するため頭に`&`を付けています。
* テストのスクリプトは、テストで使用するパッケージの追加、ビルド、テストの実行を行っています。
* 注意点：`vstest.console.exe`は、[Microsoft公式](https://docs.microsoft.com/ja-jp/visualstudio/test/vstest-console-options?view=vs-2019)のパスを試しましたが、Windows VMのCommonExtensionsには、`vstest.console.exe`が見つかりません。と出ましたので、Extensionsのものを使うようにパスを変更しています。
 
```yml:.gitlab-ci.yml
.shared_windows_runners:
  tags:
  - shared-windows
  - windows
  - windows-1809

stages:
  - build
  - test

before_script:
 - Set-Variable -Name "time" -Value (date -Format "%H:%m")
 - echo ${time}
 - echo "started by ${GITLAB_USER_NAME}"

build:
  extends:
  - .shared_windows_runners
  stage: build
  script:
  - '& "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe" UVWCalibrator.csproj'

test:
  extends:
  - .shared_windows_runners
  stage: test
  script:
  - '& "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe" -t:restore'
  - '& "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe" Tests\UVWCalibratorTests\UVWCalibratorTests.csproj'
  - '& "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\Common7\IDE\Extensions\TestPlatform\vstest.console.exe" Tests\UVWCalibratorTests\bin\Debug\UVWCalibratorTests.dll'

```
## 注意点：パッケージの復元
Windows Formのプロジェクトは、上記のciが正常に動きません。テストでは、MSTest.TestAdapterとMSTest.TestFrameworkの２つのパッケージを使うため、`MSBuild.exe -t:restore`を実施していますが、インストールが必要なパッケージが見つからずに終了します。[VisualStudio2017以降のプロジェクトをMSBuildでNuGetパッケージ復元する](https://www.hos.co.jp/blog/20190813/)、に従って設定することで上手く動くようになります。正しく設定が出来ると、ソリューションエクスプローラの参照に追加されえます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/8c66fc3c-baf5-18a3-02ff-ab1120fad5c6.png)

## 最後に
以上で、セットアップが完了です。お疲れさまでした。WindowsのCI/CDはやりにくい部分が多かったですが、この様なWindows VMは、今後の開発効率に大きく貢献すると思っています。