snbhsmt_log

ネットワークとコンピュータ、その他いろいろ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Subversion リポジトリのバックアップ、リストア

Subversion リポジトリのバックアップ方法として svnadmin dump, svnadmin hotcopy, hot-backup.py の 3 つを検討した結果、hot-backup.py を使う事にした。 1 日 1 回、同スクリプトを cron から実行する様にした。

環境 : CentOS 4.6 / Subversion 1.1.4-2 (rpm)

svnadmin dump

  • リポジトリ全体ではなくデータベースしかバックアップできない。
  • 他のクライアントがリポジトリにアクセスしていても安全にバックアップできる。
  • dump ファイルが壊れていて svnadmin load でリストアできない場合を考慮して リビジョンを分けてバックアップしておく等の対策が必要。

/path/to/repo のデータベースを /path/to/dump-file にバックアップ。

# svnadmin dump /path/to/repo > /path/to/dump-file

それをリストアするには、新たにリポジトリを作成して svnadmin load する。

# svnadmin create /path/to/newrepo
# svnadmin load /path/to/newrepo < /pato/to/dump-file

svnadmin hotcopy

  • リポジトリ全体をバックアップできる。
  • 他のクライアントがリポジトリにアクセスしていても安全にバックアップできる。

/path/to/repo を /path/to/backup にバックアップ。 /path/to/backup は空ディレクトリでなければならない。

# svnadmin hotcopy /path/to/repo /path/to/backup

バックアップしたものはリポジトリそのものなので、そのままリストア可能。

hot-backup.py

/usr/share/doc/subversion-1.1.4/tools/backup/hot-backup.py スクリプトを 利用すると svnadmin hotcopy で複数バックアップしてくれる。

# python /usr/share/doc/subversion-1.1.4/tools/backup/hot-backup.py /path/to/repo /path/to/dir

最新リビジョンが 123 の時、/path/to/dir/repo-123 リポジトリが作成される。 /path/to/dir/repo-123 が既に存在する場合は /path/to/dir/repo-123-1 に作成される。 標準では 64 個のリポジトリが作成され、それ以上になった場合は古いものから削除される。 変更するにはスクリプト中の num_backups 変数の初期値を直接書き換える。

# Number of backups to keep around (0 for "keep them all")
#num_backups = 64
num_backups = 16

ちなみに、以下でリポジトリのデータベースを検証できる。

# svnadmin verify /path/to/repo
スポンサーサイト

Trac と Subversion を連携させる

Trac の配布アーカイブやリポジトリの contrib ディレクトリにある trac-pre-commit-hook と trac-post-commit-hook スクリプトを利用すると、 Trac と SCM を連携させる事ができる。 今回は Trac と Subversion を連携させてみる。

環境 : CentOS 4.6 / Subversion 1.1.4-2 (rpm) / Trac 0.10.4-1 (rpmforge)

標準状態でも Subversion のコミット・ログに #4 とか書いておくと、 Trac のリポジトリ・ブラウザがチケット 4 へのリンクに変換してくれる。 上記のスクリプトを利用すると、メッセージ (今回は Subversion のコミット・ログ) を Trac のチケット・コメントとして投稿し、それにチェンジセットへのリンクを追加してくれる。 これによって、要求と、変更内容の双方向リンクが作成できる。

スクリプトに与えるメッセージ (コミット・ログ) には、 キーワードとチケット番号が含まれている必要がある。 ここではそれをチケット・コマンドと言う事にする。

チケット・コマンドはコマンドとチケット番号から成り、 他の語句とは英数字以外で分離している必要がある。

コマンドは 2 種類あって、それぞれ複数の書き方ができる。 大文字、小文字の区別はない。

address, references, refs, re コマンドは、メッセージを指定したチケット番号にコメントとして投稿し、 チェンジセットへのリンクを作成する。

これはチケット references #4 に対するコメントになる
これ refs #4 は上と同じ

closes, fixes コマンドは、 それに加えてチケットを close する。

これはチケット closes #21 に対するコメントになり、しかもクローズする
これ fixes #21 は上と同じ

チケット番号はコマンドに対して複数指定可能。

チケット番号を複数指定する例 refs #14 #27
こう書いても refs #14, #27
こう書いても refs #14 & #27
こう書いても refs #14 and #27 同じ
異なる方法で refs #1, #2 & #3 and #4 指定してあっても平気

コマンドが混在していても良い。

refs #5, #6 and #9
fixes #7 & #8

詳細はスクリプトと Python ライブラリリファレンスの 4.2.1 正規表現のシンタックス を参照。

で、ここからが連携の為の作業。

trac-pre-commit-hook スクリプトは、 メッセージに有効なチケット・コマンドが含まれるかチェックする。 有効と判断されるには、 チケット・コマンドの書式が正しい、 チケットが存在する、 チケットが close されていない、 事が必要。 含まれていない場合は 0 以外の終了コードを返す。

$ python /usr/local/trac/contrib/trac-pre-commit-hook
Usage: /usr/local/trac/contrib/trac-pre-commit-hook <trac_project> <log_message>

pre-commit フック・スクリプトから trac-pre-commit-hook を実行して、 コミット・ログにチケット・コマンドを書かないとコミットできない様にする。

#!/bin/sh

REPOS="$1"
TXN="$2"

TRAC_ENV='/var/lib/trac/tractest'
LOG=`/usr/bin/svnlook log -t "$TXN" "$REPOS"`

/usr/bin/python /usr/local/trac/contrib/trac-pre-commit-hook "$TRAC_ENV" "$LOG" || exit 1

trac-post-commit-hook スクリプトは、 メッセージに含まれるチケット・コマンドを解釈し、 該当するチケットにコメントとして投稿する。 且つそのコメントにチェンジセットへのリンクを付加する。 また、コマンドが closes, fixes の場合、そのチケットを close する。

$ python /usr/local/trac/contrib/trac-post-commit-hook --help
usage: trac-post-commit-hook [options]

options:
  -h, --help            show this help message and exit
  -eENV, --require-envelope=ENV
                         Require commands to be enclosed in an envelope. If
                        -e[], then commands must be in the form of [closes #4].
                        Must be two characters.
  -pPROJECT, --project=PROJECT
                        Path to the Trac project.
  -rREV, --revision=REV
                        Repository revision number.
  -uUSER, --user=USER   The user who is responsible for this action (not used
                        anymore)
  -mMSG, --msg=MSG      The log message to search (not used anymore)
  -cENCODING, --encoding=ENCODING
                        The encoding used by the log message (not used anymore)
  -sURL, --siteurl=URL  The base URL to the project's trac website (to which
                        /ticket/## is appended).  If this is not specified, the
                        project URL from trac.ini will be used.

post-commit フック・スクリプトから trac-post-commit-hook を実行して、 コミット・ログを通じてチケットと変更内容を関連付ける。

#!/bin/sh

REPOS="$1"
REV="$2"

LOG=`/usr/bin/svnlook log -r $REV $REPOS`
AUTHOR=`/usr/bin/svnlook author -r $REV $REPOS`
TRAC_ENV='/var/lib/trac/tractest'

/usr/bin/python /usr/local/trac/contrib/trac-post-commit-hook \
 -p "$TRAC_ENV"  \
 -r "$REV"       \
 -u "$AUTHOR"    \
 -m "$LOG"

-s オプションを付けても付けなくても変わりなかった。

-e オプションでチケット・コマンドを囲む文字を指定できる。 例えば -e "[]" とすると refs #1 では認識されず、[refs #1] と書く必要がある。 ただし、trac-pre-commit-hook はこれに該当するオプションが無いので refs #1 を 有効なチケット・コマンドと認識してしまう。

参考
[Think IT] 第4回: チケットとソースコードを連携せよ! (1/3)

Subversion のフック・スクリプト (コミット関連)

Subversion では、いくつかのタイミングで、外部プログラムを実行できる。 そのプログラムは一般的にフック・スクリプトと言われる。

環境 : subversion-1.1.4-2 (rpm) / CentOS 4.6

プログラムが実行される条件

  • リポジトリの hooks ディレクトリに決められたファイル名で存在する。
  • そのファイルが実行可能。 フック・スクリプトと言っているがバイナリの実行ファイルでも OK 。 linux の場合は実行パーミッションがセットされている必要がある。
  • ユーザにそのファイルを実行する権限がある。

実行されるファイル (ここではコミット関連のみ)

start-commit ファイル
コミット・トランザクションが作られる前に実行される。
第一引数 : リポジトリへのパス
第二引数 : コミットしようとしているユーザ名
終了コードが 0 以外の場合トランザクションが作られる前に中止。
pre-commit ファイル
実際のコミットの前に実行。
第一引数 : リポジトリへのパス
第二引数 : コミットされる筈のトランザクションの名前
終了コードが 0 以外の場合トランザクションが作られる前に中止。
post-commit ファイル
コミットされ、新しいリビジョンが作られた後に実行。
第一引数 : リポジトリへのパス
第二引数 : 今回作られたリビジョン番号
終了コードは無視される。

/home/svn/test1 リポジトリにフック・スクリプトを作成してみる。

$ cat /home/svn/test1/hooks/start-commit
#!/bin/sh

REPOS="$1"
USER="$2"

LOG=/tmp/test1-start-commit.log

echo `/bin/date '+%F %T %N'` " ------------------------------" >> $LOG
echo "repository[$REPOS]" >> $LOG
echo "user[$USER]" >> $LOG
/usr/bin/id >> $LOG
umask >> $LOG
echo "LANG[$LANG]" >> $LOG
/bin/env >> $LOG

exit 0
$ cat /home/svn/test1/hooks/pre-commit
#!/bin/sh

REPOS="$1"
TXN="$2"

LOG=/tmp/test1-pre-commit.log

echo `/bin/date '+%F %T %N'` " ------------------------------" >> $LOG
echo "repository[$REPOS]" >> $LOG
echo "transaction[$TXN]" >> $LOG

exit 0
$ cat /home/svn/test1/hooks/post-commit
#!/bin/sh

REPOS="$1"
REV="$2"

LOG=/tmp/test1-post-commit.log

echo `/bin/date '+%F %T %N'` " ------------------------------" >> $LOG
echo "repository[$REPOS]" >> $LOG
echo "revision[$REV]" >> $LOG

このリポジトリに Apache からアクセスする。 Apache の実行アカウントが apache:apache で、 これらのスクリプトの所有グループが apache なので グループにも実行パーミッションを設定。

# chmod ug+x start-commit

コミットした結果。 環境変数 PATH が設定されてないので、スクリプトを書く時は注意だ。

# ls -l /tmp
total 24
-rw-r--r--  1 apache apache 106 Apr  9 19:05 test1-post-commit.log
-rw-r--r--  1 apache apache 111 Apr  9 19:05 test1-pre-commit.log
-rw-r--r--  1 apache apache 235 Apr  9 19:05 test1-start-commit.log
$ cat /tmp/test1-start-commit.log
2008-04-09 19:05:46 381595000  ------------------------------
repository[/home/svn/test1]
user[snbhsmt]
uid=***(apache) gid=***(apache) groups=********** context=user_u:system_r:httpd_sys_script_t
0022
LANG[]
PWD=/
SHLVL=1
_=/bin/env
$ cat /tmp/test1-pre-commit.log
2008-04-09 19:05:46 487601000  ------------------------------
repository[/home/svn/test1]
transaction[11-1]
$ cat /tmp/test1-post-commit.log
2008-04-09 19:05:46 532045000  ------------------------------
repository[/home/svn/test1]
revision[12]

Subversive をインストール

Subversive は Eclipse で Subversion を利用するためのプラグイン。 同じ目的のものに Subclipse があるけど、Subversive は Eclipse のプロジェクトの 傘下に入ったようなので将来 Eclipse で Subversion するための標準プラグインに なるのかなと思い Subversive の方を選択した。

Subversive のサイトの Download ページにある Eclipse Update Site の下にある URL で、 Eclipse の更新マネージャによるインストールが可能なので、 この方法でインストールする。

  1. Eclipse を起動。
  2. [ヘルプ] - [ソフトウェア更新] - [検索およびインストール] を選択。
  3. [インストールする新規フューチャーを検索] を選択。
  4. [新規リモート・サイト] ボタンを押す。
  5. 名前に "Subversive" 、 URL に "http://www.polarion.org/projects/subversive/download/1.1/update-site/" を入力して OK ボタンを押す。
  6. 検索に含めるサイトで Subversive をチェックして終了ボタンを押す。
  7. SVN Team Provider, JDT Ignore Extensions, SVNKit を選択してインストール。

Top

HOME

Author:snbhsmt
Google Profiles

http://www.ksky.ne.jp/~snbhsmt/

全ての記事を表示する

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。