Category Archives: Shell

git-flowとgit-issueを使ったTiDD環境について | Technology-Gymにて、
git-flowgit-issueを組み合わせた使い方を紹介しましたが、チケットを切るときに手動でチケット番号を入力するのがとても面倒でした。

今回は、それをpercolというパイプで渡したものをanything的な絞り込み/選択できるCLIツールを使って楽にできるようにしました。
percolについては下記を参照して下さい。

percol は入力の1行を1候補として,部分一致かつ AND 検索で絞り込みし,選択した候補を出力するコマンドです.端的に言えば Emacs の anything.el のコマンド版です.
anything 的な絞りこみコマンド percol の紹介 – 備忘録

書いてみたコマンドは以下のようなものです。
動作確認はzsh 4.3.11とgit-issueはredmineのみしか確認してないです。
(多分Gtihub向けは少しいじる必要があると思います。)

  • git-issue listからチケットを選んでgit flowのfeatureブランチを作る
  • git-issue listからチケットを選んでチケットを終了&100%
  • git-issue listからチケットを選んで詳細情報の表示

上記のような関数をzshの設定に定義して、bindkeyで適当にCtr+B -> Ctrl+F/U/I な感じのショートカットを設定して利用してます。
git-issue v0.8.4からANSI Colorがデフォルトで付くようになったので、percolに渡す部分では–no-colorオプションを適応しています。

言葉だと少し分かりにくいので、codestre.amを使って録画したものを載せておきます。

codestre.amの幅の問題で表示が若干崩れてますが、横幅を十分に持てば崩れないので大抵は大丈夫だと思います。
動画では上記のスクリプトを使ってgit-flowでチケットを切って処理する感じのデモをやってます。

percolを使えば、redmineのチケット番号を手動で入力することなく利用できるようになったのでかなり効率よくなったと思います。

Redmineを使ったTiDD(チケット駆動開発)と バージョン管理システムのGitを組み合わせて、どうやって開発していくのが上手い流れを作れるのかということを考えてみました。

まずはTiDDとは何か

気になるところを取り出すと

  • コードに触る前にチケットを切る
    • Ticket First
  • タスクチケットは細分化して、放置されるようなタスクのサイズにしない
    • チケットで親子関係を作ってまとめるといい
    • 親チケット = ストーリーカード
    • 子チケット = タスクカード
  • コードとチケットを関係付ける(コミットコメントにチケット番号の付加など)
    • No Ticket, No Commit

katsumic.info – WorkNote » TiDD(チケット駆動開発)でいこう と大体同じです。

次はGitとチケットについて

元々、RedmineのチケットとGitをどう連携させるのがいいのだろう? というところからTiDDを知ったため、
チケットとコミットをどう関係付けるかと言う所に焦点がありました。

そこで、調べた所RedmineとGitを連携させるスクリプトなどはいくつかあって

などがあって、この辺のものを実際に試していてどうやるのがいいのかと大まかな流れを考えると以下のようになった。
(コミットの所にテストやレビューなどが入ると思いますが)

チケットワークフローA

(id/チケット番号 という用にid/と付けるのは、そうしないと認識しない拡張コマンドがあるため)

  1. チケット番号でGitのブランチを切る
    $ git branch id/TICKET_ID
  2. ブランチ内でチケットのタスク(コミット)をする
    Git-Redmineを使えば、Redmine上のステータスもcommitと一緒に変更できる
    $ git redmine commit TICKET_ID
  3. タスクが完了したら、メインのブランチ(ここではmasterとする)にマージする
    $ git checkout master && git merge –no-ff id/TICKET_ID && git branch -D id/TICKET_ID

細かい単位(チケット)でブランチを切って、コミットして、
終わったらmasterにマージするという流れはA successful Git branching modelとよく似ていることがわかると思います。

A successful Git branching modelがどういうものかは以下の記事がとても良くできているので、説明は省きます。

簡単に説明するならば

  • 常にリリース可能なブランチを持っておく(master)
  • 代わりに開発の主体になるブランチを持つ(devlop)
  • 機能開発やホットフィックス(チケットがまさにそれっぽい)などは、それぞれブランチを切って開発する
  • ブランチのマージは–no-ffフラグを使い、どのブランチで開発してたのかを履歴に残す

ものすごくブランチを切りまくるワークフローなわけですが、GitはSVNとは違い、
ブランチを作成するときにコピーではなくラベルを付けるだけなので、ブランチの作成やマージが高速です。
この辺の話についてはモデルから知るGitを読むと各コマンドの動きがわかりやすいです。

そのため、先ほどのワークフローとGitは相性がよいのと、A successful Git branching modelを補助するためのgit-flowという拡張コマンドが存在するためこの流れを取り入れやすいです。

git-flowはHomebrewなどで簡単にインストールすることができます

$ brew install git-flow

インストールするとgit flowというコマンドが使えるようになりますが、補完がないとちょっと面倒なのでgit-flow-completionを使えば、bash, zshでコマンドの補完ができるようになります。
oh-my-zshの場合は元からgit-flow-completionプラグインが含まれているので、

plugins=(git brew gem git-flow)

という感じで、git-flow-completionをインストールしなくてもプラグイン指定するだけで動作します。(git flowコマンド自体は必要)

git-flowの使い方やコマンドの意味はGetting Started – Git-Flow « Some thoughts, ideas and fun!!!がとてもわかりやすいですが、
開発するときにstartして、開発し終わったらfinishするという感じで、動作自体はそこまで複雑ではないと思います。

実際に先ほどのチケットワークフローAにgit-flowを適応してみる。
(途中からgit-flowを導入しています。またgit:(master)の括弧内が今いるブランチを示しています。)

という感じで、git-flowを適応できました。

最初はnode.jsでこのワークフローを作るようなCLIツールを書こうとしていましたが、既存のツールを組み合わせて十分使える感じになりました。

あくまで、TiDDとGitでの開発を組み合わせた一つの例ですが、これからも模索していく必要がありそうです。

今まではBashを使用していましたが、以前から話に聞いていたzshを導入してみました。
zshは初めてだったので、最初から簡単に使えるように設定などをしてくれるoh-my-zshを入れて使用しています。

oh-my-zshのインストールはshスクリプトを実行するだけでできるので導入も手軽です。手動でやる場合は、上記のサイトを見てやるのがいいでしょう (ログインシェルも勝手に変更されるそうなので、そういうのが気持ち悪い方は手動でやるほうがいい)

[cc lang="bash"]wget –no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O – | sh[/cc]

インストールして、ターミナルを再起動するかsourceで設定ファイルを読み込むことで適応されます。

[cc lang="bash"]~ source .zshrc [/cc]

このままでも結構便利になりますが、oh-my-zsh を使って zsh の便利な設定をまとめて取り入れる – ess supで書かれているように、テーマやプラグインの設定をすることができます。

テーマはデフォルトのままでも使いやすかったのでそのままにして、プラグインを幾つか読み込むようにしました。
プラグインといっても、補完候補が増えたりエイリアスがついたりするぐらいです。
プラグインの設定は.zshrcを開いて、pluginsと書いてある場所にスペース区切りで読み込むものを指定するだけです。

[cc lang="bash"]plugins=(git brew autojump)[/cc]

gitプラグインはgitコマンドの補完で、brewプラグインはHomebrewの設定や補完で、autojumpプラグインはautojumpというコマンドラインユーティリティの設定をするプラグインです。
oh-my-zshで用意されてるプラグインはPlugins – GitHubに書かれています。

他のzshについての設定は~/.oh-my-zsh/customディレクトリにzshファイルを作れば自動的に読み込んでくれるので、エイリアスを書いたファイルとかパス設定をするファイルなどを分けて置けるので便利です。

たったこれだけの設定でも、gitのブランチがプロンプトに表示されたり、gitコマンドのオプション補完もできるので使いやすくなります。

201108132100.jpg

oh-my-zshから入って簡単にzshの良さを知ってから、zshを本格的に触っていくのも良いのではないでしょうか。