« 嫁と格安SIM − mineoの場合 − (その8) | トップページ | NAS(AS-202TE)の個人ディレクトリでCGIを動かしてみた »

2017.10.29

NAS(AS-202TE)でTracとGit連携

AS-202TEにTracをインストールするで取り上げたとおり、NASにTracをインストールして、運用を試みることにしました。

さらに、TracとGitを連携できることを確認しました。GitのリモートリポジトリをNASに作成して、NASのWebアプリケーションとしてTracを動作させてみます。その過程をメモしておきます。

NASとして使用しているAS-202TEには、AS-202TEをADM3にアップデートしてEntware-ngを使ってみるに記載したとおり、Entware-ngをインストールしていますので、opkgコマンドを使用してGitを導入します。なお、AppCentral経由でGitをインストールできますが、バージョンがかなり古いです(Git 1.8.5.2r3)。entware-ngからインストールするとGit 2系をインストールできます。


# opkg install git
# git --version
git version 2.14.1

例えば、Mac miniを開発環境とした場合、Mac miniローカルでgitリポジトリを管理し、リモートリポジトリの置き場をNASにします。ローカルリポジトリがMac miniのローカルディスクにあるとして、NASのディレクトリが/Volumes/Homeにマウントされている場合、NASにあるリモートリポジトリをcloneする際の操作例は以下のとおり。


$ cd /Volumes/Home/git-repository/
$ git clone --bare --shared file:///Users/[ユーザ名]/work/sample ./sample.git

ここで、file:///を付加しない場合(/Users/[ユーザ名]/work/sample)、リモートリポジトリからローカルリポジトリにリンクするだけになってしまいますので、file:///を付加して、ファイル実体も含めてcloneします。

次に、リモートリポジトリをローカルリポジトリに紐付けます。


$ cd ~/work/sample
$ git remote add origin file:///Volumes/Home/git-repository/sample.git

NASで稼働しているTracでリポジトリを登録します。
NASのユーザーディレクトリにリモートリポジトリがあるのであれば、/home/[ユーザ名]/の下のリモートリポジトリを登録します。
2017102901

GItのリポジトリを登録すると、以下のような画面が表示されます。
2017102903
trac-adminコマンドでリポジトリを同期しろ、というメッセージが表示されています。
また、コミットされた変更をフックしてtrac-adminコマンドに変更を登録しなさい、というメッセージ表示もされています。

前者のメッセージに対しては、NASにログインして、


# /usr/local/AppCentral/python/bin/trac-admin "/root/trac/projects/sandbox" repository resync "sample01"

とします。

問題は後者で、Mac miniから変更すると、フックするのがMac miniから動作させたGitですから、NASのtrac-adminを実行できません。したがって、フックしたときにファイルを書き出し、このファイルの変更をモニタリングしてtrac-adminを実行する必要があります。

まず、ファイル更新をモニタリングするために、inotify-toolsを導入します。NASにログインして、


# opkg install inotify-tools

し、inotify-toolsを導入します。こうして、inotifywaitコマンドを使って、ファイルの更新をモニタできるようになりました。

リポジトリのhooks配下にあるpost-update.sampleをpost-updateにコピーし、このpost-updateを、以下のように書き換えます。


#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
#
REV=$(git rev-parse HEAD)
OUTPUT_FILE='/[マウントされたディレクトリ]/git-flag/flag.txt'
echo "sandbox sample01 $REV" > $OUTPUT_FILE
exec git update-server-info

このshellは、リモートリポジトリに変更をpushしたタイミングでTracのプロジェクト名、登録するリポジトリ名、GitのHEADのRevision値をgit-flag/flag.txtに書き出します。

次に、ファイル更新をモニタリングするためのshell scriptを作成します。


#!/bin/sh
#
TRAC_ADMIN_BIN=/usr/local/AppCentral/python/bin/trac-admin
GIT_REPOSITORY_FLAG_FILE=/home/[ユーザ名]/git-repository/git-flag/flag.txt
GIT_REPOSITORY_FLAG_DIR=/home/[ユーザ名]/git-repository/git-flag
TRAC_PROJECT_DIR=/root/trac/projects
OLD=
#
trac_admin_func() {
# cd $TRAC_PROJECT_DIR
$TRAC_ADMIN_BIN "$TRAC_PROJECT_DIR/$1" changeset \
added "$2" $3
}
#
do_start() {
inotifywait -e close_write -m -s -r $GIT_REPOSITORY_FLAG_DIR | \
while read l; do
S=$(cat $GIT_REPOSITORY_FLAG_FILE)
if test "$S" != "$OLD"; then
trac_admin_func $S
fi
OLD=$S
done
return 0
}
#
case "$1" in
start)
do_start
;;
stop)
;;
restart)
do_start
;;
*)
echo "usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0

このスクリプトを、/opt/etc/init.d/に登録します。例えば、S99tracadminというシンボリックリンクを作成すると良いでしょう。

# ls -l /opt/etc/init.d/S99tracadmin
lrwxr-xr-x 1 root root 25 Oct 25 02:57 /opt/etc/init.d/S99tracadmin -> /root/script/S99tracadmin*

Mac miniから変更をNASにpushしたタイミングでファイルを書き出し、当該ファイルが変更されると、trac-adminコマンドを実行して、変更を登録します。
実は、これしなくてもリポジトリブラウザに変更が反映されているみたいなのですが、状況によっては必要になるかもしれないので、推奨されていることもあり、そのまま運用しています。

最後に、リポジトリブラウザから見た履歴例はこちら。
2017102902

|

« 嫁と格安SIM − mineoの場合 − (その8) | トップページ | NAS(AS-202TE)の個人ディレクトリでCGIを動かしてみた »

NAS」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: NAS(AS-202TE)でTracとGit連携:

« 嫁と格安SIM − mineoの場合 − (その8) | トップページ | NAS(AS-202TE)の個人ディレクトリでCGIを動かしてみた »