ソフトウェアエンジニアリング - 機能 #54 GitBucket 3.11 の RPM を H2 database migration ツールを含めて作成する 2016/02/28 10:47 - 高橋徹 ステータス : 却下開始日 : 2016/02/28 優先度 : 通常期日 : 担当者 : 高橋徹進捗率 : 100% カテゴリ : 予定工数 : 0.00 時間 対象バージョン : Linux 作業時間 : 0.00 時間 説明 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 x6, x11.x14 as x5, x11.x15 as x4, x11.x16 as x8, x11.x17 as x10 (select x20."activity_date" as x12, x20."activity_type" as x13, x20."repository_name" as x15, x20."additional_info" as x16, x20 x18, x20."message" as x19 from "ACTIVITY" x20) x11 inner join ( x21."parent_repository_name" as x23, x21."default_branch" as x2 x21."origin_repository_name" as x26, x21."origin_user_name" as x21."private" as x29, x21."repository_name" as x30, x21."user_n x32, x21."last_activity_date" as x33 from "REPOSITORY" x21) x34 x34.x30) where x34.x29 =? order by x11.x17 desc limit 30) x2 [ at org.h2.message.dbexception.getjdbcsqlexception(dbexcepti :( 中略 ) at org.h2.jdbc.jdbcconnection.preparestatement(jdbcconnecti at com.mchange.v2.c3p0.impl.newproxyconnection.preparestate at scala.slick.jdbc.jdbcbackend$sessiondef$class.preparesta :( 後略 ) 関連するチケット : 関連している機能 #14: GitBucket 2.1 の RPM を作成する終了 2014/07/20 履歴 #1-2016/02/28 10:47 - 高橋徹 - 関連している機能 #14: GitBucket 2.1 の RPM を作成するを追加 #2-2016/02/28 13:37 - 高橋徹 - 説明を更新 H2 migration をダウンロードします GitHub に挙がっているので 手元にクローンするか ダウンロード (ZIP) します 今回はダウンロード h2-migration.zip 2018/07/21 1/6
この中は次のようなディレクトリ ファイル構成です 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 ビルド時に patch で修正 ) また h2 database マイグレーションを実行する前に gitbucket を動かすとデータベースが壊れるとの注意があるので RPM パッケージをインストーサービスの自動起動は抑止します h2 migration の追加 作成する gitbucket の RPM スペックファイルに zip ファイルをソースとして定義します Source0: Source1: Source2: +Source3: BuildRoot: %{name}.war %{name}.init %{name}.conf h2-migration.zip %{_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 2018/07/21 2/6
#3-2016/02/28 14:00 - 高橋徹 - ステータスを新規から進行中に変更 - 進捗率を 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-migra この h2-migration-sh.patch を rpmbuild/sources にコピーします SPEC ファイルにパッチを記述します Source3: +Patch0: BuildRoot: h2-migration.zip h2-migration-sh.patch %{_tmppath}/%{name}-%{version}-%{release}-root %prep %setup -T -c -a 3 +%patch0 2018/07/21 3/6
#4-2016/02/28 14:02 - 高橋徹 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-2016/02/28 20:59 - 高橋徹 h2 database のファイル名 2018/07/21 4/6
手元に残っている gitbucket の RPM パッケージで一番古いバージョンは 2.7 ですが これを実行すると h2 database のファイル da data.trace.db, test.mv.db というファイルが生成されます H2 database のバージョン 1.3 では database ファイルの名前は < 名前 >.h2.db でしたが バージョン 1.4 からは < 名前 今回は バージョン 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-2016/02/28 21:32 - 高橋徹 動作確認 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 があるからかもしれない 動作確認は失敗 2018/07/21 5/6
Powered by TCPDF (www.tcpdf.org) #7-2016/02/28 21:39 - 高橋徹 - ステータスを進行中から却下に変更 - 進捗率を 50 から 100 に変更 H2 migration ツールを gitbucket に含む方法は中止とします 2018/07/21 6/6