チームで以前からTracを利用してます。Tracに色々なプラグインを入れて便利に使っているのですが、ソース管理をGitに移行した後、TracのBrowse Sourceが遅いといった問題にあったり、GitHubのpull requestを利用したコードレビューっていいよね、と言ったGitHubの良さを見てきて、部分的にGitHubに移行できないか調査しました。
探してみると、なんとtrac-githubプラグインというTracとGitHubを連携するプラグインを見つけました。ところがこのプラグイン、ちょっと癖のあるプラグインのため、環境構築等をまとめました。djangoプロジェクトのTracで使われているので、実績はあるといえるでしょう。
リポジトリ
このプラグインでできること
- GitHubに作成したリポジトリにpushすると、Tracのチケットとコミットを紐付けられる
- チケットに紐付いたコミットのリンクをクリックすると、GitHubの該当コミットにジャンプする
と言ったことを実現します。
動作の流れ
- ユーザーがGitHubにpushする
- GitHubはPushされた内容をWebHookを使ってTracに通知する
- Tracは通知を受け取り、GitHubから変更分をupdateする
- 変更分をupdateで受け取った時、CommitHookを起動してチケットにコミットを紐付ける
という流れです。結構シンプルでしょ?
環境構築
システム要件
- Trac 0.12以上
- TracGitPlugin(Trac 1.0.0以降であれば同梱されています。)
プラグインのインストール
プラグインのインストールには大きく分けて2つやり方があります。
eggを作成し、インストール
$ git clone https://github.com/aaugustin/trac-github.git
$ python setup.py bdist_egg
すると、dist/以下にtrac_github-XXX-pyYYY.egg
というファイルが出来上がります。(XXXはプラグインのバージョン、YYYはPythonのバージョンです。)これを$TRAC_PROJECT/pluginsの下にコピーしてください。
どうでもいいんですが、Pythonのバージョンごとにegg作らないといけないの、なんとかならないでしょうか…。Javaって後方互換性は担保されているので、そういうところは悪くないですよね。
pythonのライブラリとしてインストール
pipを使ってインストールできますが、システムのパスになるため、あまりオススメできないです。
pipを使う
$ sudo pip install trac-github
リポジトリの準備
GitHubからTracと連携させたいリポジトリを予めmirrorしておきます。
$ git clone --mirror git://github.com/<user>/<project>.git
このリポジトリはTracから操作されます。Tracから操作できるように、下記のようにTracの実行ユーザーに所有者を変えておきましょう。
$ chown -R www-data:www-data <project>.git
プラグインの設定
trac.iniの修正
[components]
重要なことですが、このプラグイン、標準のChangesetModule等と競合します。そのため、このプラグインを有効にするには、下記のようにtrac.iniの[components]を記述します。
[components]
trac.versioncontrol.web_ui.browser.BrowserModule = disabled
trac.versioncontrol.web_ui.changeset.ChangesetModule = disabled
trac.versioncontrol.web_ui.log.LogModule = disabled
tracext.github.* = enabled
tracopt.ticket.commit_updater.* = enabled
tracopt.versioncontrol.git.* = enabled
え?BrowserModuleを無効にしないといけないの?と思ったそこのあなた。実はBrowserModuleは併用可能です。ただ、チケットからSubversionのリポジトリにリンクを貼っていた場合、それは無効になってしまうので、注意が必要です。
インストールができると/github
というエンドポイントが作成され、アクセスすると下記のように表示されます。
Endpoint is ready to accept GitHub notifications.
Tracで管理したいリポジトリが単一か、複数かでtrac.iniの設定が異なります。それぞれについて書いていきます。
単一リポジトリの場合
[github]
[github]では、GitHubのリポジトリの設定を行います。下記のようにGitHub上のリポジトリを指定すればOK
[github]
repository = <user>/<project>
Trac側が変更を受け取るブランチを指定したい場合は下記のように指定しましょう。
[github]
repository = <user>/<project>
branches = master stable/*
[trac]
通常の単一リポジトリと同様、[trac]にリポジトリのパスを記述します。
[trac]
repository_dir = /home/trac/<project>.git
repository_type = git
マルチリポジトリの場合
[github]
[github]では同様にリポジトリの設定を行います。下記のようにGitHub上のリポジトリを指定しましょう。
[github]
repository = <user>/<project>
<reponame>.repository = <user>/<project>
<reponame>.branches = master stable/*
[repositories]
こちらもマルチリポジトリと同様、[repositories]にリポジトリのパスを記述します。
[repositories]
<reponame>.dir = /home/trac/<project>.git
<reponame>.type = git
<reponame>.description = description
.alias = default
default.dir = /home/trac/<default>
default.type = svn
こんな感じでSubversionのリポジトリも参照可能です。
GitHubのリポジトリにWebHookを追加
GitHubにpushした時に、Tracの更新ができるよう、WebHookを追加します。WebHookのエンドポイントは、追加された/github
です。マルチリポジトリの時は、リポジトリ名を含めてください。/github/<reponame>
という感じですね!
ということで、これでTracとGitHubの連携の設定は終わり。お疲れ様でした!