GitLab CE をアップグレード 14.4.0 -> 15.3.3

私がGitLabを使い始めたころは、ソースインストールから行っていました。
この頃はGitLabのアップグレードも大変でした。

しばらくして、Omnibus 版に移行しまして yum 管理になりました。

これで yum だけで簡単にアップデートできる!

そう思っていました。
そうではありませんでした。

ということで、本記事になります。

ちなみに、Omnibus版に移行した GitLab 9.0.2 から 本記事にある GitLab 14.4.0 までは、yum の自動更新でトラブルなく更新されてきていました。

環境

rpm -qa | grep centos-release
centos-release-7-9.2009.1.el7.centos.x86_64

GitLabのアップデートが失敗する?

いちおう確認しておこうと思って何気なく yum update を叩いてみたら GitLab の更新がありました。

自動更新の設定をしているから放っておいても良いのですが、せっかくなのでその場でインストールすることにしました。

その結果が下記です。
結論から言うとGitLabのアップデートに失敗しています。

失敗しているから yum update のリストに残っていたわけですね。

※yum updateは定期実行するようにしているので、更新に失敗したGitLabだけが残っている状態です。

yum update
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
gitlab_gitlab-ce/x86_64/signature                                                                                                                                            |  862 B  00:00:00
gitlab_gitlab-ce/x86_64/signature                                                                                                                                            | 1.0 kB  00:00:00 !!!
gitlab_gitlab-ce-source/signature                                                                                                                                            |  862 B  00:00:00
gitlab_gitlab-ce-source/signature                                                                                                                                            |  951 B  00:00:00 !!!
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ gitlab-ce.x86_64 0:14.4.0-ce.0.el7 を 更新
---> パッケージ gitlab-ce.x86_64 0:15.3.3-ce.0.el7 を アップデート
--> 依存性解決を終了しました。

依存性を解決しました

====================================================================================================================================================================================================
 Package                                     アーキテクチャー                         バージョン                                           リポジトリー                                        容量
====================================================================================================================================================================================================
更新します:
 gitlab-ce                                   x86_64                                   15.3.3-ce.0.el7                                      gitlab_gitlab-ce                                   1.0 G

トランザクションの要約
====================================================================================================================================================================================================
更新  1 パッケージ

総ダウンロード容量: 1.0 G
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
gitlab-ce-15.3.3-ce.0.el7.x86_64.rpm                                                                                                                                         | 1.0 GB  00:01:40
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
gitlab preinstall: It seems you are upgrading from major version 14 to major version 15.
gitlab preinstall: It is required to upgrade to the latest 15.0.x version first before proceeding.
gitlab preinstall: Please follow the upgrade documentation at https://docs.gitlab.com/ee/update/index.html#upgrade-paths
エラー: %pre(gitlab-ce-15.3.3-ce.0.el7.x86_64) スクリプトの実行に失敗しました。終了ステータス 1
Error in PREIN scriptlet in rpm package gitlab-ce-15.3.3-ce.0.el7.x86_64
  検証中                  : gitlab-ce-15.3.3-ce.0.el7.x86_64                                                                                                                                    1/2
gitlab-ce-14.4.0-ce.0.el7.x86_64 was supposed to be removed but is not!
  検証中                  : gitlab-ce-14.4.0-ce.0.el7.x86_64                                                                                                                                    2/2

失敗:
  gitlab-ce.x86_64 0:14.4.0-ce.0.el7                                                               gitlab-ce.x86_64 0:15.3.3-ce.0.el7

完了しました!

GitLabのバージョンを確認する

現在のバージョンはWebブラウザから確認できます。

こちらのようにGitLabにログインして右上のアイコンから「Help」をクリックします。

https://git.example.com/help

もしくは上記のようにアドレスバーに直接入力してもOKです。

上図だとコミュニティエディションの 14.4.0 ですね。

GitLabをアップデートできない原因

上記の yum update の結果でいうと次の部分です。

gitlab preinstall: It seems you are upgrading from major version 14 to major version 15.
gitlab preinstall: It is required to upgrade to the latest 15.0.x version first before proceeding.

意訳すると「いまのバージョンから一気に最新版にはできないよ」ってことです。
そして「次のページを見なさい」って続きます。

https://docs.gitlab.com/ee/update/index.html#upgrade-paths

大事なのは次の部分です。

ここにあるバージョンごとに刻んでアップデートしましょう。ということです。
Z の数字はその中での最新版(一番大きな数字)を選択になります。

ちなみに今回は14.4.0 から 15.3.3 への更新です。

ということで次のようになります。

現在:14.4.0

最初に 14.9.5 にアップグレード

続けて 14.10.4 にアップグレード

続けて 15.0.2 にアップグレード

続けて 15.4.0 になるんですが、CentOS 7 の yum では 15.3.3 になっているのでここまでにします。

GitLab CE のアップグレード手順

アップグレードする前に

yumのリポジトリの更新を行っておきます。

コードの入手先は▼です。
https://packages.gitlab.com/gitlab/gitlab-ce/install#bash-rpm

curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
Detected operating system as centos/7.
Checking for curl...
Detected curl...
Downloading repository file: https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/config_file.repo?os=centos&dist=7&source=script
done.
Installing pygpgme to verify GPG signatures...
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
gitlab_gitlab-ce-source/signature                                                                                                                                            |  862 B  00:00:00
gitlab_gitlab-ce-source/signature                                                                                                                                            |  951 B  00:00:01 !!!
パッケージ pygpgme-0.3-9.el7.x86_64 はインストール済みか最新バージョンです
何もしません
Installing yum-utils...
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
パッケージ yum-utils-1.1.31-54.el7_8.noarch はインストール済みか最新バージョンです
何もしません
Generating yum cache for gitlab_gitlab-ce...
Generating yum cache for gitlab_gitlab-ce-source...

The repository is setup! You can now install packages.

Unicorn を Puma に切り替える

この作業を行っているときのバージョンは GitLab CE 14.4.0 です。
なぜなら、後のステップである 14.9.5 へのアップグレードに失敗したからです。

公式の案内は▼です。
https://gitlab-docs.creationline.com/omnibus/settings/puma.html

意訳すると「GitLab 13.0 以降 Puma がデフォルトで Unicorn は無効になった」ということです。

ということで、unicorn を無効にして puma を有効にします。

vi /etc/gitlab/gitlab.rb

次の形式の先頭に # をつけてコメント
unicorn['キー'] = ・・・

なんですが、ひととおりみたところ # が付いたままだったのでカスタマイズしていなければそのままでOKです。

次に
puma['キー'] = ・・・

を探して # を外していくのですが、私の環境では puma が入るより古い時代からなのでそもそも puma[''] が含まれてないようです。

ということで結果としては、次の1行を追記することになります。
ファイルの末尾でOKです。

puma['enable'] = true
gitlab-ctl reconfigure

GitLab CE 14.4.0 を 14.9.5 にアップグレード

yum install gitlab-ce-14.9.5-ce.0.el7.x86_64
gitlab-ctl reconfigure

しばらく時間がかかります。

次のようなエラー(赤文字)が出て失敗しました。

Running handlers:
There was an error running gitlab-ctl reconfigure:

rails_migration[gitlab-rails] (gitlab::database_migrations line 51) had an error: Mixlib::ShellOut::ShellCommandFailed: bash[migrate gitlab-rails database] (/opt/gitlab/embedded/cookbooks/cache/cookbooks/gitlab/resources/rails_migration.rb line 16) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
---- Begin output of "bash"  "/tmp/chef-script20220922-25906-130pkbc" ----
STDOUT: rake aborted!
StandardError: An error has occurred, all later migrations canceled:

PG::InvalidObjectDefinition: ERROR:  functions in index predicate must be marked IMMUTABLE
/opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/database/migration_helpers.rb:155:in `block in add_concurrent_index'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
== 20211004110500 AddTemporaryIndexToIssueMetrics: migrating ==================
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:issue_metrics, :issue_id, {:where=>"EXTRACT(YEAR FROM first_mentioned_in_commit_at) > 2019", :name=>"index_issue_metrics_first_mentioned_in_commit", :algorithm=>:concurrently})
   -> 0.0063s
-- execute("SET statement_timeout TO 0")
   -> 0.0002s
-- add_index(:issue_metrics, :issue_id, {:where=>"EXTRACT(YEAR FROM first_mentioned_in_commit_at) > 2019", :name=>"index_issue_metrics_first_mentioned_in_commit", :algorithm=>:concurrently})
-- execute("RESET statement_timeout")
   -> 0.0002s

インデックスを作成

いきなりマイグレーションしたいところですが、失敗します。
その原因をつぶすために先にインデックスを手動で作成しましょう。

gitlab-psql に切り替えます。

su - gitlab-psql
/opt/gitlab/embedded/bin/psql --port 5432 -h /var/opt/gitlab/postgresql gitlabhq_production

gitlabhq_production=# に続けて▼

確認

\d members

タイムゾーンを設定(いらないかも?)

alter table members alter created_at type timestamp with time zone;

インデックスを作成
根拠 https://gitlab.com/gitlab-org/gitlab/-/issues/339091

CREATE INDEX CONCURRENTLY tmp_idx_orphaned_invite_tokens ON members (id) WHERE invite_token IS NOT NULL and invite_accepted_at IS NOT NULL and invite_accepted_at < created_at;

※▲で &lt; になっているところは < です。

TIMEZONE('UTC', created_at) を使うように説明されていますが、 created_at が正解です。

もう1つインデックスを作成
根拠 https://gitlab.com/gitlab-org/gitlab/-/issues/343724#note_716843176

CREATE INDEX CONCURRENTLY index_issue_metrics_first_mentioned_in_commit ON issue_metrics
USING btree (issue_id)
WHERE EXTRACT(YEAR FROM first_mentioned_in_commit_at at time zone 'UTC') > 2019;
quit;
exit

マイグレーション

データベースを更新します。

gitlab-rake db:migrate

ということで戻ってきました。やり直しましょう。

gitlab-ctl reconfigure

再起動します。

gitlab-ctl restart

ブラウザでGitLabにアクセスして確認します。

ここにきて、502 はしんどいですね(><)

大丈夫です。
1~2分待てば復活します。

バージョンを確認してみましょう。

あれ?

14.9.5 になっているはずが変わっていません。

もう一度最初からやり直してみます。
ここまでいっぱい書いてきましたが、エラー無く進んだ場合の正規ルートは yum の1手順だけです。

yum install gitlab-ce-14.9.5-ce.0.el7.x86_64

完全に成功しました!

実は見ないフリしてたんですが、最初の yum install でよく見るとエラーが出てたんですよね。
関係ないかなと思って飛ばしてたんですが、関係ありました。

細かい手順は上に書いた通りなので省略しますが、ざっくり次のような流れでした。

  • yum install でエラーになってる
  • データベースに手動でインデックスを追加
  • yum install をやりなおし

というわけでバージョンアップ成功です。

ちなみに yum install のあと、次のコマンドを実行する必要がありそうですが、行う必要はありません。

gitlab-ctl reconfigure
gitlab-ctl restart

GitLab CE 14.9.5 を 14.10.4 にアップグレード

https://docs.gitlab.com/ee/update/index.html#upgrade-paths

バージョンアップを刻む必要あるかな?と思いそうになりますが、思わぬトラブルの元なので公式にしたがって進めましょう。

yum install gitlab-ce-14.10.4-ce.0.el7.x86_64

1GB近くあるので割と時間がかかります。
ほとんど操作することはなく待機時間が大半です。

そうこうしているうちに完了したようなのでブラウザから確認してみましょう。

ランダムにページを見て周って確認OKです。

GitLab CE 14.10.4 を 15.0.5 にアップグレード

https://docs.gitlab.com/ee/update/index.html#upgrade-paths

次は15.0.5にバージョンアップです。
15.0.Z なので、15.0 系で最終のものを選択します。

15.0. の最終バージョンは次のコマンドで確認できます。

yum list --showduplicates gitlab-ce|grep 15\.0\.
yum install gitlab-ce-15.0.5-ce.0.el7.x86_64

無事、15.0.5 にアップグレード完了です。
ランダムにページを見て周って確認OKです。

GitLab CE 15.0.5 を 15.3.3 にアップグレード

今回は最新の 15.4.0 にしようとして、リポジトリにまだ登録がなかったので1つ前の 15.3.3 をインストールという流れです。

https://docs.gitlab.com/ee/update/index.html#upgrade-paths

次は15.4.0にバージョンアップです。
15.4.0 なので、15.0 系で最終のものを選択します。

ちなみにバージョンの種類は▼で確認できます。
https://gitlab.com/gitlab-org/gitlab-foss/-/tags

yum install gitlab-ce-15.4.0-ce.0.el7.x86_64

ダメでした。

確認してみましょう。

yum list --showduplicates gitlab-ce

登録されている最新が、15.3.3ですね。

今回は 15.3.3 までにしましょう。(2022年9月)

yum install gitlab-ce-15.3.3-ce.0.el7.x86_64

ということで、最新版にアップグレードが完了しました。

CentOS 7のリポジトリに合わせる?

結論としては合わせないほうが良いです。

というのも、GitLabのバージョンアップは区切り区切りで指定されたバージョンを経由する必要があるからです。

これを行わないとおそらくデータベースが壊れるのだと思います。
※マイグレーションがうまく動かない

一方、CentOSはというと、GitLabの都合に合わせてくれていないように見受けられます。

今回はまったように、yum で自動更新を行ってきたGitLabが 14.4.0 という中途半端なバージョンで止まっていました。
しかもマイグレーションの失敗を伴って。

ということで、yum による自動更新は今後行わない方向でいきたいと思います。

yum の自動更新から GitLab を除外する

vi /etc/yum/yum-cron.conf
[base]
exclude = gitlab-ce

これで、yum update は定期的に自動実行されつつも gitlab は更新対象から外れます。

今後は手動でアップデートを行っていこうと思います。

導入サポート・運用サポート

ということで宣伝です。

弊社ではPHP・MySQL・javascriptを使ったWebサイトを得意としています。
これらは2005年頃から触り続けてきていることもあり得意中の得意です。

Git については2012年頃から、GitLab は2014年頃 GitLab 6.8 のときから使い続けています。
ちなみに Github は取引先の都合で使用することはもちろんあります。

1日で完了する簡単なことから、半年・1年規模のものまで幅広く承っています。
特にプログラム開発が必要になるようなカスタマイズは遠慮なくご相談ください。

フロントの見た目に関わるところはデザイン会社が担当、裏方の技術部分を弊社が担当するケースもあり柔軟に対応することができます。

メールやSNSなどのメッセージで簡単に連絡いただいたあとで、電話していただけると確実です。(お問い合わせ