機能 #54
完了GitBucket 3.11のRPMを、H2 database migrationツールを含めて作成する
説明
GitBucket 3.10から、内蔵するH2 databaseのバージョンが1.8から1.9に変更されました。
それに伴い、GitBucket 3.9以前から3.10以降にアップデートするとデータベース(スキーマ?)の不整合で起動できなくなってしまいます。
そこで、h2 migrationツールをGitBucket PRMに含めます。
https://github.com/gitbucket/h2-migration
RPMの修正事項は次のとおり
- h2 migrationツールを含める
- h2 migrationスクリプトの修正(パス)
- RPMパッケージインストール後のサービス起動を抑止
(参考)エラーメッセージは次です。
org.h2.jdbc.JdbcSQLException: テーブル "ACTIVITY" が見つかりません Table "ACTIVITY" not found; SQL statement: select x2.x3, x2.x4, x2.x5, x2.x6, x2.x7, x2.x8, x2.x9, x2.x10 from (select x11.x12 as x9, x11.x13 as x6, x11.x14 as x5, x11.x15 as x4, x11.x16 as x8, x11.x17 as x10, x11.x18 as x3, x11.x19 as x7 from (select x20."ACTIVITY_DATE" as x12, x20."ACTIVITY_TYPE" as x13, x20."ACTIVITY_USER_NAME" as x14, x20."REPOSITORY_NAME" as x15, x20."ADDITIONAL_INFO" as x16, x20."ACTIVITY_ID" as x17, x20."USER_NAME" as x18, x20."MESSAGE" as x19 from "ACTIVITY" x20) x11 inner join (select x21."UPDATED_DATE" as x22, x21."PARENT_REPOSITORY_NAME" as x23, x21."DEFAULT_BRANCH" as x24, x21."DESCRIPTION" as x25, x21."ORIGIN_REPOSITORY_NAME" as x26, x21."ORIGIN_USER_NAME" as x27, x21."PARENT_USER_NAME" as x28, x21."PRIVATE" as x29, x21."REPOSITORY_NAME" as x30, x21."USER_NAME" as x31, x21."REGISTERED_DATE" as x32, x21."LAST_ACTIVITY_DATE" as x33 from "REPOSITORY" x21) x34 on (x11.x18 = x34.x31) and (x11.x15 = x34.x30) where x34.x29 = ? order by x11.x17 desc limit 30) x2 [42102-190] at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) :(中略) at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:665) at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:385) at scala.slick.jdbc.JdbcBackend$SessionDef$class.prepareStatement(JdbcBackend.scala:152) :(後略)
高橋 徹 さんが約9年前に更新
- 説明 を更新 (差分)
H2 migrationをダウンロードします。GitHubに挙がっているので、手元にクローンするか、ダウンロード(ZIP)します。今回はダウンロードします。
- h2-migration.zip
この中は次のようなディレクトリ・ファイル構成です。
h2-migration-master/ h2-migration-master/README.md h2-migration-master/lib/ h2-migration-master/lib/h2-1.4.180.jar h2-migration-master/lib/h2-1.4.190.jar h2-migration-master/migration.sh
これを丸ごと含めることとします。
なお、migration.shは、デフォルトでは実行するユーザーの$HOME/.gitbucket下にデータベースがある想定で記載されているので、RPMに含める際に修正をします(RPMビルド時にpatchで修正)。
また、h2 databaseマイグレーションを実行する前にgitbucketを動かすとデータベースが壊れるとの注意があるので、RPMパッケージをインストールした後にサービスの自動起動は抑止します。
h2 migrationの追加¶
作成する gitbucket の RPM スペックファイルに、zipファイルをソースとして定義します。
Source0: %{name}.war Source1: %{name}.init Source2: %{name}.conf +Source3: h2-migration.zip BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
いままでは、Source0~Source2は、アーカイブではなく単にファイルとしてコピーするだけなので、展開せずに(%prepセクションを定義せずに)いました。
今回は、アーカイブを展開してコピーする必要があるので、展開する記述が必要となります。
%prepセクションを定義し、そこに%setupマクロで展開を指定します。この%setupが分かりにくいので大分悩みました。一番分かりやすかったのがここです。
https://vinelinux.org/docs/vine6/making-rpm/setup-macro.html
勘違いしていたのは、Sourceが複数あるときに、%setup も複数書くと思ってましたが、実は、1つのマクロで複数のSource定義を展開するものでした。
Source0, Souce1, Souce2 はアーカイブではないので展開せず、Source3のみ展開します。
ただし、展開する先は作成するRPMパッケージ名にちなんだ名前としておく場合、次の記述となります。
%prep %setup -T -c -a 3
- -Tオプションは、続くオプションで明示的に指定しないSourceは展開を抑制します。
今回はSource3だけ展開するので、-Tオプションを指定し、続くオプションで3を指定しています。 - -cオプションは、ディレクトリを作成しそこにcdしてからソースを展開します。デフォルトは<RPMパッケージ名-バージョン>です。
- -a N オプションは、ディレクトリにcdしてから(After)SourceNを展開します。
これによって次のように展開されるはずです。
rpm +-- BUILD : +-- gitbucket-3.11 : +-- h2-migration-master : +-- README.md : +-- migration.sh : +-- lib
高橋 徹 さんが約9年前に更新
- ステータス を 新規 から 進行中 に変更
- 進捗率 を 0 から 50 に変更
migration.sh の修正¶
デフォルトのmigration.shは、gitbucketが$HOME/.gitbucketにある想定で書かれていました。
これを、gitbucketユーザーのホームディレクトリに変更します。
-export GITBUCKET_HOME=~/.gitbucket
+export GITBUCKET_HOME=~gitbucket
また、migration.shを実行するカレントディレクトリが、migration.shのあるディレクトリにある前提で書かれていました。
これを、どのディレクトリからmigration.shを実行しても動作するように変更します。
+cd $(cd $(dirname $0); pwd)
RPMパッケージを作るときは、このような修正は元のファイルを変更するのではなく、パッチファイルとして別ファイルに記述しRPMパッケージ作成時にパッチ適用するのがお作法です。
そこで、migration.shの修正をパッチファイルに作成します。
work$ ls h2-migration-master work$ cp -pr h2-migratin-master h2-migration-master.orig work$ vi h2-migration-master/migration.sh : work$ diff -ur h2-migration-master.orig/ h2-migration-master > h2-migration-sh.patch
このh2-migration-sh.patchを、rpmbuild/SOURCESにコピーします。
SPECファイルにパッチを記述します。
Source3: h2-migration.zip
+Patch0: h2-migration-sh.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
%prep
%setup -T -c -a 3
+%patch0
高橋 徹 さんが約9年前に更新
RPMパッケージインストール時のサービス起動を抑制¶
%postun
if [ "$1" -ge 1 ]; then
- /sbin/service gitbucket restart > /dev/null 2>&1
+# /sbin/service gitbucket restart > /dev/null 2>&1
fi
将来的には復活させるので、コメントアウトとしておきます。
としていたら、RPMの案インストール時にこの部分がエラーとなってしまいました。
行頭に#をつけてコメントアウトとするのはダメっぽいので、削除しておきます。
-%postun
-if [ "$1" -ge 1 ]; then
- /sbin/service gitbucket restart > /dev/null 2>&1
-fi
また、yum updateでgitbucket更新時は、サービスを停止せずに更新後に再起動していたので、yum updte時もサービスを停止するように修正します。
%preun
+ /sbin/service gitbucket stop > /dev/null 2>&1
if [ "$1" = 0 ]; then
- /sbin/service gitbucket stop > /dev/null 2>&1
/sbin/chkconfig --del gitbucket
fi
exit 0
高橋 徹 さんが約9年前に更新
h2 databaseのファイル名¶
手元に残っているgitbucketのRPMパッケージで一番古いバージョンは2.7ですが、これを実行するとh2 databaseのファイル data.mv.db, data.trace.db, test.mv.db というファイルが生成されます。
H2 database のバージョン1.3では、databaseファイルの名前は、<名前>.h2.db でしたが、バージョン1.4からは<名前>.mv.db となったそうです。
今回は、バージョン1.4以降でのマイグレーションなので、data.mv.db の名前を処理対象とします。
-mv $GITBUCKET_HOME/data.h2.db $GITBUCKET_HOME/data.h2.db_$H2_SOURCE_VERSION
+mv $GITBUCKET_HOME/data.mv.db $GITBUCKET_HOME/data.mv.db_$H2_SOURCE_VERSION
高橋 徹 さんが約9年前に更新
動作確認¶
- gitbucket 3.3-1をインストールします。
# yum localinstall gitbucket-3.3-1.noarch.rpm
- gitbucketサービスを起動します。
# service gitbucket start
- gitbucket上で適当に操作します(ユーザー作成したりリポジトリ作成したり)。
- gitbucketサービスを停止し、データベースファイルをバックアップします。
# service gitbucket stop # cp /var/lib/gitbucket/data.*.db .
- gitbucket 3.12-1にアップデートします。
# yum localupdate gitbucket-3.12-1.noarch.rpm
- うーん、gitbucketサービスが起動してしまっています。
→ gitbucket 3.3のpostunにrestartがあるからかもしれない・・・
動作確認は失敗 |