GitLab をソース版（Docker On EC2）から Omnibus 版に移行しました

　こんにちは。弁護士ドットコム SRE 室のテイです。

　当社はソースコード管理には GitLab を利用しています。現在は Omnibus 版に移行したのですが、その前は EC2 上で Docker を起動し、その上で GitLab が動いていました。Docker イメージは [sameersbn/docker-gitlab](https://github.com/sameersbn/docker-gitlab) をフォークし、カスタマイズしたものを利用していました。
　私が入社するより前から何年かはこの構成で運用していましたが、バージョンアップがとても大変だったり、原因不明で GitLab が死んだりした問題がありました。
　特にバージョンアップ作業は、毎回新しい Docker イメージを作成する必要がありますので、Dockerfile の修正、マージブランチへのプッシュ、GitLab CI でイメージのビルドなどの準備作業が多かったため、作業時間も長かったです。長時間の作業で GitLab や GitLab CI が使えないと、当社サービスの開発やデプロイにも影響が出るため、いつも業務時間外（20時以降）で実施しました。
　そのため、安定性とメンテナンス性を向上するために、Omnibus 版の GitLab へ移行することを決めました。

　今回は、Omnibus 版への移行過程をご紹介させていただきます。

# Omnibus 版 GitLab を設定する
## 環境情報
　Omnibus パッケージ版の GitLab をインストールする場合は、RHEL / CentOS の OS が推奨されていますが、今回は Amazon Linux 2 の EC2 インスタンスを作成します。
　一方、ソース版の GitLab をインストールする場合、Debian / Ubuntu の OS が勧めです。

## 依存関係のインストール
　必要な依存関係をインストールして設定します。

``` bash
# yum install -y policycoreutils-python
```

## GitLab リポジトリの追加とパッケージのインストール
　GitLab CEパッケージリポジトリを追加します。

``` bash
# curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
```

　GitLab CEパッケージをインストールします。
　**注意：既存環境から移行しますので、同じバージョンの Omnibus 版 GitLab をインストールしなければいけません。**

``` bash
# yum install -y gitlab-ce-<バージョン番号>
```

　ちなみに、最新版の gitlab をインストールする場合、`-<バージョン番号>`は不要です。

　インストールが終わった後、GitLab を起動します。

``` bash
# gitlab-ctl reconfigure
```

## gitlab.rb 修正
　ソース版の GitLab は config ファイルがたくさんありますが、Omnibus 版の場合はすべての設定が`/etc/gitlab/gitalb.rb`でまとまっています。
　以下のソース版の各ファイルを参考して、gitalb.rb を修正していきます。

- gitlab.yml
- database.yml
- resque.yml
- secrets.yml
- rack_attack.rb
- relative_url.rb
- smtp_settings.rb

　また、`.yml`と`.rb`とでは記述方式が違いますので、注意が必要です。

　gitlab.rb が修正された後、`gitlab-ctl reconfigure`を実行して、設定内容を反映します。
　反映した後、`/var/opt/gitlab/gitlab-rails/etc/`で、ソース版と同じ config ファイルが生成されますので、元のファイルと比較して漏れた内容があったら、`/etc/gitlab/gitalb.rb`を再度修正し、反映します。

``` bash
# cd /var/opt/gitlab/gitlab-rails/etc
# ll
total 72
-rw-r--r-- 1 root root    76 Sep  3 14:20 cable.yml
-rw-r----- 1 root git    571 Sep 16 12:59 database.yml
-rw-r--r-- 1 root root    45 Sep 14 13:31 gitlab_pages_secret
-rw-r--r-- 1 git  git   3243 Sep 14 13:31 gitlab-registry.key
-rw-r--r-- 1 root root    33 Sep 14 14:28 gitlab_shell_secret
-rw-r--r-- 1 root root    45 Sep 14 17:38 gitlab_workhorse_secret
-rw-r----- 1 root git  27598 Sep 16 14:31 gitlab.yml
-rw-r--r-- 1 root root  2867 Sep 16 14:06 puma.rb
-rw-r--r-- 1 root root    59 Sep  3 14:20 resque.yml
-rw-r--r-- 1 root root  7303 Sep 14 14:28 secrets.yml
-rw-r--r-- 1 root root   725 Sep 16 14:10 smtp_settings.rb
```

## Nginx config を設定
　gitlab.rb の設定により、各 conf ファイルが自動生成されますので、手動での設定は不要です。

　これで一旦、Omnibus 版の GitLab が準備できました。

# ソース版 GitLab のバックアップを取る
　ソース版のデータを Omnibus 版に移行するため、GitLab のコンテナに接続して、バックアップを取得します。

``` bash
# cd /home/git/gitlab
# sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
```

　バックアップ完了した後、`<TIMESTAMP>_gitlab_backup.tar`のファイルが生成され、 バックアップ用 S3 へ転送されます。

# Omunibus 版へリストア
　バックアップされた tar ファイルを Omnibus 版の EC2 インスタンスの`/var/opt/gitlab/backups/`に転送して、以下のコマンドでリストアを実施します。

``` bash
// unicorn と sidekiq を停止
# gitlab-ctl stop unicorn
# gitlab-ctl stop sidekiq

// バックアップデータをリストア
# gitlab-backup restore BACKUP=<TIMESTAMP>
```

　リストア開始する前に、既存の postgresql のデータを消していいかと聞かれますので、`Yes`を入力して、Enter キーを押して、リストアが開始させます。

　リストアした後、GitLab を再起動して、状態をチェックします。

``` bash
// 再起動
# gitlab-ctl restart

// 状態をチェック
# gitlab-rake gitlab:check
```

　リストアが完了後、`/etc/gitlab/gitlab-secrets.json`の更新を求める Warning が表示されます。
　GitLab は、データベースの暗号化、セッションの暗号化など、複数のシークレットを使用しています。リストアした後、各シークレット情報もコピーしなければいけません。
　下記の元ファイルの各シークレット情報を`/etc/gitlab/gitlab-secrets.json`に反映します。

- /home/git/gitlab/config/secrets.yml
    - db_key_base
    - secret_key_base
    - otp_key_base
- /home/git/gitlab/.gitlab_shell_secret
- /home/git/gitlab/.gitlab_workhorse_secret


``` json:/etc/gitlab/gitlab-secrets.json
{
  "gitlab_workhorse": {
    "secret_token": "..."
  },
  "gitlab_shell": {
    "secret_token": "..."
  },
  "gitlab_rails": {
    "secret_key_base": "...",
    "db_key_base": "...",
    "otp_key_base": "...",
  }
  ...
}
```

　設定したら、`gitlab-ctl reconfigure`を実行して、反映します。

　これで、ソース版の GitLab から Omnibus 版への移行が完了しました。

# 番外編
## バージョンアップ運用
　Omnibus 版 GitLab にした後、バージョンアップ作業もすごく楽になりました。`yum install -y gitlab-ce`だけで、最新バージョンまでアップグレードできます。
　これにより、一時期は毎週夜中に自動でアップグレードする設定を入れて、ほぼ常に最新状態となるようにしていました。しかし、細かな設定調整をしないと一部の機能が使えなくなることがあるので、現在は基本的には月に一度業務時間内に1時間程度の時間を設け、アップデートの作業を行っています。

　本記事が投稿される時点で、13.11.4 までアップデートされました。
## 13.6 → 13.7 への工夫
　ある日、GitLab のバージョンがずっと 13.6.7 に維持していて、バージョンアップができなくなったことが気づきました。EC2 インスタンスに入って、`/etc/yum.repos.d/gitlab_gitlab-ce.repo`を見てみたら、以下のように RHEL 6 相当になっていました。

```
[gitlab_gitlab-ce]
name=gitlab_gitlab-ce
baseurl=https://packages.gitlab.com/gitlab/gitlab-ce/el/6/$basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
```

　そして、[GitLab のパッケージページ](https://packages.gitlab.com/app/gitlab/gitlab-ce/search?dist=el%2F6&filter=all&page=3&q=gitlab-ce-13.)を確認してみたら、el/6 のは 13.6.7 で止まっている感じです。

　なぜ、Amazon Linux 2 なのに、`gitlab_gitlab-ce.repo` では RHEL 6 相当なのかを調べて、[GitLab のインストール手順](https://packages.gitlab.com/gitlab/gitlab-ce/install#bash-rpm)を確認したら、Amazon linux のバージョンを見ていないことが分かりました。
　GitLab 13.7 をインストールするために、`/etc/yum.repos.d/gitlab_gitlab-ce.repo`の`baseurl`を手動で`el/7/`に変更しました。

　変更する前に GitLab パッケージを確認すると、13.6.7 のみです。

``` bash
# yum list | grep gitlab
gitlab-ce.x86_64                       13.6.7-ce.0.el6                @gitlab_gitlab-ce
```

　変更した後、`yum clean all` でキャッシュをクリアして、再度 GitLab のパッケージを確認すると、13.7.1 が増えたことが分かりました。

``` bash
# yum list | grep gitlab
gitlab-ce.x86_64                       13.6.7-ce.0.el6                @gitlab_gitlab-ce
gitlab-ce.x86_64                       13.7.1-ce.0.el7                gitlab_gitlab-ce
```

　そしたら、`yum install gitlab-ce`を実行して、13.7.1 の GitLab が無事にアップデートできました。

``` bash
# yum install gitlab-ce
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Resolving Dependencies
--> Running transaction check
---> Package gitlab-ce.x86_64 0:13.6.7-ce.0.el6 will be updated
---> Package gitlab-ce.x86_64 0:13.7.1-ce.0.el7 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
===================================================================================================================================================================================================================
 Package                                         Arch                                         Version                                                 Repository                                              Size
===================================================================================================================================================================================================================
Updating:
 gitlab-ce                                       x86_64                                       13.7.1-ce.0.el7                                         gitlab_gitlab-ce                                       790 M
Transaction Summary
===================================================================================================================================================================================================================
Upgrade  1 Package
...
```

　以上、当社の Omnibus 版 GitLab 移行過程について、ご紹介させていただきました。