GitLabで.Net FrameowrkのソフトのCI環境を整える

# はじめに

業務上の都合により、Windows Formアプリに関するCI環境を整えることになり、
色々検索していった所GitLabのCI/CDパイプラインである程度どうにかできそうな手がかりを得た。

ただ、色々とかなり複雑に感じたため、忘備録として資料を残しておく

# 環境

Windows10(Home Editionでも動作可能なはず。)
RaspberryPi(GitLab動作用)

# 大まかな手順

1. GitLabのセットアップ
  * RaspberryPi上にGitLabをインストールする
  * リポジトリの準備
1. Windows側のセットアップ
  * Windowsでgitlab-runnerをダウンロードし、インストールする
  * NetCoreバージョンのPowershell(pwsh.exe)をインストールする
  * 何らかの方法で(手段は問わない)pwsh.exeへのパスを通す
  * .NetFrameworkのツールのインストールを行う
     * ビルドツール
     * テストツール
1. Windows上のRunnerをGitLabへ登録する
1. Jobの設定

# GitLabのセットアップ

これは[公式ホームーページのReapberryPi用のインストール手順ページ](https://about.gitlab.com/install/#raspberry-pi-os)に従うだけだから割愛する。
セットアップが完了したら、CI環境を整えたいレポジトリを作成しておく。

# Windows側のセットアップ

## Runnerのダウンロードとサービスへの登録

下記を参照すれば、とりあえずgitlab-runnerは登録できる。
ただし、自分の場合は何をやっても自分のアカウントでサービスとしてrunnerを立ち上げることができなかった。

https://qiita.com/soumi/items/3344dc2fa9538929390b

ちなみにこの時点で他の設定を整えて動かそうとしたらこのようなエラーが出る。
.NetCore版のPowershell(pwsh)のインストールと環境変数の調整が必要となるようだ。
(※ログが長すぎたので改行しています。)

```text
ERROR: Job failed (system failure): 
prepare environment: 
failed to start process: 
exec: "pwsh": 
executable file not found in %PATH%. 
Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
```

## .NetCore版のPowershellのインストール

最新のPowershellでは.Net Core 6.0が必要になる。.Net Core 6.0も一緒にダウンロードしよう。
Powershellのインストール方法にはいくつか方法があるが、多分msiを使用するのが無難だと思う。

PowerShellのインストールサイト

https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.2

.Net 6.0(Powershellに必要なライブラリ)のダウンロードサイト

https://dotnet.microsoft.com/en-us/download

自分は「.NET グローバル ツールとしてインストール」からインストールしてしまったため、後でpwsh.exeへのパスを調べてシステムの環境変数に追加する必要が出てしまった。

## その他必要なツールのインストール

Visual Studio 2019の時点では、.Net FrameworkのアプリのテストにはMSTestを使用するようだ。
その場合は下記記事の「コンソールでUnitTestを実施」以降を参考にすれば良い。

https://qiita.com/tera1707/items/d4eed940af88215b58bf

あとは使用した環境に一致したBuild ToolsをAgentsをダウンロードしたサイトからダウンロードしよう。
この記事投稿時点(Visual Studio **2022**)の時点では、各ツールへのパスは下記の通り。
(2022以外を使う場合は下記の2022の数字を変更すればよさそうだ。)

* ビルドツール
  * ```C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\Current\Bin\MSBuild.exe```
* テストツール
  * ```C:\Program Files (x86)\Microsoft Visual Studio\2022\TestAgent\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe```

ビルドはともかく、テストツールはどのように動くのかわかってないから試しに動かしてみる。
下記のようにコマンドを送って試してみた。

```powershell
$mstest = "C:\Program Files (x86)\Microsoft Visual Studio\2022\TestAgent\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe"
$testtarget = ".\(テストプロジェクト)\bin\Release\MainTest.dll"
cd (ソリューションのディレクトリ)
& "$mstest"  "$testtarget"
```

出力結果はこんな感じ。

```text
Microsoft (R) Test Execution Command Line Tool Version 17.0.0
Copyright (c) Microsoft Corporation.  All rights reserved.

テスト実行を開始しています。お待ちください...
合計 1 個のテスト ファイルが指定されたパターンと一致しました。
  成功 TestMethod1 [5 ms]

テストの実行に成功しました。
テストの合計数: 1
     成功: 1
合計時間: 1.4221 秒
```

# RunnerのGitLabへの登録

これは上の方のリンク「GitLabにWindowsのrunnerを追加する」を参考にすれば問題ないので割愛します。

# Jobの設定

まずは動作確認をしたかったので、サンプルに「windows」のタグだけ追加してみた。
(runnnerで指定しているタグを過不足なく入れておく必要があります)

```yml:.gitlab-ci.yml
stages:          # List of stages for jobs, and their order of execution
  - build
  - test

build-job:       # This job runs in the build stage, which runs first.
  stage: build
  tags:
    - windows
  script:
    - echo "Compiling the code..."
    - echo "Compile complete."

unit-test-job:   # This job runs in the test stage.
  stage: test    # It only starts when the job in the build stage completes successfully.
  tags:
    - windows
  script:
    - echo "Running unit tests... This will take about 60 seconds."
    - sleep 60
    - echo "Code coverage is 90%"
```

このファイルが含まれるコードを実際にPushしたら次のような動作になった。

![サンプルジョブ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395414/3305fc3e-ef6a-1185-f225-363b5b99a1d3.png)

とりあえず、適当なスクリプトをWindows上で動かせるようになったので、
今後はこの環境を使って実際に色々動かして試してみることにする。