RubyMineでIssue駆動開発 (GitHubのIssuesとRubyMineのTaskを連携する)

こんにちは。

RubyMineはじめ、JetBrainsのIDEにはTaskというツールが備わっておりまして、こいつがどうもIssue駆動(チケット駆動)で開発するときにピッタリンコなので紹介します。
詳細な[公式オンラインヘルプ](https://www.jetbrains.com/ruby/webhelp/managing-tasks-and-context.html)も併せてどうぞ｡
##### Taskとは?
ここでいう｢Task｣は､プロジェクト内でプログラマにアサインされる作業としての｢タスク｣のことを指します｡Task単位でIDEのContext(開いているファイルやタブ)やChangeListを切り替えることで､RubyMineが日々タスクに追われるプログラマをサポートしてくれます｡

##### Taskツールできること
- GitHubのIssues等のIssueトラッカーと連携して､Issue単位でTaskを管理できます｡対応終わったらIssueをCloseしたりできます｡
- Taskごとに､Branch､Context､ChangeListを作れて､Taskごとにパパッと切り替えできます｡

実際に使うと､以下のような感じでIssueドリブンで開発するのをRubyMine上で完結できます｡
1. GitHubのIssueから自分にアサインされているOpenなものを探してTaskを作る
2. 必要なら一緒にBranch, Context, ChangeListも作る
3. ガーっとコードを書く
4. コミットしてプッシュして1.にもどる

前置きが長くなりましたが本編です｡
### 用意するもの
(GitHubでやる場合)

- GitHubのリポジトリ
- 上記リポジトリのIssues(チケット)
- 上記リポジトリにアクセスできるアカウント
- RubyMine

### Issueトラッカーの接続設定
まず､Issueを管理しているトラッカーへ接続を設定します｡
メニューバーより､Tools → Tasks & Contexts → Configure Servers
![ConnectToGitHub1.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/2a97d305-f50e-1803-77ee-fb20d1a41e6f.png)

右にある緑の+マークを押して､使っているIssueトラッカーを選びます｡今回はGitHubにつなぎます｡
![ConnectToGitHub1.5.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/1adac922-821c-1c38-6ee2-96b1aadf133f.png)

Configured Serversにならびますので､下の方のフォームにリポジトリとAPIトークンを入力します｡トークンが未発行の場合は､Create API token ボタンを押してこの場で作ることもできます(パスワード入力を求められます)｡
![ConnectToGitHub3.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/0e23bf03-2faa-8933-e472-141809e6d243.png)

Test ボタンを押して､Connection is successfurlと表示されたら準備OK｡ OKボタンを押してウィザードを終了します
![GitHubConnectOK.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/c5574b3f-1bfe-d0c9-d327-61fa3aeac88f.png)

### Taskの作成
GitHubのIssuesに接続ができるようになったら､IssueをベースにTaskを作成します｡

まず､先ほど接続したリポジトリのIssueの状態はこんな感じです
![GitHubIssues.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/00a9310f-feed-85bf-460c-6ab7730642e8.png)
[ピンクのブタ](http://www.bonus.is/)が私のGitHubのアイコンです｡上の2つがアサインされているIssueです

RubyMine戻って､Tools → Tasks & Contexts → Open Task
![OpenTaskFromMenu.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/c84080c8-893f-238e-5c17-4d21ed27b515.png)

しばらく待つと､ポップアップでTaskの元にするIssuesが出てきます｡GitHubと連携した場合､自分にAssignされているものだけが出てくるようです｡ここで作業に取りかかるIssueをダブルクリックで選択します｡
![SelectTaskSource.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/be483b95-adf1-a55a-5a83-4c19d80f630b.png)

今度はTaskと一緒に作るものについて聞かれます｡
![OpenTask.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/2f250bef-e566-71af-4de1-98d46a8f0f97.png)

- Clear Current Context
    - Contextをクリアします(ウインドウ配置をデフォルトに戻して､エディタで開いているファイルをすべて閉じます)｡
- Create Branch
    - Taskと一緒にBranchを作成してくれます｡名前とBranch元を選ぶこともできます｡
- Create ChangeList
    - Taskと一緒にCangeListを作成します｡

とりあえず全部チェックしてOKします｡

おめでとうございます! Taskが完成しました!
![TaskCreated.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/3189546c-708c-5333-9440-9f95a47c7636.png)
ツールバー右に現在のTaskが表示されています｡また､先ほど作ったChangeListとBranchがアクティブになっています｡

### ちょっと便利なTaskの機能
Issueベースでタスクを作った場合､Issueにまつわるたまに役立つ機能があるので紹介します｡

Tools → Tasks & Contexts
![TaskUsefulFunction.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/fd8cdc03-0302-9310-2934-c8db793deaed.png)
#### Open <_task name_> in Browser: Issueをブラウザで開く
そのまんまです｡GitHubでやってる場合､GitHubのIssueページが開きます｡
#### Show <_task name_> Description: IssueのDescriptionを認する
IssueトラッカーのDescriptionをRubyMineのポップアップで表示することができます｡
いちいちブラウザに遷移しなくていいのでチラ見したいとき等には便利かもしれません｡
![ShowDescription.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/c66aec03-991c-ddf0-580b-e3bcffb8d28e.png)

### Taskの切替
プログラマは一つの作業に集中したいんです｡ですが､どうしても横やりは入ってきます｡そしてマルチタスクを余儀なくされます｡｡｡
そんなときに力を発揮する(?)のが､Task切り替えです｡Taskを切り替えれば､作業に応じてIDEの状態をスイッチしてくれます｡

Taskを切り替えるのに一番手っ取り早いのは､ツールバーの現在のタスクからプルダウンで選択する方法です｡
![ChangingTask.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/be058923-1b1b-63c6-e99b-7402f94b00fa.png)

タスクを切り替えると､チェンジリスト､開いているファイルとウインドウレイアウト､ブランチが切り替わります｡
Before
![BeforeTaskChange.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/b019a4a7-da4a-cc45-fd80-bfd2391ea332.png)
After
![AfterTaskChange.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/43f6fa45-82db-9921-cc9f-ecfcf58eb3f9.png)

### Taskのクローズ
Taskの作業が終わったら､Taskをクローズします｡

Tools → Tasks & Contexts → Close Active Task
![TaskUsefulFunction.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/fd8cdc03-0302-9310-2934-c8db793deaed.png)

クローズ時のオプションをいろいろ聞かれます｡
![CloseTask.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/bb16eeae-0043-6e42-f8f3-46f208f54076.png)

- Close Issue
    - TaskのベースになっているIssueトラッカーのIssueのステータスをCloseへ更新します｡
- Commit Changes
    - Taskで作ったChangeListに未コミットの変更がある場合､コミットします｡
- Merge Branch
    - ローカルリポジトリのBranchをマージします｡

個人的にはここのチェックは滅多に使うことはないです(今回記事を作るので､初めてチェックして使ってみました)｡
コミットはこまめにしていると思いますし､Masterへのマージはローカルではやりませんし｡Issueのクローズはレビューした後で行っていますので､自分のTaskが終わったところでCloseということもありませんので｡｡｡
ま､一応こういう機能もありますよということで｡

Close IssueをチェックしてOKすると､GitHubのIssueもきちんとCloseされていました｡
※ GitHubの場合､Tokenに､リポジトリへの書き込み権限をつけておかないとエラーになります｡
![ClosedIssue.PNG](https://qiita-image-store.s3.amazonaws.com/0/55737/019b3eb1-0c2b-5880-7ac7-38a3358d4997.png)

長くなりましたが以上です｡
Enjoy RubyMine!