2012/04/07

MercurialとTracを連動させてみた。


先日Mercurialサーバを立ててTracと連動させる機会があったので、
その際のハマりポイントとかをメモしておこうと思います。
環境は Ubuntu10.04 64bit Servea Edition が前提です。

Gitの手順は結構あるのですが、Mercurialはやっぱり情報少なめなんですよね。。



Tracのインストールについては以前にまとめているんでそちらを参照あれ。
Nginx + uwsgi で Trac環境を作った時のメモ

Mercurialリポジトリの作成
基本的にはTracが稼働しているサーバに作成するのがいいでしょう。
そのため、基本的にはすでにTracのインストールが完了していること前提で話を進めます。

Mercurial のインストール
まずはこれがないと始まりません。
Ubuntu10.04の場合は標準のaptでインストールしてしまうと思いの外古いバージョンが入ってしまいトラブルのもととなります。
そのため、PPAで公式から最新のものをインストールできるようにしておく必要があります。

■ laughk@ubuntu
 -----------------------------
## add-apt-repository,ppa-purge コマンドインストール
sudo aptitude install python-software-properties ppa-purge

## Mercurial 公式PPAの追加
sudo add-apt-repository ppa:mercurial-ppa/releases

## 更新 & インストール
sudo aptitude update && sudo aptitude install mercurial

リポジトリ専用ユーザーの作成
Mercurialのインストールが完了したら、今度はリポジトリを管理する専用のユーザーを作っておきましょう。


リポジトリの管理についてはチームメンバーの個人個人のアカウントでアクセスをさせるよりもこのほうが手っ取り早いですし、
パーミッション絡みのトラブルもないのでしょう。

■ laughk@ubuntu
 ----------------------------------
## hg ユーザーの作成
sudo useradd -m -d /home/hg -s /bin/bash -c "Mercurial Access & Manage User" hg

## 必要に応じてパスワードの設定,対話式に2回入力
sudo passwd hg


アクセスの管理
リポジトリ管理用のアカウントを作ったのはいいのですが、この状態だと普通にhgユーザーでログインすることができてしまいます。
そのため、基本的はhgユーザーではMercurialの操作以外ではアクセスさせないようにしておきます。

Gitの場合はアカウント作成の際のデフォルトシェルを "git-shell" にしてしまえばそれでOKなのですが、
Mercurialの場合はSSHの公開鍵認証のみでのアクセスに制限した上で authorized_keys の command 指定許可にしておく必要があります。

■ laughk@ubuntu
  -----------------------------------------
## SSH のパスワード認証が無効になっているか確認 "PasswordAuthentication no"と表示されればOK
grep "PasswordAuthentication" /etc/ssh/sshd_config

## yesだった場合は設定ファイルの編集後、SSHの再起動
sudo vi /etc/ssh/sshd_config
grep "PasswordAuthentication" /etc/ssh/sshd_config
sudo service ssh restart

## hg ユーザーになる
sudo su - hg
 
■ hg@ubuntu
  -----------------------------------------
## authorized_keys をパーミッションに気をつけながら作成
mkdir -m 700 ~/.ssh && touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys

## authorized_keys に公開鍵情報をcommand,no-ptyを指定して追記
vi .ssh/authorized_keys
    ## authorized_keys 追記例 ------------------------------------------------------
    + ## laughk PC ----------------------
    + command="hg-ssh *",no-pty ssh-rsa ...........................
    + 
    + ## User PC   ----------------------
    + command="hg-ssh *",no-pty ssh-rsa ...........................
    + 
    ## ----------------------------------------------------------------------------



authorized_keys のcommandに関する記載については
command="hg-ssh /path/to/repository1 /path/to/repository2 ..."
と鍵に対してアクセスを許可するリポジトリを指定します。
すべてのリポジトリを許可をする場合は"*"で問題ありません。

リポジトリを作成する。
ここまで来ていよいよリポジトリの作成です。
ここは本当に簡単で、単純にリポジトリにしたいディレクトリで宣言をすればいいだけです。

■ hg@ubuntu
  -------------------------------------------
## 念のため HOME に移動
cd ~

## 新規Mercurialリポジトリの作成
hg init repository1

## repository1 ディレクトリが作成ているので確認
ls -ld repository1


これでリポジトリの作成は完了です。この状態でアクセス許可があるユーザーは
■ user@laptop
  -------------------------------------------
hg clone ssh://hg@${MERCURIAL_HOST}/repository1
  ## ${MERCURIAL_HOST} にはサーバのホスト名を指定してください
とすればローカルにクローンすることができます。

WebDav環境を整えればhttps経由でcloneできるようにすることも可能ではありますが
通常に使う分にはSSH経由のアクセスが出来れば問題ないと思うので、特にそのあたりは記載はしません。

Tracとの連携
さて、せっかくTracサーバにMercurialのリポジトリを作成したので、今度は連動させてみましょう。
具体的には
  • リポジトリブラウザからMercurialリポジトリのソースコード等を閲覧できるようにする
  • MercurialリポジトリにPushされた際に、コミットメッセージに "fixes #xx" と記載すると該当のチケットがクローズするようにする
といことをできるようにします。

TracMercurial のインストール
Tracは標準ではSVNリポジトリしか対応していないので、Mercurialのプラグインをインストールします。
Mercurial Plugin for Trac
■ laughk@ubuntu
  ------------------------------------------------
## ソース管理ディレクトリに移動
cd /usr/local/src

## TracMercurial のバージョンにあわせてソースコードを svn checkout する
sudo svn co http://svn.edgewall.com/repos/trac/plugins/0.12/mercurial-plugin

## ソースからインストール
cd mercurial-plugin
sudo python setup.py install

## Trac のpluginディレクトリ配下にシンボリックリンクを貼る
sudo ln -s /path/to/pythonhome/dist-packages/TracMercurial-0.12.0.29dev_r10936-py2.6.egg /path/to/trac_env/plugin/
  ## ubuntu10.04 の場合は
  ##  /usr/local/lib/python2.6/dist-packages/TracMercurial-0.12......
  ## にインストールされるかと思います

## Trac_Envディレクトリに移動
cd /path/to/trac_env

## TracMercurialを有効にする
sudo -u www-data vi conf/trac.ini
    ## trac.ini 編集内容[以下を追記] ----------------------------------
    + [components]
    + tracext.hg.* = enabled
    + tracopt.ticket.commit_updater.* = enabled
    ## ----------------------------------------------------------------

## ApacheでTracを稼働している場合は再起動, Nginx + uWSGIの場合は特に再起動は不要
sudo service apache2 restart
以上でTracMercurialのインストールは完了です。
この状態で既にプッシュされたりコミットされたりしてリポジトリに変更があった場合は自動的に反映されるようになっています。
そのため、hook用のスクリプトを仕込む必要はありません。

Tracにリポジトリを登録
この段階でTracでMecurialリポジトリが読み取れるようになったので、早速登録しましょう。
手順としては、
  • ブラウザでTracへアクセス
  • 管理者アカウントでログイン
  • [管理] -> [バージョンコントロール] -> [リポジトリ] と選択すると以下のような画面になる
  • [リポジトリの追加]からサーバ上のディレクトリのパスを指定して登録
    パスはシンボリックリンクではなく実体を指定すること。でないとコメントのフックでコケる
で登録完了です。

コミットコメントからチケットへのメッセージ追加、クローズが行えるようにする
最後に、Mercurialのコミットメッセージに"close #xx","fixed #xx" とつけた場合は該当のチケットのクローズ、
"refs #xx" とつけた場合は該当チケットへのコメントの付加がされるように設定をします。

リポジトリ側の設定
まずはリポジトリ側、/path/to/repository/.hg/hgrc に設定を追加します。
先ほどの例で作ったrepository1の場合は具体的に以下のようにします。
■ hg@ubuntu
 -------------------------------------
## リポジトリまで移動
cd ~/repository1

## 隠しディレクトリ .hg に移動
cd .hg

## hgrcの編集。ない場合は新規に作成
vi hgrc
  ## hgrc 編集内容 -----------------------------------
  + [hooks]
    ## ここは決め打ち
  + commit = python:tracext.hg.hooks.add_changesets
  + changegroup = python:tracext.hg.hooks.add_changesets
  + 
  + [trac]
    ## ここは環境にあわせて適宜設定
  + env = /path/to/trac_env
  + trac-admin = /path/to/trac-admin
  ## -------------------------------------------------
Trac側の設定
次にTrac側にも設定を追加します。
■ laughk@ubuntu
 --------------------------------------
sudo -u www-data vi /path/to/trac_env/conf/trac.ini
  ## trac.ini 編集内容[追記] ----------------------------
  | [ticket]
  + commit_ticket_update_check_perms = false
  + commit_ticket_update_commands.close = fixed close
  + commit_ticket_update_commands.refs = refs
  + commit_ticket_update_envelope =
  + commit_ticket_update_notify = true
  ## --------------------------------------------------
ApacheでTracを動かしている場合は先ほどと同様に再起動をしてください。

これでTrac + Mercurialの環境設定は完了です。
単純にMercurialのリポジトリを作るのであれば、Bitbucketを使ってしまうのが手っ取り早いですが、
やはりチケット情報とリポジトリ情報で直接連携が取れると便利ですね。

ちなみにこの環境はAWSのmicroインスタンスでも十分満足に稼働できているのでコストもかからずお勧めです。
リポジトリのバックアップにBitbucketを利用すると更にいいかんじだと思います!