GitLab 11.5.3とGitLab runner 11.5.1のセットアップ

# はじめに

## 動機
[GitLab](https://about.gitlab.com/ "GitLab")を自宅で使いはじめてみたのだが、初期設定でいくつかハマったところがあったのでメモしておく。

他に優れた記事がたくさんあるので自分のメモにしかならないかもしれないが記録として残しておく。

## 構成
練習用のサーバを2つ用意。自己署名の証明書によりHTTPSでつつけるようにする。
OSはubuntu 16.04を使用。リソースの都合上、ちょっと非力なサーバを用意したが、本来はrequirementsに従いサーバ確保すること。

- GitLab : サーバp1b1に入れる
  - VMのスペック : 2core , 4GB memory , 40GB HDD
  - バージョン : 11.5.3-ce.0

```
$ dpkg -l gitlab-ce
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                     Version           Architecture      Description
+++-========================-=================-=================-======================================================
ii  gitlab-ce                11.5.3-ce.0       amd64             GitLab Community Edition (including NGINX, Postgres, R
$
```

- GitLab runner : サーバp1b3にいれる
  - VMのスペック : 2core , 4GB memory , 40GB HDD
  - バージョン : 11.5.1

```
# gitlab-runner --version
Version:      11.5.1
Git revision: 7f00c780
Git branch:   11-5-stable
GO version:   go1.8.7
Built:        2018-12-06T13:25:34+0000
OS/Arch:      linux/amd64
#
```

# GitLabインストール

いわゆるOmnibus packageというやつを使う。
（何入っているか調べようと下手にdpkg -L gitlab-ceなんて実行すると膨大なファイルリストが出力されます。。なかなか終わらない）

## パッケージのインストール、インストール用スクリプトのダウンロード

```
$ sudo apt-get update
$ sudo apt-get install -y curl openssh-server ca-certificates
$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
```

## 秘密鍵、CSR(Certificate Signing Request)、SSL証明書(crtファイル)の作成

opensslコマンドにより秘密鍵、CSR, SSL証明書を作成する。
opensslのバージョンは、「1.0.2g-1ubuntu4.1」を使用。

各ファイル、catしてみると、先頭に -- BEGIN ...という行があるのでPEM形式で出力されていることがわかる。

```
$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
・・・略。以下の入力はサンプルであり適当なのでちゃんと入力すること・・・
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Tokyo
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:hoge.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
$ openssl x509 -req -days 3650 -signkey server.key < server.csr > server.crt
$
```

## 生成したファイルの配置

```
$ sudo mkdir -p /etc/pki/tls/private
$ sudo mkdir -p /etc/pki/tls/certs
$ sudo cp server.key /etc/pki/tls/private/server.key
$ sudo cp server.crt /etc/pki/tls/certs/server.crt
$ sudo chmod 400 /etc/pki/tls/private/server.key
$ sudo chmod 400 /etc/pki/tls/certs/server.crt
```

## GitLabインストール実行

```
$ sudo EXTERNAL_URL="http://hoge.example.com" apt-get install gitlab-ce
```

## GitLab設定ファイルの変更と、GitLabへの反映

```
$ sudo su
# cp /etc/gitlab/gitlab.rb /etc/gitlab/_gitlab.rb.org
# vi /etc/gitlab/gitlab.rb
#
# diff /etc/gitlab/gitlab.rb /etc/gitlab/_gitlab.rb.org
以下の3つを編集
< external_url 'https://hoge.example.com'
---
> external_url 'http://hoge.example.com'

< nginx['ssl_certificate'] = "/etc/pki/tls/certs/server.crt"
< nginx['ssl_certificate_key'] = "/etc/pki/tls/private/server.key"
---
> # nginx['ssl_certificate'] = "/etc/gitlab/ssl/#{node['fqdn']}.crt"
> # nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/#{node['fqdn']}.key"

# exit
$ sudo gitlab-ctl reconfigure
```

## 画面にアクセスし、パスワードなどアカウント情報の登録

```
https://hoge.example.com/users/password/edit?reset_password_token=xxxxxxxxx
→　パスワード変更

https://hoge.example.com/users/sign_in
→　ユーザ登録

適当に自分の使うユーザ情報を入力
Full name : Hoge Raccho
Username : hoge
email : hoge@example.com
password : foobar
```

# GitLab runnerインストール

## Gitlab-runnerのインストール
[GitLab runnerのLinuxへのインストール手順](https://docs.gitlab.com/runner/install/linux-manually.html "GitLab runnerのLinuxへのインストール手順")をもとにインストール。

```
$ sudo wget -O /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
$ curl -sSL https://get.docker.com/ | sh
$ 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の登録
登録前に以下2点を満たすこと。1点目は上記で済なので2点目を実施する
- Install it on a server separate than where GitLab is installed on
- Obtain a token for a shared or specific Runner via GitLab’s interface

```
GitLab画面
https://hoge.example.com/
にログインして
Go to Settings > CI/CD to obtain the token
に遷移
```

以下のようなことがSpecific Runnerのところに書いてあるので
その情報をもとにしてrunnerの登録を実施することになる

```
Set up a specific Runner manually

    Install GitLab Runner

    Specify the following URL during the Runner setup: 
       https://hoge.example.com/

    Use the following registration token during setup: 
       xxxxyyyyzzzzwwww

    Start the Runner! 
```

[runnerの登録](https://docs.gitlab.com/runner/register/ "runnerの登録")にしたがい作業する。

が、その前に、自己署名証明書を使っている場合、このままだとgitlab-runner register時に以下のようなエラーが出るので、回避のため少しここで準備がいる。

```
$ sudo gitlab-runner register
・・・略・・・
ERROR: Registering runner... failed                 runner=xxxxx status=couldn't execute POST against https://hoge.example.com/api/v4/runners: Post https://hoge.example.com/api/v4/runners: x509: certificate signed by unknown authority
PANIC: Failed to register this runner. Perhaps you are having network problems
$
```

[自己署名証明書の時のエラーへの対処](https://gitlab.com/gitlab-org/gitlab-runner/blob/master/docs/configuration/tls-self-signed.md)に従って、gitlabのサーバからもってきたcrtファイルを、Runnerを入れるマシンに以下のような名前、パーミッション、ディレクトリ、ファイル名で配置する。

つまり、GitLabのURLが https://hoge.example.com/ の場合、/etc/gitlab-runner/certs/hoge.example.com.crt というファイルとして配置する。

```
# ls -lR /etc/gitlab-runner/
/etc/gitlab-runner/:
total 8
drwxr-xr-x 2 root root 4096 Dec 10 15:25 certs
-rw------- 1 root root   77 Dec 10 14:58 config.toml

/etc/gitlab-runner/certs:
total 4
-r-------- 1 root root 1281 Dec 10 15:25 hoge.example.com.crt
#
```

ここまで準備できたらregister実行。
途中で入力しないで[1ラインで一気に実行するコマンド](https://docs.gitlab.com/runner/register/#one-line-registration-command)もあるようだ。

```
$ sudo gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=4723 revision=7f00c780 version=11.5.1
Running in system-mode.

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://hoge.example.com/
Please enter the gitlab-ci token for this runner:
xxxxyyyyzzzzwwww
Please enter the gitlab-ci description for this runner:
[p1b3]:
Please enter the gitlab-ci tags for this runner (comma separated):
hogetag
Registering runner... succeeded                     runner=xxxxx
Please enter the executor: docker-ssh, parallels, shell, virtualbox, kubernetes, docker, ssh, docker+machine, docker-ssh+machine:
docker
Please enter the default Docker image (e.g. ruby:2.1):
ubuntu:16.04
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
$
```

# その他

## runnerのconfig.toml

ここで、runnerの設定ファイルconfig.tomlについて、どのような設定が書かれているか内容を確認しておく。

```
# cat config.toml
concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "pub1b3"
  url = "https://hoge.example.com/"
  token = "ppppqqqrrrssss"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "ubuntu:16.04"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
#
```

## GitLabのregistry, mattermostの有効化

簡単にできそうだったので、レジストリと [mattermost](https://www.mattermost.org/ "mattermost") (いわゆる [slack](https://slack.com/intl/ja-jp/ "slack") っぽい何か)も有効化してみる。
名前、ポートは環境にあわせて適当に変える。

```
$ diff gitlab.rb _gitlab.rb.org2
494c494
< registry_external_url 'https://hoge.example.com:5002/'
---
> # registry_external_url 'https://registry.example.com'
1221c1221
< mattermost_external_url 'https://hoge.example.com:5001/'
---
> # mattermost_external_url 'http://mattermost.example.com'
$
$ sudo gitlab-ctl reconfigure
```

この記事ではとりあえずここまで。

# 参考

- https://docs.gitlab.com/runner/install/linux-manually.html
- https://docs.gitlab.com/runner/register/
- https://docs.gitlab.com/runner/register/#one-line-registration-command