GitLab CE で Zeroダウンタイムアップグレードを試してみます。
1. よくある話
最近のオープンソースソフトウェアは非常に更新が激しい(頻繁リリースを旨とするから)のです。
GitLabもご多分に漏れず、結構な頻度でアップデートがリリースされます。
まあ、こんな風になります。
そうなると、よくある話は「また、メンテナンスしてるの!?(怒) なんでそんなにいつもアップデートしてるねん!(怒怒)」と開発者さんに言われることです(弊社にはいないようですが)。
そういうことを言われてしまうと、ついついアップグレードがおっくうになってしまって放置状態。
そうこうしているうちにアップデートできなくなってしまい...。
という事がよくあります。(弊社社内管理のサーバーでもいろいろ。。)
それを避けるには一所懸命オープンソースのバージョンと合わせてアップデートしていくしかありません。
2. GitLabはダウンタイムゼロでアップグレードできるぜ
DBが1カ所であるとなかなかアップデートできないのですが(テーブルのマイグレーションとかあるとね)、
GitLabは、Version 9.1.0からZeroダウンタイムアップグレードができるようになっています。
Updating GitLab installed with the Omnibus GitLab package | GitLab
https://docs.gitlab.com/omnibus/update/README.html#zero-downtime-updates
「これで、開発者からの文句を避けつつ、アップグレードできるぜ!」と思ったのと、
ググってみてもやっている記事を見つけられなかったので、チャレンジしてみます。
3. 前提条件
その前に、適用作業が以下の3種類で違うようです。
Deployment type | Description |
---|---|
Single | GitLab CE/EE on a single node |
Multi-node / HA | GitLab CE/EE on multiple nodes |
Geo | GitLab EE with Geo enabled |
また、Zeroダウンタイムアップグレードできる条件と注意事項というのがあります。
Updating GitLab | GitLab
https://docs.gitlab.com/ee/update/README.html#upgrading-without-downtime
- マイナーアップデート1つ分しかアップデートできないこと
- パッケージアップデート後の手動作業が必要なこと
- PostgreSQLを使っていること(MySQLはNG)
※注1:Zeroダウンタイムアップグレードでは、マイグレーションがバックグラウンドタスクで実行される(特に月次のリリース)のでその間に次のアップデートを実行しないようにする事!
※注2:アップデートの手動作業には通常のupdateで実行されるバックアップが含まれていないようでした(やってみた結果です)。
10.8.3 がインストールされているサーバーですが、10.8.4 がリリースされています。
10.8.3 ---> 10.8.4 にアップデートしてみようと思います。
OSは、Ubuntu 16.04 LTS
omnibusインストールされているGitLabです。
GitLab 10.8.3 (564c342)
GitLab Shell 7.1.2
GitLab Workhorse v4.2.1
GitLab API v4
Ruby 2.3.7p456
Rails 4.2.10
postgresql 9.6.8
Gitaly Servers
4. やってみる
シングルノードの手順は5つです。
4-1. /etc/gitlab/skip-auto-reconfigure ファイルの作成
まず、skip-auto-reconfigure ファイルを作ります。
これによって、sudo apt upgradeしたときに reconfigureされないようです。
sudo touch /etc/gitlab/skip-auto-reconfigure
どうも、Version 10.6からは
/etc/gitlab/skip-auto-migrations
じゃなくて、
/etc/gitlab/skip-auto-reconfigure
になっているみたいですね(10.6以前の場合は、skip-auto-migrations を使いましょう)。
4-2. GitLabのパッケージをアップデートします。
sudo apt-get update && sudo apt-get install gitlab-ce
パッケージはアップデートされましたが、reconfigureは実行されませんでした。
GitLabの絵文字の上の Found /etc/gitlab/skip-auto-reconfigure, exiting... で終了しています。
4-3. reconfigureを手動実行します
SKIP_POST_DEPLOYMENT_MIGRATIONS=true sudo gitlab-ctl reconfigure
reconfigureされたようです。
4-4. DBをマイグレーションします。
sudo gitlab-rake db:migrate
サクッとDBマイグレーションも終了しました。
何のメッセージも出なかったということは、DBの更新はなかったんですね。
4-5. アプリ再起動
sudo gitlab-ctl hup unicorn
sudo gitlab-ctl hup sidekiq
unicorn と sidekiq をhupします
こちらも何の問題もなく終了しました。
4-6. 結果確認
Adminページをリロードします。
アップデートされました!
なかなか良いのではないでしょうか。
5. 結論
OSSは特にバージョンアップして最新版についていくのは非常に重要です。
これで、いつでも気兼ねなくバージョンアップすることできることが確認できました。
私のようなアップデート坊には特に嬉しい機能ではないでしょうか。
6. ちなみに
4-1で作ったファイルはアップデート後にどうなるかというと、
残ります。
次回実行時も上記のアップデート手順が必要になります。
7. アップデートシェルスクリプト
cron用に適当に書いたbashスクリプトをgistにアップしておきました。
メジャーアップデート(数字の1桁目、2桁目が変わる場合)はアップデートしません。
アップデートがない場合は、すぐ終了します。