GitLabのアップデート & Zero downtime updates & Slack通知

2020-05-08
#gitlab #slack
  1. 新しいGPG Keyの入手
  2. Zero downtime updates

バイト先でGitLabをGCP上にホスティングしているのだが、GitLabのアップデートが暫くされていなかったので、やった。

ついでにZero downtime updates(GitLabインスタンスをオフラインにすることなくGitLabを新しいバージョンにアップグレード出来る方法)に対応したシェルスクリプトを書いた。

新しいGPG Keyの入手

とりあえずLinuxインスタンスにSSH接続して以下を実行。

$ sudo apt-get update && sudo apt-get install gitlab-ee

したがうまくいかなかった。

2020/04/06にGitLab OmnibusのGPG Keyが更新されていたようなので新しい鍵を取得。

$ curl https://packages.gitlab.com/gpg.key -o /tmp/omnibus_gitlab_gpg.key
$ sudo apt-key add /tmp/omnibus_gitlab_gpg.key

再び $ sudo apt-get install gitlab-ee を実行したが No space left on device と言われたので以下を実行。

$ sudo apt-get autoremove

Zero downtime updates

以下のシェルスクリプトを gitlab-update.sh に書いた。

と言っても殆どこれを参考にしている↓ 【2019年版】GitLab CE/EEのゼロダウンタイムアップグレード

#!/bin/bash

export LANG=en_US.UTF-8
SLACK_WEBHOOK_API_URL=xxxxx

# check update
sudo apt update

# get versions
GITLAB_VERSIONS=$(apt-cache policy gitlab-ee | grep -1 Installed | sed -r 's/(^  )//' | grep -v "gitlab-ee:")
INSTALLED_VERSION=$(echo $GITLAB_VERSIONS | sed -r 's/Installed: (.*?) Candidate: .*/\1/g')
CANDIDATE_VERSION=$(echo $GITLAB_VERSIONS | sed -r 's/Installed: .* Candidate: (.*?)/\1/g')

# check if you can upgrade
if [ "$INSTALLED_VERSION" = "$CANDIDATE_VERSION" ];
then
   echo "Installed: $INSTALLED_VERSION is equal Candidate: $CANDIDATE_VERSION"
   echo "Exit"
   exit 0;
fi

echo "Installed: $INSTALLED_VERSION"
echo "Candidate: $CANDIDATE_VERSION"
echo "Update version"

sudo apt-get install gitlab-ee
sudo apt-mark unhold gitlab-ee
sudo SKIP_POST_DEPLOYMENT_MIGRATIONS=true sudo gitlab-ctl reconfigure
sudo gitlab-rake db:migrate
sudo gitlab-ctl hup puma
sudo gitlab-ctl restart sidekiq
MSG="{
        \"blocks\": [
                {
                        \"type\": \"section\",
                        \"text\": {
                                \"type\": \"mrkdwn\",
                                \"text\": \"*Update GitLab version* :tada: \"
                        }
                },
                {
                        \"type\": \"section\",
                        \"text\": {
                                \"type\": \"plain_text\",
                                \"text\": \"${INSTALLED_VERSION} → ${CANDIDATE_VERSION}\"
                        }
                }
        ]
}"
curl -X POST -H 'Content-type: application/json' --data "$MSG" $SLACK_WEBHOOK_API_URL
sudo apt-mark hold gitlab-ee

更新通知はSlackで受け取るようにした。

以下のコマンドを実行して完了。

$ chmod +x gitlab-update.sh

次回以降のアップデートは以下を実行することで完了する。

$ ./gitlab-update.sh