LCL Engineers' Blog

バス比較なび・格安移動・バスとりっぷを運営する LCLの開発者ブログ

YouTrackのIssueを素早くターミナルに表示する

f:id:hosht:20200205183558g:plain

1月に入社しましたバックエンドエンジニアの星野です。 バックエンドの中でもインフラ周りを中心に取り組んでいきますのでその中で得られた知見をブログに書いていきたいです。

さて、LCLではタスク管理にYouTrackを利用しているというのはブログにも書かれております。

techblog.lclco.com

入社からバックエンドチームへのオンボーディングが進行する中でアサインされているIssueが徐々に増えてきました。

普段の開発や作業ではターミナルとVisual Studio Codeを行ったり来たりするのですが現在進行中のIssueの内容を確認するためには一度ブラウザを開かないといけません。

しかし、一度ブラウザを開くとSlackの未読などが眼に留まり気が散ってしまいます。 そこで、ターミナル上でIssueの確認ができる環境を作成しました。

youtrack-cli

まず初めにYouTrackがAPIでIssueの一覧や詳細の情報を提供しているかを調査しました。

調査過程で有志によって作成されたCLIを見つけたので試してみたところレスポンスを見やすく整形して出力してくれて、さらにjsonのアウトプットにも対応していたのでこちらを採用することにしました。

github.com

アサインされているIssue一覧を表示

youtrack-cliの使い方はリポジトリのREADMEにあるのでここでは割愛します。

よく使うコマンドは完了していないアサインされているIssue一覧の検索です。

youtrack i f -q "for: me State: -終了 sort by: State desc"

f:id:hosht:20200205174925p:plain

zshのエイリアスとして登録してすぐに確認できるようにしています。

alias youtrack-selfassigned='youtrack i f -q "for: me State: -終了 sort by: State desc"'

Issue詳細表示

先ほどのコマンドでアサインされているIssueが確認できました。

youtrack-cliではIssueの詳細を表示したい場合は下記のコマンドを実行します。

youtrack i s super-awesome-issue-10

IssueのIDを引数に渡していますが毎回IDをコピーしてコマンドを入力するのは手間なので一覧から選択できるようにします。

f:id:hosht:20200205174813p:plain

解説

こちらが記事冒頭の画像で実行しているコマンドの全容になります。

function youtrack-my-issue() {
    youtrack i f -r -q "for: me State: -終了 sort by: State desc" \
        | jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv' \
        | xsv select 'id,summary,Priority,State' \
        | xsv table \
        | sed '1d' \
        | anyframe-selector-auto \
        | awk '{print $1}' \
        | anyframe-action-execute unbuffer youtrack i s \
        | less -qr
}

複数のツールを組み合わせてデータを絞り込みながら最終的にyoutrack i sにIDを渡しています。 それでは個別に見ていきましょう。

zsh

function youtrack-my-issue() {}

一連のコマンドの実行と結果をパイプでつないでzshの関数としてまとめています。

macOSであれば10.15からデフォルトのshellがzshですがhomebrewなどで最新版をインストールすることを推奨します。

youtrack-cli

youtrack i f -r -q "for: me State: -終了 sort by: State desc"

まずはyoutrack-cliを使ってアサインされているIssueの一覧をjsonで取得します。

冒頭で紹介したコマンドに-rオプションをつけて出力をjsonに変更しています。

jq

jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'

jqはjsonデータを簡単に操作できるコマンドです。

ここでは個別にコマンドの解説は行いませんが各Issue毎のjsonオブジェクトを1行ずつにまとめcsvとして出力しています。

github.com

xsv

xsv select 'id,summary,State' | xsv table

xsvはcsvデータを簡単に操作できるコマンドです。

xsv selectで必要なカラムを絞り込んでxsv tableでカラム毎にスペースで埋めて視認性を向上しています。

github.com

sed

sed '1d'

この後のフィルター時にヘッダー行が不要なためsedで1行目をカットしています。

fzf

fzfはシェルで使えるインタラクティブフィルターです。同様の機能をもつフィルターとしてpecoも有名です。

anyframeが内部的に呼び出しているのでここではコマンドを直接実行していません。

github.com

anyframe-selector-auto

anyframeはfzfでよく使うコマンドをラップしたzshプラグインです。

github.com

使い方は作者による解説がわかりやすいです。

qiita.com

anyframe-selector-autoにIssueの一覧を渡すとfzfが立ち上がり文字列による絞り込みやカーソルでの選択ができるようになり、決定した項目を再び標準出力に渡してくれます。

awk

awk '{print $1}'

awkでIssueのIDのみを抽出しています。

anyframe-action-execute

anyframe-action-execute unbuffer youtrack i s

標準入力で受け取った文字列を引数としてコマンドを実行しています。

unbufferを使い標準出力をコンソールであるかのように扱うことでこの後のlessで色をつけることができます。

less

less -qr

最後はlessに渡してIssueの内容を閲覧します。

駆け足な説明でしたがターミナル上でYouTrackのIssueを選択して表示できました。

YouTrackに限らずAPI経由でデータを取得できれば上記の一連の流れは同じなため是非試してみてください。

採用情報

LCLではCLIを活用して生産性向上に励む仲間を絶賛募集中です。

www.lclco.com