この記事は最終更新日から1年以上が経過しています。
backlogには完了日カラムが存在しない
backlogの課題(Redmineで言うチケット)の完了日を元にチーム内の工数を集計しているのですが、backlogでは完了日のカラムはありませんので、APIで取得しています。
APIで取得することにした理由は以下となります。
- 「ステータス = “完了”」となっている課題の更新日であれば、backlogをcsvでエクスポートしてフィルタすれば簡単に取得可能ですが、ステータスを完了へ変更した後に、課題のカテゴリを変更したりコメントしたりすると、更新日がアップデートされてしまい、完了ステータスへ変更した日とずれてしまう。
- カスタム属性で完了日カラムを追加しても良いのですが、カラムが多いと運用上の工数が大きくなる。
完了ステータスへ変更した日をAPIで覗いてみる
ステータスを変更した際のログはbacklogのコメントに残りますので、コメント情報をAPIで取得します。
$ SPACEID=**** #backlogのスペースID $ KEY=**** #backlogの課題キー $ APIKEY=**** #backlogのAPIキー $ curl -gsS -X GET "https://${SPACEID}.backlog.jp/api/v2/issues/${KEY}/comments?apiKey=${APIKEY}" | jq . |
出力結果(抜粋)
{ ~省略~ "changeLog": [ { "field": "milestone", ~省略~ }, { "field": "status", "newValue": "完了", ~省略~ }, { "field": "resolution", "newValue": "対応済み", ~省略~ } ], "createdUser": { ~省略~ }, "created": "2017-01-20T04:44:25Z", "updated": "2017-01-20T04:44:25Z", ~省略~ }, |
取得したい値は、以下の条件の時の”updated”です。
- “field”が”status”
- “newValue”が”完了”
階層を合わせてstatusとupdatedを取得
“field”と”updated”は階層が異なるので、階層を合わせてあげます。
合わせて、select文を利用して”field”が”status”のもののみ出力します。
$ curl -gsS -X GET "https://${SPACEID}.backlog.jp/api/v2/issues/${KEY}/comments?apiKey=${APIKEY}" \ > | jq '.[] | {"updated": .updated, "status": (.changeLog[] | select(.field == "status") | .newValue)}' |
出力結果
{ "updated": "2017-01-20T07:56:00Z", "status": "完了" } { "updated": "2017-01-20T04:44:25Z", "status": "処理中" } { "updated": "2017-01-19T10:03:37Z", "status": "完了" } |
無事に”updated”と”status”の階層が合いました。
なお、上記の例は、課題ステータスを「完了」→「処理中」→「完了」にした場合の例となります。
完了ステータスへ変更した日を取得
if文を利用して”status”が”完了”の時の”updated”を出力します。
$ curl -gsS -X GET "https://${SPACEID}.backlog.jp/api/v2/issues/${KEY}/comments?apiKey=${APIKEY}" \ > | jq '.[] | {"updated": .updated, "status": (.changeLog[] | select(.field == "status") | .newValue)}' \ > | jq -r '.| if .status == "完了" then (.|[.updated]) else empty end |@csv' |
出力結果
"2017-01-20T07:56:00Z" "2017-01-19T10:03:37Z" |
無事に”updated”が出力できました。
最後に、最も直近の”updated”のみに絞ります。
ここだけjqコマンドで加工できなかったので、Linuxコマンド(Bash)で処理しました。
$ curl -gsS -X GET "https://${SPACEID}.backlog.jp/api/v2/issues/${KEY}/comments?apiKey=${APIKEY}" \ > | jq '.[] | {"updated": .updated, "status": (.changeLog[] | select(.field == "status") | .newValue)}' \ > | jq -r '.| if .status == "完了" then (.|[.updated]) else empty end |@csv' \ > | sort -n | tail -1 |
出力結果
"2017-01-20T07:56:00Z" |
※jqコマンドだけでも書けます。
curl -s "https://${SPACEID}.backlog.jp/api/v2/issues/${KEY}/comments?apiKey=${APIKEY}" \ > | jq -r 'map(select(.changeLog[].field == "status" and .changeLog[].newValue == "完了")) | max_by(.updated) | .updated' |
この記事を書いた人
- 前職ではLinuxを中心とした商用インフラ、今はWindowsを中心とした社内インフラの設計/構築/運用から、社員の業務端末の選定/導入など、社内のIT全般を担当しています。最近は働き方改革に興味があります。
最近書いた記事
- 2019.01.28ハイブリッドクラウド研究会の勉強会で登壇してきました
- 2017.10.31backlog APIで完了日を取得する方法
- 2017.07.28レコチョク勉強会「第2回 Azure初心者向けハンズオン Webサーバ構築編 」を実施しました。
- 2017.05.24レコチョク勉強会「Azure初心者向けハンズオン Webサーバ構築編 」を実施しました。