毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。
この記事は、
GitLab Advent Calendar 2019 - Qiita
の1日目です
0. 前置き
2018年6月にこんなのを書きました。
GitLab CEで Zeroダウンタイムアップグレードを試す - Qiita
https://qiita.com/ynott/items/77e6f287a44bc1d6e797
2019年になって、いくつか更新されたので変更があった部分をご紹介します。
ゼロダウンタイムアップグレードについては上記URLをご確認ください。
1. 2019年になって変更された点
- Enterprise Editionにも対応した。
会社でStarter Editionを利用するようになったのでEnterprise Editionにも対応するようにしました。 - Mattermostへ通知するようにした。
会社でSlackからMattermostへ移行しました。その為、更新通知をMattermostにも飛ばすようにしました。 - aptでGitLabが自動的にアップデートをかからないようにした。
Ubuntuのパッケージをデイリーで自動バージョンアップするようにしたのですが、GitLabも同時にバージョンアップすると不都合があるので、GitLabパッケージだけsudo apt-mark hold gitlab-ce
しておいて以下のbashスクリプトが実行されたときだけunholdしてアップグレードするようにしました。 - メジャーバージョンアップも自動でアップグレードするようにした。
2018年のスクリプトではメジャーバージョンアップは避けるようにしていましたが、運用成績も悪くなかったのでメジャーバージョンアップ時にもゼロダウンタイムアップグレードするようにしました。
2. 2019年のゼロダウンタイムのアップグレードスクリプトでの運用実績
2019年10月に1回だけアップグレードスクリプトでアップグレードされても、バージョンアップされていないということがあり、同じバージョンのアップグレードが4回ほどかかりました。なにか引っかかっているのかとも思いましたが、最終的に4回目で更新されたので何が問題だったか不明です。
3. 2019年のアップグレードスクリプト
2019年のアップグレードスクリプトです。
大枠は変わっていません。
#!/bin/bash
EDITION=ce
MATTERMOST_WEBHOOK_URL='https://mattermost.example.jp/hooks/XXXXXXXXXXXXXXX'
# Check update
sudo apt update
export LANG=en_US.UTF-8
# Get versions(Ret Value:11.0.1-$EDITION.0 11.0.2-$EDITION.0)
VERSIONS_OLDNEW=$(apt-cache policy gitlab-$EDITION | grep -1 Installed | sed -r 's/(^ )//' | grep -v "gitlab-$EDITION:")
VERSION_OLD=$(echo $VERSIONS_OLDNEW | sed -r 's/Installed: (.*?) Candidate: .*/\1/g')
VERSION_NEW=$(echo $VERSIONS_OLDNEW | sed -r 's/Installed: .* Candidate: (.*?)/\1/g')
# check if you can upgrade
if [ "$VERSION_OLD" = "$VERSION_NEW" ];
then
echo "CURRENT_VERSION:$VERSION_OLD is equal LATEST_VERSION:$VERSION_NEW"
echo "GitLab $EDITION Version is not update, exit"
exit 0;
fi
echo "Installed Version:$VERSION_OLD"
echo "Candidate Version:$VERSION_NEW"
echo "Update version available, update"
sudo apt-mark unhold gitlab-$EDITION
sudo apt-get install gitlab-$EDITION
SKIP_POST_DEPLOYMENT_MIGRATIONS=true sudo gitlab-ctl reconfigure
sudo gitlab-rake db:migrate
sudo gitlab-ctl usr2 puma
sudo gitlab-ctl restart sidekiq
msg="{\"text\": \"GitLab のバージョンを${VERSION_OLD}から${VERSION_NEW}にアップデートしました。\"}"
curl -i -s -o /dev/null -X POST -H 'Content-Type: application/json' -d "$msg" $MATTERMOST_WEBHOOK_URL
sudo apt-mark hold gitlab-$EDITION
4. 2020年
2020年もこのスクリプトでゼロダウンタイムアップグレード運用する予定です。
2020/01/23追記
GitLab 12.7がリリースされて、以下のページが更新されていた。
Updating GitLab installed with the Omnibus GitLab package | GitLab
https://docs.gitlab.com/omnibus/update/README.html#single-deployment
アップグレード
sudo gitlab-rake db:migrate
以下のアップグレード後のアップグレードスクリプトがこれまでは、
sudo gitlab-ctl hup unicorn
sudo gitlab-ctl hup sidekiq
だったのに
sudo gitlab-ctl hup unicorn
sudo gitlab-ctl usr2 puma
sudo gitlab-ctl restart sidekiq
に変更されていた。
gitlab-ctl hup sidekiq
は、そもそもGracefulできないのにhupしてもしょうがないじゃん。というのと、
[gitlab-exporter]がPumaで動いているのでそれの再起動が追加されたというのものの2つ。
(GitLab 13で、UnicornがPuma化されるのとは関係ないらしい)
2020/05/25追記(と残念なお知らせ)
GitLab 13がリリースされました。
Webサーバーがunicornからpumaになったために、DBマイグレーション後のリスタートするものに
変更がありました。DBマイグレーション後に以下のようにしていましたが、
sudo gitlab-ctl hup unicorn
sudo gitlab-ctl usr2 puma
sudo gitlab-ctl restart sidekiq
unicornが不要になり削除して、以下のようになりました。
pumaは、以下の残念なお知らせにあるとおりhupになりました。
sudo gitlab-ctl hup puma
sudo gitlab-ctl restart sidekiq
残念なお知らせ
この記事では、GitLab omnibusインストールのゼロダウンタイムアップグレードを目指してきましたが、以下の**Caution
**にもあるように、GitLabでのpumaはフェーズドリスタートができないため、ゼロダウンタイムはできなくなりました。。
Updating GitLab installed with the Omnibus GitLab package | GitLab
https://docs.gitlab.com/omnibus/update/README.html#single-node-deployment
とはいえ、便利に更新を続けられているのでこれからもこのスクリプトでバージョンアップしていこうと思います。