以前書いた、TiDDとgit-flowを合わせた開発手法について | Technology-GymのRedmineとgit-flowを使ったチケットドリブンな開発手法は相変わらず続けていますが、少し使ってるツールが変わりました。

まずはgit-flow自体はそのまま使い続けています。
後述しますが、git-flowのhooksが正式に実装されれば、TiDDな開発はもっとスムーズに進むような気がします。

コマンドラインからredmineを操作するツールを以前は複数使っていましたが、
現在はgit-issueに統一してあります。

この記事で使用してるバージョンはgit-issue 0.8.0です

git-issueはチケットの作成(git issue add)、gitチケットのアップデート(git issue update <ticket_number>)やチケット一覧の表示(git issue list)等、
一通りredmineのチケット操作はできるので便利です。

自分の場合、上記のあげたチケットの作成、アップデート、一覧表示があれば大体事足りてしまうので、そこに絞って使い方を書いてみます。

まずは、git-issue+Redmineのセットアップ方法について。
Configurationに書いてあるように

$ git config issue.apikey xxx
# 自分は他の用途で使ってないので、$ git config -g で定義してます。
$ git config issue.type redmine
$ git config issue.url http://redmine.example.com/projects/IDENTIFIER/
# issue.urlの末尾は/を含める必要があります

この状態で、git issue listなどを実行してエラーが出なければセットアップは終了です。

チケットの作成

git-issueではコマンドラインからチケットの作成も行えます。
自分の場合チケットの追加だけはWebから行う事も多いですが、かなり小さなチケットを立てるようなときはgit issue addを使ったりします。

単純にgit issue addと入力すると訳わからん状態になるので、自分はzshにチケット作成関数を書いて置いて、
Subjectとdescriptionをインタラクティブに入力するだけで済むようにしています。

NewImage

git issue addはassigned_to_idとproject_idを指定しないとそもそも作成時にエラーになるので、
関数と言ってもgit issue add –assigned_to_id=xx –project_id=yy を自動で入れるような感じものです。

function giAddIssue(){
  # redmineの自分のUserIDを入れる
  MY_REDMINE_ID=XXX
  ISSUE_URL=$(git config issue.url)
  PROJECT_ID=$(echo "$ISSUE_URL" | sed -e "s/^.*\/\(.*\)\/$/\1/")
  git issue add --assigned_to_id=$MY_REDMINE_ID --project_id=$PROJECT_ID
}

MY_REDMINE_ID(–assigned_to_idに渡す)部分は人によって違うので、書き換えるかgit-issueと同じようにgit configに設定値を持たせて読み込むようにすると良い気がします。
project_idはredmineのプロジェクト識別子でもいいみたいなので、issue.urlで設定した値を再利用して設定を増やさなくても済むようにしてます。

何かもっとまともな方法がありそうですが、これで$giAddIssueとやるとチケットの作成が簡単にできます。

NewImage

チケットのアップデート

これが一番よく使うもので、git issue update <チケット番号> でそのチケットを開いてエディタで編集できます。
また、id/<チケット番号> が含まれるgitブランチにいる場合なら、チケット番号を省略できてgit issue updateだけでよくなります。
自分はgit-flowでブランチを作成してるので、git flow feature start id/<チケット番号> という感じでfeature/id/<チケット番号>というブランチを作って作業します。
(git issueにもbranchを作る機能などがありますが、使い方がよくわからないので使ってない)

この省略が結構便利で、ブランチで作業が終わってチケットを終了だけ(コメントなどを付けないで)したいときは
git isssue update –status=5とやるだけでチケットを終了できます。

チケット一覧の表示(git issue list)はそのままなのですが、終了したチケットの表示とかgit log –pretty=format:みたいのができると便利そう。

まとめ

大まかにやってることをまとめてみると

$ giAddIssue
# もしくはWebでチケットを作成
$ git issue list
# チケット番号を確認 xxxとする
$ git flow feature start id/xxx
$ git issue update --status=2
# ステータスを作業中にする(あんまりやらないけど)
…
開発&gitにコミット
…
$ git isssue update --status=5
# もしくはgit isssue updateでnoteを書く
$ git flow feature finish id/xxx
# ブランチをマージ
# 最初に戻る

のような感じです。

おまけ

git-flowのhooksとgit isssueの連携について。
まだ、不完全でちょっと使えてないのですが、

$ git clone --recursive https://github.com/petervanderdoes/gitflow.git
$ cd gitflow
$ git checkout origin/feature/implement-hooks
$ make install

という感じで、gitflowにhooksを実装したものをインストールして、先ほどの流れででてきたgit issue update –status=の部分を自動化できないかなとやっていました。

*このスクリプトは不完全なので使わないほうが良い気がします。

git-flow hooksはgitのhooksと同じで、各レポジトリの.git/hooksに入れておけばgit-flowに対応したコマンドにhookしてシェルスクリプトを動作させることができます。
上記のスクリプトは、git flow feature start/finish の後にhookするスクリプト(ファイル名で判断される)です。

git  hookを自動で.git/hooksに移動させる方法がよくわからなかったので、

# git hooks install
function gitHooksInstall(){
  MY_HOOK_DIR="~/.git_flow/hooks"
  DOT_GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
  if [ "$DOT_GIT_DIR" != "" ]; then
    echo "cp -upR $MY_HOOK_DIR $DOT_GIT_DIR"
    cp -pR $MY_HOOK_DIR $DOT_GIT_DIR
  fi
}

自動で入れたりhookスクリプトを~/.git_flow/hooks/ディレクトリにまとめておいて、gitHooksInstallを実行するとコピーするようなものをかいてました。
これで、git flow feature start/finish id/xx をすると自動で、ステータスを進行中/終了にできて、 git isssue update –status=5みたいのを手動で実行しなくて済むと思ったのですが、
上記のスクリプトが何かおかしいのか原因がよくわかってませんが、git isssue updateの挙動がおかしくなって上手く出来ませんでした。

多分、上記のスクリプトがおかしいのだと思いますが解決できませんでしたが、手動でやってもgit-issueはとても便利なのでredmineとgitをあわせて使う人は触ってみると良い気がします。

git flow feature start/finish

Post Navigation