Trac-GitHub連携プラグインを使ってみる


チームで以前からTracを利用してます。Tracに色々なプラグインを入れて便利に使っているのですが、ソース管理をGitに移行した後、TracのBrowse Sourceが遅いといった問題にあったり、GitHubのpull requestを利用したコードレビューっていいよね、と言ったGitHubの良さを見てきて、部分的にGitHubに移行できないか調査しました。
探してみると、なんとtrac-githubプラグインというTracとGitHubを連携するプラグインを見つけました。ところがこのプラグイン、ちょっと癖のあるプラグインのため、環境構築等をまとめました。[djangoプロジェクトのTrac](https://code.djangoproject.com/)で使われているので、実績はあるといえるでしょう。

## リポジトリ
https://github.com/aaugustin/trac-github

## このプラグインでできること

- GitHubに作成したリポジトリにpushすると、Tracのチケットとコミットを紐付けられる
- チケットに紐付いたコミットのリンクをクリックすると、GitHubの該当コミットにジャンプする

と言ったことを実現します。

### 動作の流れ

1. ユーザーがGitHubにpushする
1. GitHubはPushされた内容をWebHookを使ってTracに通知する
1. Tracは通知を受け取り、GitHubから変更分をupdateする
1. 変更分をupdateで受け取った時、CommitHookを起動してチケットにコミットを紐付ける

という流れです。結構シンプルでしょ？

## 環境構築
### システム要件

- Trac 0.12以上
- TracGitPlugin(Trac 1.0.0以降であれば同梱されています。)

### プラグインのインストール

プラグインのインストールには大きく分けて2つやり方があります。

#### eggを作成し、インストール

```shell
$ 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を使う

```shell
$ sudo pip install trac-github
```

### リポジトリの準備
GitHubからTracと連携させたいリポジトリを予めmirrorしておきます。

```shell
$ git clone --mirror git://github.com/<user>/<project>.git
```

このリポジトリはTracから操作されます。Tracから操作できるように、下記のようにTracの実行ユーザーに所有者を変えておきましょう。

```shell
$ chown -R www-data:www-data <project>.git
```

### プラグインの設定
#### trac.iniの修正
##### [components]
重要なことですが、このプラグイン、標準のChangesetModule等と競合します。そのため、このプラグインを有効にするには、下記のようにtrac.iniの[components]を記述します。

```trac.ini
[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

```trac.ini
[github]
repository = <user>/<project>
```

Trac側が変更を受け取るブランチを指定したい場合は下記のように指定しましょう。

```trac.ini
[github]
repository = <user>/<project>
branches = master stable/*
```

##### [trac]

通常の単一リポジトリと同様、[trac]にリポジトリのパスを記述します。

```trac.ini
[trac]
repository_dir = /home/trac/<project>.git
repository_type = git
```

#### マルチリポジトリの場合

##### [github]

[github]では同様にリポジトリの設定を行います。下記のようにGitHub上のリポジトリを指定しましょう。

```trac.ini
[github]
repository = <user>/<project>
<reponame>.repository = <user>/<project>
<reponame>.branches = master stable/*

```

##### [repositories]

こちらもマルチリポジトリと同様、[repositories]にリポジトリのパスを記述します。

```trac.ini
[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の連携の設定は終わり。お疲れ様でした！