SCM(ソフトウェア構成管理)との統合

以下の内容は古くなっています。新規に書き直しましたので、SCM(ソフトウェア構成管理)システムとの統合を参照してください。

SCM(ソフトウェア構成管理)とは

ソフトウェアに対して行われる変更に伴う個々のソースコードの修正履歴やリビジョン管理、 アプリケーション全体のバージョンの管理を支援するシステムです。CVS、SubversionやClear Caseなどが有名です。

MantisとSCMの統合とは

通常、バグが発生すると「問題処理票」なるものが発行され、一次分析などを行ってソースコードを修正し、単体試験を行って機能を確認後、 「問題処理票」に修正内容、原因等を記述して、終了となります。この「問題処理票」をManrisに置きかえることで、 情報の共有化や集計といった管理稼動を削減できるわけです。

この「問題処理票」には修正したソース、リビジョンおよび差分を記述するプロジェクトも多いと思います。 Mantisを用いた場合、コメントに記述することになると思いますが、それも面倒で余計な稼動です。 それを調べて登録している間にもバグが登録されていきます。

ここで、MantisとSCM(CVS、Subversion)を統合というか連携すると、コミットする際のログに改善要求のIDを記述しておけば、 自動的に該当の改善要求にコメントが登録されます。 そのときに、ステータスを解決済に変更することもできます。ソースファイル名やリビジョンがあれば、ViewCVSなどを使って、 簡単に差分を把握することができます。

環境

使用する環境は以下の通りです。

サーバ
今回は、Subversionを使用しました。
  • Gentoo Linux Kernel 2.6.10-gentoo-r6
  • Apache 2.0.52-r1
  • php 4.3.10 (PHPのCLI)
  • mod_php 4.3.10
  • Mantis 0.19.2
  • subversion 1.1.1-r3
また、ディレクトリ構成は以下の通りです。
  • subversionのリポジトリ /home/svn/repos
  • Mantis /var/www/localhost/htdocs/bts
クライアント
  • Windows XP SP1
  • Eclipse 3.01
  • subclipse 0.9.27

改善要求に登録する情報は、svnlookコマンドを使用しますので、mantisとSubversionのサーバは同一サーバである必要があります。

SubversionとMantisの設定はすでに完了しているものとします。

仕組み

基本的な流れは以下の通りです。

  1. コミットする際に、ログに「 issue #0000004 」という形式で改善要求のIDを登録します。
  2. Subvesionのフックであるpost-commitが起動します。
  3. post-commitは、svnlookコマンドを起動し、登録したい情報をmantisのcore/checkin.phpの標準入力に渡します。
  4. core/checkin.phpは、標準入力から取得した文字列に「 issue #0000004」が含まれていれば、 そのIDをもつ改善要求のコメントにその文字列を登録し、履歴に登録します。

core/checkin.phpは、登録ユーザや「 issue #0000004 」といったキーとなる文字列などの設定情報は、config_inc.phpから取得します。

設定

設定の流れは以下の通りです。

  1. アカウントの登録
  2. Mantisの設定ファイルへの追加
  3. subversionのフックpost-commitの修正

アカウントの登録

専用のアカウントをMantisに作成します。ここでは、svnuserとします。アカウントは開発者以上にします。

Mantisの設定ファイルへの追加

config_default.incにある設定項目をconfig_inc.phpにコピーして、修正します。 ここで設定する値は以下の通りとします。詳細は、ソース管理との統合を参照してください。

パラメータ詳細
$g_source_control_account svnuser Mantisに登録する際のアカウントです。
$g_source_control_notes_view_status VS_PRIVATE 登録したコメントは非公開とします。
$g_source_control_set_status_to OFF 解決済にしたい場合は、RESOLVEDにします。
$g_source_control_regexp /\bissue [#]{0,1}(\d+)\b/i 改善要求のIDを指定する文字列の正規表現です。

config_inc.phpへの追加例です。

        # For open source projects it is expected that the notes be public, however,
        # for non-open source it will probably be VS_PRIVATE.
        $g_source_control_notes_view_status = VS_PRIVATE;

        # Account to be used by the source control script.  The account must be enabled
        # and must have the appropriate access level to add notes to all issues even
        # private ones (DEVELOPER access recommended).
        $g_source_control_account           = 'svnuser';

        # If set to a status, then after a checkin, the issue status is set to the
        # specified status, otherwise if set to OFF, the issue status is not affected.
        $g_source_control_set_status_to     = OFF;

        # Regular expression used to detect issue ids within checkin comments.
        # see preg_match_all() documentation at
        # http://www.php.net/manual/en/function.preg-match-all.php
        $g_source_control_regexp = "/\bissue [#]{0,1}(\d+)\b/i";
          

subversionのフックpost-commitの修正

subversionでは、レポジトリ(/home/sv/repos)のhooksに、コミットする前に起動したり、 コミットした後に起動するスクリプトが用意されています。 今回は、コミットした後にMantisに登録するので、post-commit.tmplを使用します。

また、mantisに登録する情報を標準出力に出力するシェルかコマンドを用意します。 ここでは、簡単に、コミットしたときのログを登録することにしますので、svnlook infoを使用します。

  1. post-commit.tmplをpost-commitに変更し、実行権限を付与します。
  2. post-commitは以下の通りとします。
        #!/bin/sh
        REPOS="$1"
        REV="$2"
    
        env LANG=ja_JP.eucJP svnlook info "$REPOS" -r "$REV" \
            | /usr/bin/php /var/www/localhost/htdocs/bts/core/checkin.php
                  

svnlookが文字化けしたため、LANGを設定しています。

必ず、core/checkin.phpに渡す情報には、 $g_source_control_regexpで指定した正規表現に適合する文字列が必要です。

上記のsvnlook infoのかわりに以下のようなスクリプトを使用すれば、 変更履歴、変更ファイルおよび変更点を登録できます。(未確認)

    #!/bin/sh

    PATH=$PATH:/usr/bin

    REPOS=$1
    REV=$2

    echo "[変更履歴]"
    svnlook info -r $REV $REPOS

    echo "[変更ファイル]"
    svnlook changed -r $REV $REPOS

    echo "[変更点]"
    svnlook diff -r $REV $REPOS
          

実行例

Eclipse上のsubclipseでコミット

コミット

改善要求のコメント

mantisのコメント

改善要求の履歴

mantisの履歴