GitLabにWindowsのrunnerを追加する

この記事は、シリーズ記事「[「C#のライブラリプロジェクトをGitLabにpushしたら自動でDLLが書き出されてついでにDocFXで作成されたドキュメントがCloud Run上にデプロイされる」っていうやつをやる](https://qiita.com/soumi/items/c13668052209a35a0965)」の一部です。

# はじめに

CI/CD が流行り出して久しいですが、なんだか難しそうなのと、環境の用意が大変そうだったので今まで敬遠していました。 
今回、[この記事](https://qiita.com/soumi/items/c13668052209a35a0965)で書いたようなモチベーションで GiLab 上で CI/CD をしてみる機会があったので、その時の手順をまとめてみようと思います。

僕の理解では、CI/CD は **「リポジトリに何か ``push`` したら自動的に他のサーバーが ``pull`` して、自動的に指定の処理を実行してくれる何か賢いやつ」** という認識です。

なので、まずはここでいうところの「何か賢い他のサーバー」を用意しなければいけません。この「何か賢い他のサーバー」を実現するのが、GitLab Runner と呼ばれるソフウェアになります。

https://docs.gitlab.com/runner/

以降インストールの手順を説明していきます。

# Windows の準備

まずは、実際に処理をする Windows 機を準備する必要があります。
前項で「何か賢い他の**サーバー**」と書きましたが、実は**必ずしもサーバー的な動き方をするマシンでなくても大丈夫**です。

GitLab Runner は、何か特別なポートを用いるような通信で GitLab 本体とリアルタイム通信しているわけではなく、実行すべきジョブがあるかどうかをポーリングして確認する仕様のようです。
なので、常にマシンが起動していなくても、立ち上がった時にジョブを確認しに行って、もしあればそれを処理する、というイメージですね。
常時起動のサーバーでなくても、お使いのラップトップも GitLab Runner になれます！
(運用的に使いやすいかは置いておいて)

## 必要なソフトのインストール

ここでいう必要なソフトは、どんな処理を GitLab Runner にさせるかによって変わって来ます。
例えば C# のコンパイルをするのであれば、以下のようなものが必要になるでしょう。

- MSBuild.exe
- .Net Framework SDK
- NuGet.exe

GitLab Runner を通さなくても、``PowerShell`` や ``cmd`` から目的の処理が出来るようになっていれば問題ないと思います。

# GitLab に Runnerを追加する

今回は .Net Framework のプロジェクトをビルドするので、Windows 機が必須です。
以下の手順で、Windows 機にインストールしていきます。

https://docs.gitlab.com/runner/install/windows.html

## ダウンロード

ファイルをダウンロードし、適当なフォルダに移動します。
ドキュメントでは、ダウンロードしたファイルを gitlab-runner.exe にリネームして

```powershell
C:\GitLab-Runner
```

に置いていますね。

## 登録

登録とインストールの順番がこれで良いのかわかりませんが、公式サイトの通りに登録から実行します。

登録には、まずGitLabのページに行って、登録に必要な情報を確認する必要があります。ここでいうGitLabは、**gitlab.comでも、オムニバス版のオンプレミスで動いているものでも同様です。**自分の環境に合わせて、適宜読み替えて下さい。

以下の場所に、Runner登録のための情報があります。

> プロジェクト > Settings > CI/CD > Runners

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321330/e8bf4597-a7a1-ce3c-9eff-9b3554461c3b.png)

登録の際に、この**アドレス**と**トークン**を使用します。

次に、管理者権限でPowerShell(orコマンドプロンプト)を起動します。
<img width="400px" alt="a80dfc83-2eac-d80b-e032-51bbc3ed0b03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321330/a80dfc83-2eac-d80b-e032-51bbc3ed0b03.png">

開いたら、以下のコマンドで登録処理が始まります。

```powershell
cd C:\GitLab-Runner
./gitlab-runner.exe register
```

ここから対話型で登録作業が始まるので、先程の情報を入れて下さい。
アドレスとトークン以外は任意のものを入れて下さい。

## インストールと実行

管理者権限でPowerShell(orコマンドプロンプト)を起動します。
開いたら、以下のコマンドを実行する事でインストールされます。

```powershell
cd C:\GitLab-Runner
./gitlab-runner.exe install
./gitlab-runner.exe start
```

この後、先程の GitLab の登録画面を確認に行くと、登録が反映されています。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321330/133fd66b-db26-710e-302d-1f41ebb0c9fd.png)


とても簡単ですね。
**ただ、この先で僕はハマりました…**

# ハマった事

詳細な CI の解説はここではしませんが、どういう問題が起こったかというと

**パスが通っているはずの処理が全く動かない！**

絶対パスを指定すれば動くものの、それが難しいものはどうやっても動作させる事が出来ませんでした。

## 原因

色々試行錯誤したり、色々調べた結果、以下の記事を発見しました。

GitLab Runner を Windows で動かす
http://kuttsun.blogspot.com/2017/12/gitlab-runner-windows.html

>しかし、これだと root で実行されてしまうため、実際に GitLab CI として動作させるときにコマンドが実行されなかったりしました。

登録の時に

```powershell
./gitlab-runner.exe install
```

としていたので、ビルドインシステムアカウントとしてサービスが実行されてしまっていたのです。
実行しているのは僕自身のユーザーアカウントで、環境変数 ``Path`` の内容は当然システムアカウントとは違います。
これが原因でした…

## 解決策

参考サイトに従っていきます。

### サービスを開く

面倒なので、僕は検索から開きます。

<img width="400px" alt="fedb0471-5037-1008-67b7-069f554e79c6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321330/fedb0471-5037-1008-67b7-069f554e79c6.png">

### gitlab-runnerのプロパティを選択

<img width="600px" alt="6e2706a7-6f12-e665-2f86-9512a8ed4e45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321330/6e2706a7-6f12-e665-2f86-9512a8ed4e45.png">

### ログオンタブから、ローカルアカウントを選択

基本的には現在ログインしているユーザーでログインしたら良いと思います。

<img width="400px" alt="8553244b-3240-6eba-32b2-cfd01e37cf08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321330/8553244b-3240-6eba-32b2-cfd01e37cf08.png">

### サービスを再起動

<img width="600px" alt="bff10c4f-14ed-4796-5549-b2822349a981.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321330/bff10c4f-14ed-4796-5549-b2822349a981.png">

以上で完了です。


僕はこの誤った手順を踏んだ上で、後から修正する方法で動くようにしたので、正規の方法ではどのようにしたら良いのかはわかりません。

しかし、上記のサイトによると

> こちらの記事にあるとおり、ユーザー名を指定すると上手くいかないので、パスワードだけ指定し、現在ログイン中のユーザーでインストールします。

とあるので、考えうる正規のルートで登録しても、結局同じようなステップを踏む必要があるかもしれません。

# おわりに

ハマった所もありましたが、思っていたより GitLab Runner 導入の敷居は低く感じました。
Runner を用いて実際にどのように CI を設定するのかは、[この辺り](https://qiita.com/soumi/items/ae24cf779ca539b875d6)に僕も書いていますので、良ければ見てみて下さい。