1月に入社しましたバックエンドエンジニアの星野です。 バックエンドの中でもインフラ周りを中心に取り組んでいきますのでその中で得られた知見をブログに書いていきたいです。
さて、LCLではタスク管理にYouTrackを利用しているというのはブログにも書かれております。
入社からバックエンドチームへのオンボーディングが進行する中でアサインされているIssueが徐々に増えてきました。
普段の開発や作業ではターミナルとVisual Studio Codeを行ったり来たりするのですが現在進行中のIssueの内容を確認するためには一度ブラウザを開かないといけません。
しかし、一度ブラウザを開くとSlackの未読などが眼に留まり気が散ってしまいます。 そこで、ターミナル上でIssueの確認ができる環境を作成しました。
youtrack-cli
まず初めにYouTrackがAPIでIssueの一覧や詳細の情報を提供しているかを調査しました。
調査過程で有志によって作成されたCLIを見つけたので試してみたところレスポンスを見やすく整形して出力してくれて、さらにjsonのアウトプットにも対応していたのでこちらを採用することにしました。
アサインされているIssue一覧を表示
youtrack-cliの使い方はリポジトリのREADMEにあるのでここでは割愛します。
よく使うコマンドは完了していないアサインされているIssue一覧の検索です。
youtrack i f -q "for: me State: -終了 sort by: State desc"
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をコピーしてコマンドを入力するのは手間なので一覧から選択できるようにします。
解説
こちらが記事冒頭の画像で実行しているコマンドの全容になります。
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として出力しています。
xsv
xsv select 'id,summary,State' | xsv table
xsvはcsvデータを簡単に操作できるコマンドです。
xsv select
で必要なカラムを絞り込んでxsv table
でカラム毎にスペースで埋めて視認性を向上しています。
sed
sed '1d'
この後のフィルター時にヘッダー行が不要なためsedで1行目をカットしています。
fzf
fzfはシェルで使えるインタラクティブフィルターです。同様の機能をもつフィルターとしてpecoも有名です。
anyframeが内部的に呼び出しているのでここではコマンドを直接実行していません。
anyframe-selector-auto
anyframeはfzfでよく使うコマンドをラップしたzshプラグインです。
使い方は作者による解説がわかりやすいです。
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を活用して生産性向上に励む仲間を絶賛募集中です。