mike-neckのブログ

Java or Groovy or Swift or Golang

JetBrains系IDEと各種ITSとGitを連携してスマートに作業する

f:id:mike_neck:20170312130612j:plain

JetBrainsユーザーグループにて「IntelliJとYouTrack」というタイトルにて発表してきましたが、グダグダな発表をしたのでちゃんとまとめた記事を書きます。

jbugj.connpass.com


要点

JetBrains系IDEでは、標準に付属しているツールを用いることで、スマートに作業ができます。(なお、一部のIDEについてはリポジトリーからインストールしないといけなさそうです(GoglandにはTaskManagementプラグインが付属していないようだった))

  • Task Management プラグイン
    • ITS(イシュー管理システム)とIDEを連携させてTaskContext を管理できるプラグイン
      • Task - イシュー管理システムのチケットに該当する、作業の単位をあらわす
      • Context - 開いているファイルのカーソルの位置や、プロジェクトツリーの開いているディレクトリー、ツールウィンドウの状態などIDEの状態
  • VCSツール
    • IDEVCSを連携させる機能(以下Gitベースでの解説)
      • 標準的に使っている機能は普通に使える(add/commit/push/fetch/merge/rebase/checkout/log/diffなど)
      • Changelist
        • 変更を管理するための論理的なまとまりでファイル単位でコミットに加えるべきファイルを管理できる
  • JetBrains IDEを用いたワークフロー
    1. ITSに登録したチケットを元に Task を開く
    2. Task に関係のない変更(ちょっと気になった部分のリファクタリングなど)を行った場合は別の Changelist で管理する
    3. 他の Task に取り掛かる場合には開いているファイルなどの情報(Context)が自動で切り替わる
    4. Task 終了と同時にイシュー管理システムのステータスを更新する

Task Managementプラグイン

ITS(イシュー管理システム)とIDEを連携させてTaskContext を管理できるプラグインです。Task はイシュー管理システムのチケットに該当する、作業の単位をあらわします。Context は開いているファイルのカーソルの位置や、プロジェクトツリーの開いているディレクトリー、ツールウィンドウの状態などIDEの状態をあらわします。IDEにておこなう作業(Task)はITSのチケットに基づいておこなわれ、作業している状態(Context)が作業に関連づいているような感じです。


ITSの設定

特に何も操作をしていなければ、IDE上では Default Task が選択されており、その ContextDefault Task に紐付いたコンテクストになっています。

f:id:mike_neck:20170311201833p:plain

上の画像は Default Task にて作業をおこなった後の状態です。画像右上のあたりにあるプルダウンが Default Task となっているのがわかるかと思います。

まず、ITSに登録されているチケットと連動させます。

Tools > Task & Contexts > Configure Servers... からITSのサーバー設定を行います。

f:id:mike_neck:20170311203336p:plain

f:id:mike_neck:20170311204202p:plain

リストの左下にある + ボタンから連携するサーバーの種類を選びます。JIRA/YouTrack/Redmine/Trackなど主要なITSはカバーしています(Backlogはありませんが…)。

f:id:mike_neck:20170311204851p:plain

サーバーを選択した後、ITSのURL、ログイン用ユーザー名、パスワード、チケット検索用のクエリを入力してサーバーの設定は完了です。


このプラグインの具体的な使い方は後述します。


VCSツール

IDEVCSを連携させる機能もあります。以下はGitベースでの解説ですが、他のVCSでも同様のことができ(ると思い)ます。

基本的な操作
  • add は自動的に行われます。IDE内でおこなった変更はすべて add された状態になります(正確には add されていないけど、IDEにて add 相当の状態として管理されている)。
    • IDE外でおこなった変更(例えばスクリプトで出力したファイルなど)は add されていないので、 + + A で明示的に add する必要があります。
  • commit + K からおこないます。コミットの前にコードインスペクションやリフォーマット、importのオプティマイズなどをおこなえます。
  • push + + K です。
  • ブランチの選択、新しいブランチの作成は右下のブランチのプルダウンからおこないます。
  • fetchVCS > Fetchmerge は右下のブランチからマージするブランチを選んでから Merge を選びます

f:id:mike_neck:20170311212340p:plain

上の画像は現在のブランチから新しいブランチを作成する場合

f:id:mike_neck:20170311212424p:plain

上の画像は origin/master ブランチを現在のブランチにマージする場合


Changelist

IDEVCS連携は普通すぎるのですが、changelistはかなり強力な機能です。この機能によりコミットをより綺麗なものにできます。changelistは変更されたファイルを意味のある単位にまとめた集まりのことです。IDEのコミットはこのchangelist単位で行われます。よく言われる git add . をしないでファイルを指定して git add していると思いますが、changelist機能はIDEでその慣例をサポートするための機能です。先程IDE上で行われた変更は add された状態になると記述しましたが、正確にはchangelistで管理された状態になります。そしてコミットの際にchangelistにあるファイルが add されてコミットされます。

changelistを使っていくと、よくある関係ない変更がコミットに紛れ込んでしまうようなケースでも、簡単にコミットを綺麗に保つことができます。例えば、現在のチケットとは関係のない部分のちょっとしたリファクタリングをおこなったとしても、その変更を別のchangelistに入れておくことでコミットの中に関係のない変更が紛れ込むのを抑制したりできます。

changelistは左下の方にあるVersion Controlツールのchangelistタブで見ることができます。

f:id:mike_neck:20170311214825p:plain

changelistにはアクティブなchangelistとアクティブでないchangelistの二つがあります。エディタスペースなどでおこなった変更はすべてアクティブchangelistに加わります。そしてコミットする場合もアクティブchangelistに入っているファイルがコミット対象になります。

現在行っている作業と関係のない変更はすべてアクティブでないchangelistに加えるとよいでしょう。changelist間のファイルはドラッグ&ドロップで移動できます。

アクティブchangelistの切り替えは、changelistを選んでから左のチェックボックスのようなボタンを押すことで切り替えられます。

f:id:mike_neck:20170311221806p:plain

左にある + ボタンから新しいchangelistを作ることができます。

f:id:mike_neck:20170311215021p:plain

ダイアログにはchangelistの名前を入力します。なお、コミットコメントを先に書いておきたい場合は、コメント欄に書いておくこともできます。


IDEを用いたワークフロー

以下、JetBrains系IDE(ここではIntelliJ IDEA)とITS(ここではYouTrack)とGit(およびGitHub)を用いたワークフローのサンプルケースを記述します。

1. チケットから Task を開く

現在、次のような未解決のチケットが自分に割り当てられているとします。

f:id:mike_neck:20170312084931p:plain

Default Task のコンテクストで Tools > Task & Contexts > Open Task(または + + N)から上記チケットの中から一つ選びます。

f:id:mike_neck:20170312092017p:plain

Open Task ダイアログにて次のように設定して、 Task を開きます。

  • Update issue state → In Progress に更新
  • 現在の Context をクリアする(別の Context を作ると同意)
  • Create branch → masterからチケットのIDと同じ名前のブランチを作成
  • Changelist → 新しいchangelistを作成

f:id:mike_neck:20170312093559p:plain

Task を開いた後のIDEの状態。 Context をクリアすると、今まで開いていたファイルなどがすべて閉じられた状態になります。

f:id:mike_neck:20170312095312p:plain

もちろん、ITSではチケットの状態が更新されています。

f:id:mike_neck:20170312095421p:plain

2. 作業をする

コードを書きます。おこなった変更はすべて先程作成したchangelistに入ります。

f:id:mike_neck:20170312110615p:plain

ここで Task と関係のない変更を行います。

f:id:mike_neck:20170312112823p:plain

この変更は同じコミットに加えたくないので、新しいchangelistを作成して、そちらに移します。

f:id:mike_neck:20170312113154p:plain

+ K からコミットします。

f:id:mike_neck:20170312115056p:plain

3. 他の Task を開く

作業の途中ですが、別の変更もしてしまったため、その変更に該当するチケットから Task を開きます。この際、ブランチ作成元のブランチは現在のブランチでなくmasterを指定しておきます。

f:id:mike_neck:20170312120638p:plain

f:id:mike_neck:20170312120727p:plain

新しい Task に切り替える際に、アクティブchangelistの中身が空の場合はchangelistを削除するか聞かれます。削除してしまってかまわない場合は「Remove」を、削除しない場合は「Cancel」を選びます。

f:id:mike_neck:20170312120922p:plain

先程、一時的にchangelistに加えておいた変更をドラッグ&ドロップで新しいchangelistに移動させます。

f:id:mike_neck:20170312121204p:plainf:id:mike_neck:20170312121215p:plain

この後にコミットをしておきます。

そして Tools > Task & Contexts > Switch Task( + + T)から最初に作った Task に切り替えます。

f:id:mike_neck:20170312122858p:plain f:id:mike_neck:20170312123004p:plain

4. Task を終了する

Tools > Task & Contexts > Close Active Task( + + W)から Task を終了します。

f:id:mike_neck:20170312124412p:plain

Task を終了する際にできることは次のことです。

  • ITSのステータスを更新する
  • まだコミットしていない変更をコミットする
  • (コミットした上で)変更をブランチの作成元にマージする

プルリクエストからマージしたいので、ここではITSのステータスを「Waiting Review」に更新するだけにとどめます。

f:id:mike_neck:20170312125005p:plain f:id:mike_neck:20170312130136p:plain

なお、 Task を終了しても、IDE上では特に変化があるわけではありません。というのも、レビューによってこの後に同じ Context にて作業をする可能性があるかもしれないからです(と理由を言い切ることもできない…)。

プルリクエストを作っていないので、IDEから作ります。特にキーマップを割り当てていないかぎりプルリクエストの作成はキーマップからはできないので、 + + A からコマンドを探してプルリクエストを選びます。

f:id:mike_neck:20170312125432p:plain

titleとdescriptionを入力して「OK」を押してプルリクエストを作成します。

f:id:mike_neck:20170312125832p:plain

これでプルリクエストが作成されます。

f:id:mike_neck:20170312125949p:plain

f:id:mike_neck:20170312130256p:plain


このような形で、JetBrains系のIDEとITSを連携させるとかなりスマートに作業ができます。

おわり