Hatena::ブログ(Diary)

じゅんいち☆かとうの技術日誌 このページをアンテナに追加 RSSフィード Twitter


はてなブログに引っ越しました。

2011-12-08

[] JIRAで謎い黒魔術!!!

http://atnd.org/events/22899

[twitter:@yusukey]に絡まれたので、しょうがなく我が家秘伝のJIRA黒魔術をざっくり公開します。。。

JIRAはワークフローを柔軟に扱えることが一つの魅力です。

たとえば、ストーリチケットを作成するときに、ストーリポイントは必須だよね。ストーリチケットだからね。でも、ストーリポイントを必須項目にするとストーリポイントが決まっていない状況では起票できないし、必須でなくしてしまうと未入力のままの可能性がある。

思いついたときに起票して、ストーリポイントも入力漏れを防ぐにはどうしたらよいか。

ワークフローをいじる

簡単です。チケットが開始状態になるまでは未入力だけど、開始するときには必須ってワークフローを書けばいいのです。

ワークフローを超ざっくり説明すると、、、ワークフローには、オープン、開始、処理中、解決、クローズとかの"状態"があります。それと各状態から状態に移動するための"遷移"と概念があります。この時点でだいぶ難しいw 絵にしてみた。こんな感じ。

f:id:j5ik2o:20111208191312p:image

その"遷移"を可能にする"条件"や遷移時に"検証"を行うことができます。"条件"はその名の通りその条件が有効でない時は、その先の状態に遷移できません。"検証"はその先の状態に遷移する際に呼び出され、検証に失敗した場合は警告表示と次の状態に遷移しません。

Script Runnerプラグインを使う

今回は、チケット作成直後の状態(オープン)から開始状態に遷移するStart Progressという"遷移"の"検証"に独自の条件を追加するのがよいです。

このような拡張を追加する際にはJIRAのプラグインを自作するというのもあるのですが、今回はもっと手軽にワークフローを制御できるScript Runnerを紹介します。

いきなりコードから説明。

ストーリチケットはIDが7番です。*1

ストーリポイントってカスタムフィールドなんでそれもカスタムフィールドの編集画面からパラメータを取得して、フィールドを取得します。フィールドのオブジェクトまでとれれば値の取得は簡単です。このルールの場合は、null以外と0以上を両方をチェックしています*2。"条件"も"検証"も戻り値としてはbooleanを返すだけでよいです。

import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.issue.fields.CustomField

CustomFieldManager customFieldManager = ComponentManager.getInstance().getCustomFieldManager()           
if (issue.getIssueTypeObject().getId() == "7"){
  CustomField customField = customFieldManager.getCustomFieldObject(10003)
  BigDecimal sp = customField.getValue(issue)
  return (sp != null && sp.floatValue() > 0)
}
true

また、ストーリチケット以外でかつサブタスクがないチケットは、開始する前に初期見積を必ず入れておきたい場合は以下のようなバリデータを書きます。意外と簡単に掛けてしまいます。これで初期見積も入力漏れのまま開始されることはないわけです。

if (issue.getIssueTypeObject().getId() != "7" && issue.getSubTaskObjects().size() == 0){
  Long orgEst = issue.getOriginalEstimate() 
  return (orgEst != null && orgEst.intValue() > 0)
}
true

JIRAでデバッグできる

どうやってデバッグするの?Eclipseとか用意するの?って疑問あると思うんですが、以下のような画面を辿っていくとConditionTesterという画面があるのでそこでチケットIDとGroovyスクリプトと入力してテストすることができます。

f:id:j5ik2o:20111208054619p:image:w360

f:id:j5ik2o:20111208054618p:image:w360

f:id:j5ik2o:20111208054617p:image:w360

f:id:j5ik2o:20111208055356p:image:w360

スクリプトをワークフローに追加する

テストが完了したスクリプトはワークフローの編集画面で"条件"もしくは"検証"に追加することができます。登録の際にエラーメッセージを登録できます。

f:id:j5ik2o:20111208054859p:image:w360

動作確認してみる

試しにストーリポイントが未入力なチケットを開始状態にしてみる。

なんということでしょう。ストーリポイントが未入力または0の場合はバリデーションエラーが起きました。思った通りのバリデータを書けるではありませんか。これでいろいろ幸せでになります はぁと!

f:id:j5ik2o:20111208083855p:image:w360

その他のワークフロー関係のおすすめ設定

インストールしたデフォルトだと次のような状態になっています。

  • 一つ目はサブタスクが解決になっていないのに親タスクを閉じれてしまう
  • 二つ目は課題リンクでブロックされるチケットがあるのに閉じれてしまう

最初のサブタスクの方は、In ProgressなどからResolvedに遷移するResolve Issueの条件に追加すれば、サブタスクが解決しないと親タスクも解決できないにようになります。これは簡単ですね。

f:id:j5ik2o:20111208062036p:image:w360

二つ目のブロックされる課題リンクがあるはちょっと複雑です。

JIRA Workflow Toolboxを手動でインストール。atlassian-jira/WEB-INF/lib にこのプラグインJARファイルをインストールするタイプのものです。

これもResolve Issueの条件に追加すればよいです。

f:id:j5ik2o:20111208083417p:image:w360

条件はこんな感じ。ブロックする課題が解決もしくはクローズになっていないとチケットが解決にできないように設定します。

f:id:j5ik2o:20111208083158p:image:w360

f:id:j5ik2o:20111208061333p:image:w360

明日は[twitter:@tsuyoshikawa]です!

*1:番号は課題タイプの編集画面パラメータを見れば確認できます

*2http://docs.atlassian.com/jira/ このあたりにJavadocがあるので見てみてください