GitHub でチケット駆動開発とプルリクエスト駆動開発を併用する

私の所属するチームでは Redmine + TiDD(チケット駆動開発) から GitHub の Pull Request を使った開発フロー(プルリクエスト駆動開発)に移行してしばらく経ちます。

プルリクエスト駆動開発は、TiDD による開発に比べ

  • コードレビューがやりやすいこと
  • Travis CI や Coveralls のような GitHub を利用したエコシステムが利用しやすいこと

が大変気に入っています。

しかし、プルリクエスト駆動開発は TiDD と比べて不満な点が一点だけありました。
それは「コミットログに "refs #123" のようにチケット番号をつけるルールを行いづらい」という点です。

このルールを守る理由は、コミット→ チケットへの逆引きをしやすくするためです。
こうすることで blame の画面 → コミットの画面 → チケット(Issue) の画面にブラウザ操作だけで遷移することができ、その行の変更意図を詳細に知ることができます。

しかし GitHub では、Issue 番号を発行するためには Pull Request を作る必要があり、Pull Request を作るためにはコミットを作る必要がありますが、コミットをする際には予め Issue 番号を知らなければならないため、 Issue 番号付きでのコミットができません。
そのため、しばらくは

  1. チケット番号を発行するための Issue をまずは発行する
  2. そのチケット番号をコミットログに含めてコミットする
  3. その番号とは別に Pull Request を発行する

といった運用をしていました。
一つのトピックに対して、Issue 番号と Pull Request 番号の2つができてしまうため、あまりイケていませんでした。

ところが最近、Issue を Pull Request に変更する方法があることを知って、ここらへんのイケてなさがスッキリしたので方法を紹介したいと思います。

具体的な手順

  1. まずは Issue を作成します。 No Ticket, No Commit です。
  2. ローカルでトピックブランチを作成します。Issue 番号が #123 なら git checkout -b id/123 とするのが良いでしょう。
  3. コミットをする際にコミットログに Issue 番号を付与します。bleis-hook を利用すると楽です。
  4. トピックブランチが完成したら、リモートブランチとしてプッシュします。 git push origin id/123:id/123 とかです。
  5. ここで Issue #123 を Pull Request に変更します。codefirst/AsakusaSatellite に対して mallowlabs ユーザで行う時は以下のコマンドです。
curl --user "mallowlabs" \
     --request POST \
     --data '{"issue": "123", "head": "id/123", "base": "master"}' \
     https://api.github.com/repos/codefirst/AsakusaSatellite/pulls

自分のリポジトリに fork している場合は、以下のようにします。

curl --user "mallowlabs" \
     --request POST \
     --data '{"issue":"123", "head":"mallowlabs:id/123", "base":"master"}' \
     https://api.github.com/repos/codefirst/AsakusaSatellite/pulls

コマンドが成功すれば、Issue は Pull Request に変更され、Travis CI が設定されている場合にはこのタイミングで実行されます。

このような手順をすることで、Issue 番号は一つで済み、またその Issue に紐づくコミットのコミットログにはすべて Issue 番号が含まれるため、あとからコミット → Issue の逆引きが簡単にできるようになります。

言い訳コーナー

  • 「チケット番号を書かなくてもコミットログに全てを詳細に書けばいいのでは?」 → コミットログと違ってチケットは追記ができる点が好きです。
  • TiDD = コミットログにチケット番号を入れること ではないよね?」 → その通りです。プルリクエスト駆動開発は TiDD を行うメリットの大部分を受けられますが、TiDD のベストプラクティスの中でもコミットログにチケット番号を入れることで得られるメリットが気に入っていたため、今回の記事になりました。
  • 「こんなことしなくてもコミット → Issue の逆引き簡単にできるよ」→ 教えてください!

まとめ

GitHub 最高ですね。