mruby-cli + Backlog API を利用した心のこもった Backlog 課題運用のご提案（課題を作って、コメント付けて、ステータス変更する）

## 皆さん

おはげようございます、こんにちわ、こんばんわ。

Backlog 利用していますか。
私も漏れなく公私共に Backlog を利用させて頂いております。

## ところで

Backlog に API が提供されていることは何となくは存じ上げておりましたが、最近になって Backlog の API を利用して業務改善出来るんぢゃないかなーと思いはじめた部分があるので試しに Backlog API を触ってみました。

http://developer.nulab-inc.com/ja/docs/backlog

## ということで、Backlog API を叩く CLI ツールを作ってみた

ので課題を作ったり、コメント付けたり、ステータスを変更したりしてみたいと思います。

https://github.com/inokappa/backlog-issue

あくまでもサンプルとして作ったものなのでツッコミどころ満載です。

## backlog-issue の準備

### Docker があると嬉しい

[mruby-cli](https://github.com/hone/mruby-cli) は mruby でコマンドラインツールが作れる優れもののツールですが、バイナリを生成するにあたり docker-compose を利用しますので、作業環境には Docker エンジンが動いていると嬉しいと思います。

また、mruby ですので、Linux や Windows 版のバイナリについても生成される点も嬉しいですよね。（実際に試せてはいませんのでご容赦下さいmm）

### バイナリの生成

```bash
git clone https://github.com/inokappa/backlog-issue.git
cd backlog-issue
docker-compose run compile
```

以上です。

暫く待つとバイナリが生成されますので確認しましょう。

今回試す環境は MacOS X ですので、カレントディレクトリの以下のディレクトリにバイナリが作成されます。

```bash
bash-3.2$ ls -l mruby/build/x86_64-apple-darwin14/bin
total 2328
-rwxr-xr-x  1 kawahara  staff  1190464 Nov 20 08:31 backlog-issue
```

### API キー

API キーを事前にダッシュボードから払い出しておきましょう。そして、以下のように環境変数にセットします。

```bash
export BACKLOG_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

### ヘルプ

ヘルプを見てみましょう。

```bash
bash-3.2$ cd mruby/build/x86_64-apple-darwin14/bin
bash-3.2$ ./backlog-issue --help
Please set Backlog Space Name.
```

上記の通り、Backlog のスペース名が必要になります。今回は `hage-pika` というスペース名の Backlog を操作する体でいきます。

```bash
bash-3.2$ ./backlog-issue --help --space hage-pika

Usage: backlog-issue [options]

  -h, --help               Display help.
  -v, --version            Display version.
  --space Space_Name       Set Backlog Space Name(Required).
  --project Project_Key    Set Project Key(Project ID = ).
  --issue Issue_Title      Set Issue Title.
  --type Issue_Type        Set Issue Type(Issue Type ID = ).
  --status Status_ID       Set Issue Status ID( 未対応 = 1, 処理中 = 2, 処理済み = 3, 完了 = 4,).
  --priority Priority_ID   Set Issue Priority ID( 高 = 2, 中 = 3, 低 = 4,).
  --desc Description       Set Issue Description.
  --key Issue_Key_Name     Set Issue Key Name.
  --comment Comment        Set Comment.
```

さらに、対象のプロジェクト名を `--project` で指定すると以下のように出力されます。今回は `FAM` というプロジェクトで操作する体でいきます。

```bash
bash-3.2$ ./backlog-issue --help --space hage-pecha --project FAM

Usage: backlog-issue [options]

  -h, --help               Display help.
  -v, --version            Display version.
  --space Space_Name       Set Backlog Space Name(Required).
  --project Project_Key    Set Project Key(Project ID = xxxxx).
  --issue Issue_Title      Set Issue Title.
  --type Issue_Type        Set Issue Type(Issue Type ID =  タスク = 1xxxx1, バグ = 1xxxx2, 要望 = 1xxxx3, その他 = 1xxxx2,).
  --status Status_ID       Set Issue Status ID( 未対応 = 1, 処理中 = 2, 処理済み = 3, 完了 = 4,).
  --priority Priority_ID   Set Issue Priority ID( 高 = 2, 中 = 3, 低 = 4,).
  --desc Description       Set Issue Description.
  --key Issue_Key_Name     Set Issue Key Name.
  --comment Comment        Set Comment.
```

上記のようにプロジェクトの ID と `Issue Type`（種別 ID） についてはプロジェクト単位で生成される為、対象となるプロジェクト毎の値が返ってくるようになります。

## backlog-issue を操作する

### 課題を起票する

せっかくなので backlog-issue コマンドのバグ報告をしてみましょう。

```bash
bash-3.2$ ./backlog-issue --space hage-pika \
>   --project FAM \
>   --title "これはバグだろうこんちきしょう" \
>   --type 1xxxx2 \
>   --desc "これは mruby のコマンドラインツールからの投稿です" \
>   --priority 2
```

以下のようなレスポンスが返ってきます。レスポンス内容は Backlog API が返す値そのままをダンプしています。必要に応じて `jq` コマンド等で整形しましょう。

```json
{"id":xxxxxx,"projectId":xxxxx,"issueKey":"FAM-9","keyId":9,"issueType":{"id":1xxxx2,"projectId":xxxxxxx,"name":"バグ","color":"#990000","displayOrder":1},"summary":"これはバグだろうこんちきしょう","description":"これは mruby のコマンドラ インツールからの投稿です","resolution":null,"priority":{"id":2,"name":"高"},"status":{"id":1,"name":"未対応"},"assignee":null,"category":[],"versions":[],"milestone":[],"startDate":null,"dueDate":null,"estimatedHours":null,"actualHours":null,"parentIssueId":null,"createdUser":{"id":xxxxxxx,"userId":"backlog-api","name":"backlog-api-demo","roleType":1,"lang":null,"mailAddress":"xxx@xxxx.com","nulabAccount":null},"created":"2016-11-19T23:54:55Z","updatedUser":{"id":xxxxxxx,"userId":"backlog-api-demo","name":"backlog-api-demo","roleType":1,"lang":null,"mailAddress":"xxx@xxxx.com","nulabAccount":null},"updated":"2016-11-19T23:54:55Z","customFields":[],"attachments":[],"sharedFiles":[],"stars":[]}
```

`issueKey` を確認しておきましょう。

本当に課題が起票されているか、念の為にい確認しておきましょう。

![2016112001.png](https://qiita-image-store.s3.amazonaws.com/0/87189/c8e4a75c-67c7-e03c-e809-8154b3afa0e3.png)

### 課題にコメントを付ける

心をこめてコメントを付けてみましょう。

```bash
bash-3.2$   ./backlog-issue --space hage-pika \
>   --key FAM-9 \
>   --comment "すいません、すいません、すいません。すぐ直します"
```

先ほど控えておいた `issueKey` を `--key` に指定して `--comment` にコメントを書きます。

以下のようなレスポンスが返ってきます。

```json
{"id":xxxxxxxx,"content":"すいません、すいません、すいません。すぐ直します","changeLog":[],"createdUser":{"id":xxxxx,"userId":"backlog-api-demo","name":"backlog-api","roleType":1,"lang":null,"mailAddress":"xxxx@xxxxx.com","nulabAccount":null},"created":"2016-11-20T00:04:34Z","updated":"2016-11-20T00:04:34Z","stars":[],"notifications":[]}
```

本当にコメントがついているか、念の為に確認しておきましょう。

![2016112002.png](https://qiita-image-store.s3.amazonaws.com/0/87189/d47f94ab-75ed-3972-a42e-663581d3c2b0.png)

### 課題のステータスを変える

早速、改修作業に着手しましょう。ということで、コメントを付けて課題のステータスを「処理中」に変更してみたいと思います。

```bash
bash-3.2$   ./backlog-issue --space hage-pika \
>   --key FAM-9 \
>   --status 2 \
>   --comment "改修作業を開始しました"
```

以下のようなレスポンスが返ってきます。

```json
{"id":xxxxxxxx,"content":"改修作業を開始しました","changeLog":[],"createdUser":{"id":184492,"userId":"backlog-api","name":"backlog-api-demo","roleType":1,"lang":null,"mailAddress":"xxx@xxxx.com","nulabAccount":null},"created":"2016-11-20T00:11:20Z","updated":"2016-11-20T00:11:20Z","stars":[],"notifications":[]}
{"id":xxxxxx,"projectId":xxxxxx,"issueKey":"FAM-9","keyId":9,"issueType":{"id":1xxxx2,"projectId":xxxxx,"name":"バグ","color":"#990000","displayOrder":1},"summary":"これはバグだろうこんちきしょう","description":"これは mruby のコマンドラ インツールからの投稿です","resolution":null,"priority":{"id":2,"name":"高"},"status":{"id":2,"name":"処理中"},"assignee":null,"category":[],"versions":[],"milestone":[],"startDate":null,"dueDate":null,"estimatedHours":null,"actualHours":null,"parentIssueId":null,"createdUser":{"id":xxxxxx,"userId":"backlog-api-demo","name":"backlog-api-demo","roleType":1,"lang":null,"mailAddress":"xxx@xxxx.com","nulabAccount":null},"created":"2016-11-19T23:54:56Z","updatedUser":{"id":xxxxxx,"userId":"backlog-api","name":"backlog-api-demo","roleType":1,"lang":null,"mailAddress":"xxx@xxxx.com","nulabAccount":null},"updated":"2016-11-20T00:11:21Z","customFields":[],"attachments":[],"sharedFiles":[],"stars":[]}
```

本当にコメントがついているか、念の為に確認しておきましょう。

![2016112003.png](https://qiita-image-store.s3.amazonaws.com/0/87189/b13af362-c042-6472-9b46-baf1f35f89cf.png)

### 課題を閉じる

頑張った改修の結果、改修は終了ということで課題を完了としたいと思います。

```bash
bash-3.2$   ./backlog-issue --space hage-pika \
>   --key FAM-9 \
>   --status 4 \
>   --comment "改修作業が完了しましたけん"
```

本当に完了しているか、念の為に確認しておきましょう。

![2016112004.png](https://qiita-image-store.s3.amazonaws.com/0/87189/29f7acbf-6dd3-4129-96ef-826c173536db.png)

良かった、良かった。

## ということで

駆け足で Backlog API をラップした backlog-issue というコマンドの使い方を紹介しつつ、Backlog API を触ってみましたが、とても簡単に Backlog 課題を操作出来たと思います。

もう少し、自分の中でやりたいことを整理した上で、Backlog API を使った心のこもった課題運用について検討していきたいと考えています。

ありがとうございました。