【GitLab CI/CD】GitLab Runnerを設定する

# 概要

GitLab CI/CDを使用するまでのGitLab Runnerサーバの設定手順を記載します。

後述しますがgitlab.comの場合、無料で使用可能なShared runnersと呼ばれるRunnerも存在しますが、課金をしていない場合、自分専用(プロジェクト専用)のRunnerを用意しておいたほうが、気兼ねなく使うことが便利なため、設定しておくことをおすすめします。


# 前提知識

## GitLab Runner について

ビルド用のサーバにはGitLab Runnerと呼ばれるツールをインストールします。
Runnerは専用のビルドサーバにインストールしますが、GitLabにアクセスできる環境であれば、開発用端末や、検証用の端末(社内検証用環境等)にインストールしてそこでビルド等を行うことも可能です。


![ci-cd-architecture_2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/9f2bd914-405e-2f16-e9d9-dddf8b27feba.png)
画像引用元:https://www.gitlab.jp/stages-devops-lifecycle/continuous-integration/

手順的には https://docs.gitlab.com/runner/install/ を見ながらインストールしていきます。


## GitLab Runnerの種類について

Runnerは以下の種別が存在します。

- [Specific runners](https://docs.gitlab.com/ee/ci/runners/runners_scope.html#specific-runners) : 特定のリポジトリでのみ利用可
    - プロジェクトの管理者権限が必要
- [Group runners](https://docs.gitlab.com/ee/ci/runners/runners_scope.html#group-runners): 特定グループ内で利用可
    - グループの管理者権限が必要
- [Shared runners](https://docs.gitlab.com/ee/ci/runners/runners_scope.html#shared-runners): 全てのリポジトリで利用可
    - Shared runnersはセルフマネージドサーバの場合はGitLabの管理者権限があれば作成可能
    - gitlab.comの場合は用意されているが制限あり(独自で作成は不可)
        - [2020年09月14日時点の制限](https://www.gitlab.jp/releases/2020/09/14/ci-minutes-update-free-users/)
            - 非課金ユーザーの場合、月に400分まで、課金額に応じて5,000分まで利用可能になる
        - お試しで使いたい場合や頻繁に動かさないプロジェクトであれば課金なしでも十分使用可能


## executorについて

参考: https://docs.gitlab.com/runner/executors/

- Shell
    - Runnerをインストールしたサーバ上でジョブを行う
    - Runnerをインストールしたサーバにコードを落としてきてビルドを行うため、Runnerをインストールしたサーバに誰でもアクセスできる状態であるならば、セキュリティ上よろしくない
        - → 参考: https://docs.gitlab.com/runner/executors/shell.html#security
    - 
- Docker
    - Dockerコンテナ内でジョブを実行する(ジョブごとにコンテナが生成される)
- 他にもありますが割愛(主にShellかDocker辺りを使えばある程度できるかと思います)

# 手順

Specific runnersの場合: プロジェクトの設定 > CI/CD > Runner
Group runnersの場合: グループの設定 > CI/CD > Runner

からインストール・登録の手順と登録時に必要なトークンが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/65d9ac04-49f2-6411-2a11-d8524768892b.png)


<details>
<summary>
executor: shell, Docker(Runnerサーバ上のDocker)の場合
</summary>
<div>

### Runnerのインストール

コマンドはLinuxの場合を例に記載しています。

```sh
# バイナリのダウンロード
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

# 実行権限の付与
sudo chmod +x /usr/local/bin/gitlab-runner

# GitLab Runnerのユーザ登録
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

# インストール、サービスの実行
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
```

### Runnerの登録


```sh
$ sudo gitlab-runner register --url https://gitlab.com/ --registration-token GRXXXXXXXXXXXXXXX_XXXXXX
Runtime platform                                    arch=amd64 os=linux pid=7505 revision=bbcb5aba version=15.3.0
Running in system-mode.

Enter the GitLab instance URL (for example, https://gitlab.com/):
[https://gitlab.com/]: <このままEnter>
Enter the registration token: <このままEnter>
[GRXXXXXXXXXXXXXXX_XXXXXX]:
Enter a description for the runner:
[DESKTOP-V4K9IKO]: <このままEnter>
Enter tags for the runner (comma-separated):
shell-executor <runnerの名前を入力してEnter(ここでは`shell-executor`と入力)>
Enter optional maintenance note for the runner:

Registering runner... succeeded                     runner=GRXXXXXXXXXXXXXXX
Enter an executor: virtualbox, docker+machine, kubernetes, parallels, shell, ssh, docker-ssh+machine, custom, docker, docker-ssh:
shell <shellと入力してEnter>

### ↓Dockerの場合デフォルトで使用するイメージが聞かれるので入力
Enter the default Docker image (for example, ruby:2.7):
golang:latest <デフォルトで使用したいイメージを入力してEnter>
### ↑Dockerの場合デフォルトで使用するイメージが聞かれるので入力

Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"
```
</div>
</details>


<details>
<summary>
executor:Docker(Runner用のDockerコンテナを作りそこからジョブ実行用のDockerを作る場合)
</summary>
<div>

参考: https://docs.gitlab.com/runner/install/docker.html

### gitlab-runnerイメージからDockerコンテナを作成

```sh
$ docker run -d --name gitlab-runner --restart always \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest
```

### Runnerの登録

```sh
$ docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register --url https://gitlab.com/ --registration-token GRXXXXXXXXXXXXXXX_XXXXXX
Runtime platform                                    arch=amd64 os=linux pid=7 revision=bbcb5aba version=15.3.0
Running in system-mode.

Enter the GitLab instance URL (for example, https://gitlab.com/):
[https://gitlab.com/]: <このままEnter>
Enter the registration token: <このままEnter>
[GRXXXXXXXXXXXXXXX_XXXXXX]:
Enter a description for the runner:
[DESKTOP-V4K9IKO]: <このままEnter>
Enter tags for the runner (comma-separated):
shell-executor <runnerの名前を入力してEnter(ここでは`shell-executor`と入力)>
Enter optional maintenance note for the runner:

Registering runner... succeeded                     runner=GRXXXXXXXXXXXXXXX
Enter an executor: virtualbox, docker+machine, kubernetes, parallels, shell, ssh, docker-ssh+machine, custom, docker, docker-ssh:
docker <dockerと入力してEnter>

Enter the default Docker image (for example, ruby:2.7):
golang:latest <デフォルトで使用したいイメージを入力してEnter>


Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"
```

</div>
</details>


Runnerの登録が完了すると、GitLabの利用可能なRunnerの箇所に表示されます。!![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/16b65cc6-5875-463c-f11b-68478ba4d2a5.png)


※ 以下のような`!runner has never contacted this instance`という警告が出る場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/6403534d-b002-b53a-7966-53b1ba4c7cdc.png)

```shell
$ gitlab-runner verify
```

のコマンドを実行することで解消されます。



# 動作確認

動作確認としてCentOSの最新版Dockerイメージでバージョン情報を表示するだけのジョブを設定して動かしてみます。


CI/CD > エディタ > Configure pipeline を押下すると`.gitlab-ci.yml`のサンプルが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/4f358b08-2294-2323-c720-208d66b5b7bc.png)

表示されたサンプルは一旦すべて削除して下記の内容を記述します。


```yaml
image: centos:latest

test:
    tags:
        - gitlab-runner-test-docker
    script:
        - cat /etc/redhat-release
```

記述後、コミットを行うと、プロジェクトルートに`.gitlab-ci.yml`ファイルが作成され、プロジェクトの CI/CD > ジョブで設定した内容に従ってジョブが行われていることを確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/299cb029-ac9c-cb59-8154-96904e9e9f55.png)