Dockerを用いたGitLab-CIローカル環境の作り方

# はじめに
GitLab-CI, GitLab-Runnerの使い方に慣れるため、ローカルに練習環境を作成しました。
その際の手順を備忘録として記事にまとめます。
Docker の知識がなくても構築できるよう、コマンドを記載しています。
この記事の手順に従ってコピペしていけば、最低限GitLab-CI を試せる環境を構築できます。


# この記事を読んでできること
GitLab-CE, GitLab-Runner をローカルに立ち上げ、プロジェクトに GitLab-Runner を登録できるようになります。

以下の順番で説明をしていきます。
1. Docker内でNetworkを作成
2. GitLab-CE を起動
3. GitLab-Runner を起動
4. GitLab-Runner を登録


# 目指す構成
GitLab-CIの環境を構築するには、
- GitLab-CE
- GitLab-Runner
の２つを用意する必要があります。
この２つを ローカルのDockerコンテナ上に立ち上げ接続を試みます。
```
[gitlab-network内(独自のネットワークを作成)]
    docker container 1
      L  GitLab-CE  (IPアドレス: 172.20.0.2)
            ↑  登録
    docker container 2
      L  GitLab-runner (IPアドレス: 172.20.0.3)
```

# Networkの作成
gitlab-ce, gitlab-runner を固定のIPアドレスで起動するために、Docker上でネットワークを作成します。
ネットワーク名は `gitlab-network` とします。
```
docker network create --subnet 172.20.0.0/24 gitlab-network
```

以下のコマンドを打って、`gitlab-network`が登録されていれば完了です。

```
docker network ls
```

```
NETWORK ID     NAME             DRIVER    SCOPE
43c51b2c19f1   bridge           bridge    local
742b5bc1137d   gitlab-network   bridge    local
79c45602280f   host             host      local
85bda5ecf785   none             null      local
```

# GitLab-CE

## GitLab-CEの起動
GitLab-CE の Docker イメージを起動します。
```
docker run --detach --network gitlab-network --ip 172.20.0.2 --publish 443:443 --publish 80:80 --publish 22:22 --name gitlab-ce gitlab/gitlab-ce:latest
```

各オプションは以下のような意味を持っています。
|オプション           |意味  |
|---               |---|
|--detach          |コンテナからログアウトした後もプロセスが残る  |
|--network [name]  |コンテナを`name`ネットワークに登録する   |
|--ip [address]    |ネットワーク内でコンテナに`address`IPアドレスを振る   |
|--publish x:y     |ポートフォワーディング。ホストマシンのport`x`とコンテナのport`y`をバインドする  |
|--name [name]     |コンテナに`name`名前をつける   |


## GitLabにアクセス
ブラウザからGitLabにアクセスします。
今回の環境では、URLは `http://localhost:80` です。
完全に起動するまで時間がかかる場合があります。
アクセスできると、ログイン画面が表示されます。
![SS 2022-08-16 17.52.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/55a58814-0e04-a33c-5e98-cc937aefd45f.png)

## rootユーザーでログイン
ログイン画面が出たら、rootユーザーでログインします。
パスワードの確認方法は[ドキュメント](https://www.gitlab.jp/blog/2022/05/27/initial-password/)に書いてあります。
(GitLab 14.0以降での確認方法)
```
docker exec gitlab-ce cat /etc/gitlab/initial_root_password
```
出力結果にパスワードが書いてあるので、
- ユーザー名: root
- パスワード: 確認したパスワード
を入力してログインします。

## rootユーザーのパスワードを変更する
上記で使用したパスワードは時間で消えるので、rootユーザーのパスワードを変更しましょう。
ログイン後の画面から、以下のようにユーザーのパスワードを変更できます。

左上の「Menu/Admin」 => サイドバーの「User」 => Administar行の編集ボタン
![SS 2022-09-13 15.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/9d29455a-a206-0814-d8a9-fb8e640f46ce.png)
![SS 2022-09-13 15.18.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/40e5aac9-fc99-fdf1-1dd9-c4e0faf2b01f.png)
![SS 2022-09-13 15.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/550d6503-4c45-b7fc-ddfb-a257c6a7dce8.png)
![SS 2022-09-13 15.19.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/cb21ec41-fc8f-b180-4f6b-cd37a65d93c2.png)




## プロジェクト作成
プロジェクトを１つ作成します。
New Project → Create blank Project と進みます。
![SS 2022-08-17 2.36.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/59764cdf-3714-7c5e-8890-d74d6e8ce946.png)
![SS 2022-08-17 2.36.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/3571e8a7-d357-55bc-4614-ab8bb2612ec5.png)


今回は、プロジェクト名を `ci-practice` としました。
入力したら、Create Project を押します。
![SS 2022-08-17 2.37.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/8157dffe-cdc5-6b56-ab6e-85def307808b.png)
新しいプロジェクトが作成されました。
のちほど、Runner 登録時に設定を確認します。
![SS 2022-08-17 2.37.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/caf4c870-63e0-20d9-83f0-4be33c285a09.png)


## 外向きのIPアドレスを固定
このあと登録するランナーに `http://172.20.0.2` を通知させたいので、`external_host` を追加します。
この設定をしないと、プロジェクトの「Clone」から確認できるランダムなIPアドレスが通知されます。

![SS 2022-09-14 18.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/8ddef6eb-88e8-86ac-e42a-5afe5bb7bfd4.png)


コンテナにログインして設定ファイルを編集しましょう。

```
docker exec -it gitlab-ce /bin/bash
```
```
vi /etc/gitlab/gitlab.rb
```

30行目くらいに `# external_url 'GENERATED_EXTERNAL_URL'`というコメントがあるので、
以下のように書き加えます。
```
# external_url 'GENERATED_EXTERNAL_URL'                                         
external_url 'http://172.20.0.2:80/'
```
設定を更新します。

```
gitlab-ctl reconfigure
```

もう一度「Clone」を確認すると、IPアドレスが変わっています。
![SS 2022-09-14 18.29.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/bc74cc76-480e-7a95-2f23-bed42eaa4756.png)



参考: [【GitLab】IP・ポート番号のURLで使用する方法(docker)](https://www.mathkuro.com/docker/expose-gitlab-on-different-ports/)

# GitLab-Runner
基本的には[ドキュメント](https://docs.gitlab.com/runner/register/)に従って登録を進めます。

## GitLab-Runner の起動
GitLab-Runner の Docker イメージを起動します。
Docker 内部の`gitlab-network`ネットワークで GitLab-CE にアクセスできればよいので、ポートフォワードは必要ありません。
```
docker run --network gitlab-network --ip 172.20.0.3 -v /var/run/docker.sock:/var/run/docker.sock --detach --name gitlab-runner gitlab/gitlab-runner:latest
```

## URLとtokenの確認
登録に必要な URL と token を事前に確認しておきましょう。
先程ログインしたGitLabの設定から確認できます。
Settings にカーソルオーバーし、CI/CD をクリックします。
![SS 2022-08-17 2.37.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/428e65a8-53bc-2deb-a56a-1bdf789da41f.png)


Runners の Expand をクリックすると、登録に必要な URL と tokenが確認できます。
![SS 2022-08-17 3.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/6b26c572-72c9-296f-1018-f7e594c61788.png)



ここで注意点としてURLが [`http://localhost/`](http://localhost/) となっていますが、GitLab-Runner のコンテナから localhost でアクセスすることはできません。
代わりに、固定したIPアドレス `http://172.20.0.2`を使用しましょう。

## GitLab-Runner の登録
GitLab-Runner のコンテナ内に入り、登録を行います。
登録は対話モードで行います。
```
docker exec -it gitlab-runner /bin/bash
```
```
gitlab-runner register
```
以下は対話モードに従って入力していきます。
```
Enter the GitLab instance URL (for example, https://gitlab.com/):
http://172.20.0.2

Enter the registration token:
rTxCp61E5PuzCkKgaD3P

Enter a description for the runner:
local-runner

Enter tags for the runner (comma-separated):
local

Enter an executor: kubernetes, custom, docker, docker-ssh, parallels, shell, ssh, docker-ssh+machine, virtualbox, docker+machine:
docker

Enter the default Docker image (for example, ruby:2.6):
alpine:latest
```
Success の表記が出れば登録は完了です。
```
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
```

## docker executer の設定を追加
docker executer の選択したので、volumeの設定とネットワーク設定の追加が必要です。
vimをインストールして、設定ファイルを書き換えましょう。
（本来は Docker Volume を設定したほうがよいですが、怠けます。）

```
docker exec -it gitlab-runner /bin/bash
```
```
apt-get update
apt-get install vim
```
```
vi /etc/gitlab-runner/config.toml
```
`clone_url`, `network_mode`, `volumes` を追加して、ランナーの設定を以下の状態にしてください。
```
[[runners]]
  name = "local-runner"
  url = "http://172.20.0.2"
  token = "rTxCp61E5PuzCkKgaD3P"
  executor = "docker"
  clone_url = "http://172.20.0.2"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    network_mode = "gitlab-network"
    tls_verify = false
    image = "alpine:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
    shm_size = 0

```

# 登録の確認
正常に登録できたか確認します。
再び GitLab-CE の Settings から Runners を確認します。
local-runner というランナーが追加できています。
![SS 2022-08-17 3.42.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/7bf9296a-8cfc-e728-a588-9aab569a8d04.png)


# おわりに
Docker の扱いや GitLab-Runner の登録の仕方などもっとスマートな書き方もあると思いますが、あまり風呂敷を広げずに単純な方法での環境構築を紹介しました。
最低限の環境構築はできますが、よりしっかりと学びたい方は他の記事を参考にしていただきたいと思います。
また、今回は GitLab-CE もローカルで立てましたが、WEB版や社内のリソースを利用できる場合は、そちらも利用できます。
URL と token のみ確認できれば同様の手順で登録できます。