こんにちは。弁護士ドットコム SRE 室のテイです。
当社はソースコード管理には GitLab を利用しています。現在は Omnibus 版に移行したのですが、その前は EC2 上で Docker を起動し、その上で GitLab が動いていました。Docker イメージは 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 が勧めです。
依存関係のインストール
必要な依存関係をインストールして設定します。
# yum install -y policycoreutils-python
GitLab リポジトリの追加とパッケージのインストール
GitLab CEパッケージリポジトリを追加します。
# curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
GitLab CEパッケージをインストールします。
注意:既存環境から移行しますので、同じバージョンの Omnibus 版 GitLab をインストールしなければいけません。
# yum install -y gitlab-ce-<バージョン番号>
ちなみに、最新版の gitlab をインストールする場合、-<バージョン番号>
は不要です。
インストールが終わった後、GitLab を起動します。
# 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
を再度修正し、反映します。
# 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 のコンテナに接続して、バックアップを取得します。
# 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/
に転送して、以下のコマンドでリストアを実施します。
// unicorn と sidekiq を停止
# gitlab-ctl stop unicorn
# gitlab-ctl stop sidekiq
// バックアップデータをリストア
# gitlab-backup restore BACKUP=<TIMESTAMP>
リストア開始する前に、既存の postgresql のデータを消していいかと聞かれますので、Yes
を入力して、Enter キーを押して、リストアが開始させます。
リストアした後、GitLab を再起動して、状態をチェックします。
// 再起動
# 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
{
"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 のパッケージページを確認してみたら、el/6 のは 13.6.7 で止まっている感じです。
なぜ、Amazon Linux 2 なのに、gitlab_gitlab-ce.repo
では RHEL 6 相当なのかを調べて、GitLab のインストール手順を確認したら、Amazon linux のバージョンを見ていないことが分かりました。
GitLab 13.7 をインストールするために、/etc/yum.repos.d/gitlab_gitlab-ce.repo
のbaseurl
を手動でel/7/
に変更しました。
変更する前に GitLab パッケージを確認すると、13.6.7 のみです。
# yum list | grep gitlab
gitlab-ce.x86_64 13.6.7-ce.0.el6 @gitlab_gitlab-ce
変更した後、yum clean all
でキャッシュをクリアして、再度 GitLab のパッケージを確認すると、13.7.1 が増えたことが分かりました。
# 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 が無事にアップデートできました。
# 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 移行過程について、ご紹介させていただきました。