自分の勤務先ではアジャイルプロセスを強制するために、
Subversionのコミット時にRedmineのチケット番号入力を機械的に強制しています。
※前記事参照
イテレーションに対するソースの変更が分かるので保守がやりやすいのですが、
バグに対するをチケットを起こさずにこっそりコミットする不届き者が出だしました。
明らかに怪しい奴はログを見れば分かるのですが、50人も人がいると全てのログは追えません。
Redmineをいじって入力されたチケット番号を機械的に検査することにしました。
Redmineのバージョンは1.0.2です。
ステータスチェックAPI追加
app/controllers/issues_controller.rbを修正まずはログインをパスする記述をbefore_filterの上辺りに追加
skip_before_filter :check_if_login_required, :only => [:confirm_repository_path, :get_ticket_status]
ちなみにconfirm_repository_pathは@yusuke_kokuboさん作のAPIです。
パラメータからチケットを1件取得するフィルターに、新しいAPIを追記
# before_filter :find_issue, :only => [:show, :edit, :update]
before_filter :find_issue, :only => [:show, :edit, :update, :get_ticket_status]
authをすっ飛ばすように、フィルターに新しいAPIを追記
# before_filter :authorize, :except => [:index]
before_filter :authorize, :except => [:index, :confirm_repository_path, :get_ticket_status]
privateの上辺りに、新しいメソッドを追加
def get_ticket_status
if @issue.fixed_version && @issue.fixed_version.closed?
result = 1
elsif @issue.status && @issue.status.is_closed?
result = 2
else
result = 0
end
render :text => result
end
本来は3項演算子使ったりパイプしたりしてシンプルに書くべきだけど、うまくいかなくてデバッグ時に分かりやすく書いたそのまま(汗)。
追加したAPIのrouteマッピングを設定
config/routes.rbに追記多分どこでもいいけど、自分は20行目に追加しました。
map.connect 'issues/:id/get_ticket_status', :controller => 'issues', :action => 'get_ticket_status'
SVNのフック用スクリプトを変更
VBSです。その内JSかPowerShellに変えたい。
url = "http://さぁばぁ/redmine/issues/" & issues_id & "/get_ticket_status/"
http.open "GET", url, False
http.send
result = http.responseText
Set http = Nothing
'--- debug ---
'WScript.StdErr.WriteLine("HTTP Result:" + result)
If result <> "1" Then
WScript.StdErr.WriteLine("チケット番号" + issues_id + "はすでにcloseされたバージョンで登録されています。")
WScript.StdErr.WriteLine("このエラーはもっての他。。。")
WScript.Quit(1)
End If
If result <> "2" Then
WScript.StdErr.WriteLine("チケット番号" + issues_id + "はすでに終了しています。")
WScript.StdErr.WriteLine("バグこっそり直すの禁止ね。バグのチケットを起こすべし")
WScript.Quit(1)
End If
これでアジャイルをもっと、そして自然に意識してくれるはず。