【2019年版】GitLab CE/EEのゼロダウンタイムアップグレード

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

この記事は、
[GitLab Advent Calendar 2019 - Qiita](https://qiita.com/advent-calendar/2019/gitlab)
の1日目です

## 0. 前置き
2018年6月にこんなのを書きました。

GitLab CEで Zeroダウンタイムアップグレードを試す - Qiita
https://qiita.com/ynott/items/77e6f287a44bc1d6e797

2019年になって、いくつか更新されたので変更があった部分をご紹介します。
ゼロダウンタイムアップグレードについては上記URLをご確認ください。

## 1. 2019年になって変更された点

1. Enterprise Editionにも対応した。  
　会社でStarter Editionを利用するようになったのでEnterprise Editionにも対応するようにしました。
2. Mattermostへ通知するようにした。  
　会社でSlackからMattermostへ移行しました。その為、更新通知をMattermostにも飛ばすようにしました。
3. aptでGitLabが自動的にアップデートをかからないようにした。  
　Ubuntuのパッケージをデイリーで自動バージョンアップするようにしたのですが、GitLabも同時にバージョンアップすると不都合があるので、GitLabパッケージだけ `sudo apt-mark hold gitlab-ce` しておいて以下のbashスクリプトが実行されたときだけunholdしてアップグレードするようにしました。
4. メジャーバージョンアップも自動でアップグレードするようにした。  
　2018年のスクリプトではメジャーバージョンアップは避けるようにしていましたが、運用成績も悪くなかったのでメジャーバージョンアップ時にもゼロダウンタイムアップグレードするようにしました。

## 2. 2019年のゼロダウンタイムのアップグレードスクリプトでの運用実績

2019年10月に1回だけアップグレードスクリプトでアップグレードされても、バージョンアップされていないということがあり、同じバージョンのアップグレードが4回ほどかかりました。なにか引っかかっているのかとも思いましたが、最終的に4回目で更新されたので何が問題だったか不明です。

## 3. 2019年のアップグレードスクリプト

2019年のアップグレードスクリプトです。  
大枠は変わっていません。

```bash
#!/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`
以下のアップグレード後のアップグレードスクリプトがこれまでは、

```bash:これまで
sudo gitlab-ctl hup unicorn
sudo gitlab-ctl hup sidekiq
```
だったのに

```bash:変更後
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マイグレーション後に以下のようにしていましたが、

```bash:これまで
sudo gitlab-ctl hup unicorn
sudo gitlab-ctl usr2 puma
sudo gitlab-ctl restart sidekiq
```

unicornが不要になり削除して、以下のようになりました。
pumaは、以下の残念なお知らせにあるとおりhupになりました。

```bash:変更後
sudo gitlab-ctl hup puma
sudo gitlab-ctl restart sidekiq
```

# 残念なお知らせ

この記事では、GitLab omnibusインストールのゼロダウンタイムアップグレードを目指してきましたが、以下の**`Caution`**にもあるように、GitLabでのpumaはフェーズドリスタートができないため、ゼロダウンタイムはできなくなりました。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/51b140f6-1545-acd7-3e1f-9c1946c35f3c.png)

Updating GitLab installed with the Omnibus GitLab package | GitLab
https://docs.gitlab.com/omnibus/update/README.html#single-node-deployment

とはいえ、便利に更新を続けられているのでこれからもこのスクリプトでバージョンアップしていこうと思います。