オンプレミス(GitLabと同じ)環境にGitLab RunnerでCI/CD環境を構築する

自分で構築したGitLabにGitLab Runnerを設定する手順のまとめです。
Gitlabを構築する下記記事の続きになります。

https://qiita.com/kamina/items/1113d4d8eea3fd4db3c9

# やりたいこと

- オンプレミス環境に構築したGitLabから利用するRunnerとして設定する
- スモールスタートとしてGitLabと同じサーバー内に構築する
- GitLabの共有Runnerとして設定する
- executorにはDockerを利用する

# Dockerのインストール

まずはDockerをインストールし、利用できるようにしておきます。
特に難しいこともないので、下記公式の手順に従ってインストールしてください。

https://docs.docker.com/engine/install/ubuntu/

下記のようにdockerコマンドが利用できるようになっていればOKです。

```shell-session
$ docker -v
Docker version 20.10.18, build b40c2f6
$ docker compose version
Docker Compose version v2.10.2
```

# 内部通信の為のホスト設定①

RunnerからGitLabへアクセスする為のURLは、同じサーバー内からのアクセスになるので、普通なら`http://localhost/`となります。
Runner自体からGitLabへアクセスするケースであれば`http://localhost/`で良いのですが、
Runnerが利用するDockerコンテナ内からGitLabへアクセスするケースは`http://localhost/`ではアクセスが通りません。
※Dockerコンテナ内のポート80にアクセスすることになってしまう為。

その為、localhostとは別のホスト名を設定しておき、環境によってアクセス先(IP)を変えられるようにします。

```shell-session
$ sudo vim /etc/hosts
```

```:hosts
127.0.0.1 localhost gitlab    ←gitlabをエイリアスとして追加。
```

※ここではgitlabとしていますが、任意の名前で良いです。
サーバー内からのアクセス先は`127.0.0.1`で良いので、`localhost`のエイリアスとして設定します。

試しに、`http://gitlab/`でもGitLabにアクセスできることを確認しておきます。

```shell-session
$ curl http://gitlab/-/health
GitLab OK
```

`localhost`と同様にヘルスチェックが通ればOKです。

# GitLab Runnerのインストール

https://docs.gitlab.com/runner/install/linux-repository.html

公式の手順通りではありますが、パッケージのリポジトリを登録して`apt`コマンドでインストールします。

```shell-session
$ curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
$ sudo apt install gitlab-runner
```

バージョンを確認。

```shell-session
$ gitlab-runner -version
Version:      15.4.0
Git revision: 43b2dc3d
Git branch:   15-4-stable
GO version:   go1.17.9
Built:        2022-09-20T22:38:36+0000
OS/Arch:      linux/amd64
```

ステータスを確認。
`Service is running`になっていればOKです。

```shell-session
$ sudo gitlab-runner status
Runtime platform                                    arch=amd64 os=linux pid=2989579 revision=43b2dc3d version=15.4.0
gitlab-runner: Service is running
```

# GitLabにRunnerを登録

GitLabの管理者ページのRunnerの設定を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272546/15bdd701-f5b0-a90f-e702-f7cb25e2a27d.png)
「Register an instance runner」をクリックし、登録の為のトークンを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272546/840f473b-4b4a-e2bc-6912-6c7d110d4e37.png)

次にGitLab Runnerに対して登録作業を行います。

```shell-session
$ sudo gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=3043759 revision=43b2dc3d version=15.4.0
Running in system-mode.

Enter the GitLab instance URL (for example, https://gitlab.com/):
http://gitlab/                               ←先ほど設定したホスト名(gitlab)を指定
Enter the registration token:
XXXX                                         ←先ほど取得したトークン
Enter a description for the runner:
[gitlab-vm]: Shared-Runner1                  ←登録するRunnerの説明
Enter tags for the runner (comma-separated):
shared                                       ←登録するRunnerのタグ
Enter optional maintenance note for the runner:
                                             ←メンテナンスノート（省略ならそのままEnter
Registering runner... succeeded                     runner=K6rhar1C
Enter an executor: kubernetes, docker-ssh, shell, virtualbox, docker-ssh+machine, docker+machine, custom, docker, parallels, ssh:
docker                                       ←利用するexecutor
Enter the default Docker image (for example, ruby:2.7):
node:16                                      ←デフォルトのDockerImage
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"
```

これで登録できました。
GitLabのRunnerのページで下記のように追加されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272546/fc06a368-8d18-e5ca-055e-63c3ee0b8ecd.png)

あとこれは任意ですが、登録したRunnerの設定を1点変更します。
登録したRunnerの編集を選択して、「タグのないジョブの実行」を許可しておきます。
これを許可していない場合、ジョブを登録する際に明示的にタグ(今回の設定だとshared)を指定しないと、このRunnerは実行してくれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272546/704b726a-788b-2206-58fa-d8d611ff390a.png)

# 内部通信の為のホスト設定②

最後にRunnerが利用するDokerからの内部通信の設定を行います。
まずは下記コマンドでDockerが使用するネットワークでのホスト側のIPアドレスを調べます。
`docker0:`となっているものが対象で、下記の場合は`172.17.0.1`になります。

```shell-session
$ ip a
...
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:29:6e:d3:df brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:29ff:fe6e:d3df/64 scope link
       valid_lft forever preferred_lft forever
```

次にGitLab Runnerの設定を変更します。

```shell-session
$ sudo vim /etc/gitlab-runner/config.toml
```

```toml:config.toml
  [runners.docker]
    tls_verify = false
    image = "node:16"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
    extra_hosts = ["gitlab:host-gateway"]    # ←追加
```

:::note info
2022/11/03追記
IPの代わりに`host-gateway`と指定すれば良いらしいので修正。
:::

こうすることで、`http://gitlab/`とアクセスする際に、

- サーバー内からのアクセスなら`127.0.0.1`
- Dockerコンテナ内からのアクセスなら`172.17.0.1`

としてアクセスするようになります。

これでGitLab RunnerでCI/CDが利用できるようになりました。

続いて、JOBを並列(Runnerを複数同時)実行できるように設定を行いたい方は下記にお進みください。

https://qiita.com/kamina/items/74947c6676323c55f8e9