プロジェクト

全般

プロフィール

機能 #54

GitBucket 3.11のRPMを、H2 database migrationツールを含めて作成する

高橋 徹ほぼ4年前に追加. ほぼ4年前に更新.

ステータス:
却下
優先度:
通常
担当者:
カテゴリ:
-
対象バージョン:
開始日:
2016/02/28
期日:
進捗率:

100%

予定工数:

説明

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)
:(後略)

関連するチケット

関連している 機能 #14: GitBucket 2.1のRPMを作成する終了2014/07/20

履歴

#1 高橋 徹ほぼ4年前に更新

  • 関連している 機能 #14: GitBucket 2.1のRPMを作成する を追加

#2 高橋 徹ほぼ4年前に更新

  • 説明 を更新 (diff)

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

#3 高橋 徹ほぼ4年前に更新

  • ステータス新規 から 進行中 に変更
  • 進捗率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

#4 高橋 徹ほぼ4年前に更新

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

#5 高橋 徹ほぼ4年前に更新

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

#6 高橋 徹ほぼ4年前に更新

動作確認

  • 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があるからかもしれない・・・
動作確認は失敗

#7 高橋 徹ほぼ4年前に更新

  • ステータス進行中 から 却下 に変更
  • 進捗率50 から 100 に変更

H2 migrationツールをgitbucketに含む方法は中止とします。

他の形式にエクスポート: Atom PDF

クリップボードから画像を追加 (サイズの上限: 1 GB)