目次

目次

backlog APIで完了日を取得する方法

アバター画像
藤川大
アバター画像
藤川大
最終更新日2017/10/31 投稿日2017/10/31

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全般を担当しています。最近は働き方改革に興味があります。

目次