VISASQ Dev Blog

ビザスク開発ブログ

管理しやすい CLI ツールを作るためのビザスクの取り組みについて

こんにちは。SREチームでリーダーをやっている木村です。

座右の名は「明日自分が交通事故にあっても、システムの運用を滞りなくする」です。

本日は、デプロイやその他の自動化のハブにするためにビザスクでは、visasq-ctl というコマンドラインツールを 作っています。

今回は visasq-ctl の構成や工夫している点についてお話させていただきます。

visasq-ctl のシステム構成

visasq-ctl は NodeJS で実装されています。

CLI ツールは、最近だと Go や Rust で実装するのがトレンドかと思いますが、敢えて NodeJS (TypeScript) を採択しています。

理由は

  • 開発全体で触ってもらいたいので、エンジニアの中で経験が多い言語にしたかった
  • NodeJS の NPM Package には、CLI ツールをつくるのにエコな NPM Package がたくさんある
  • vercel/pkg という Vercel が提供する NodeJS をバイナリ化する NPM Package があって、CLI の配布管理が楽にできる

この3点から採択をしています。

visasq-ctl で利用している CLI で便利な NPM Package

実際に利用している中で入れてよかったな。という NPM Package を紹介させていただきます。

Commander.js

GitHub tj/commander.js

こんな感じのコマンドラインインターフェースを簡単に定義できます。

visasq-ctl --help
Usage: visasq-ctl [options] [command]

Options:
  -V, --version              output the version number
  -h, --help                 display help for command

Commands:
  version                    visasq-cliのversion管理コマンド
  configure                  visasq-cliの設定を行います
  repository                 repository(Git関連)設定や情報を取得します。visasq-ctl repository init allを実行すると関連するリポジトリ一式をgit cloneでworkspaceに配置できます
  doctor [options] [app...]  アプリケーションの設定診断を行います 引数[app]を指定しない場合はdoctor listにある項目全てを検査します
  release                    release関連のコマンドを提供します
  cache                      cache関連のコマンドを提供します
  logging                    Application logging関連のコマンドを提供します
  help [command]             display help for command

NodeJS には他にもたくさん コマンドラインインターフェース のフレームワークがあるのですが、色々触ってみた中で、Commander.js が一番使いやすく、不具合が少なかったので採用しています。

サブコマンドの実装も直感的に書けます。

CHALK

GitHub chalk/chalk

terminal のカラーを簡単に制御できる

Terminal カラーを制御する NPM Package で定番ですね。

log-symbols

GitHub sindresorhus/log-symbols

ターミナルで簡単に symbol (? 等)の表示ができるようになります。

visasq-ctl release deploy --env-stage=dev --live-deploy-progress


⚠ Git tag push remote URL
.
.
? Git tagをremoteにPushしますか? › (y/N)

cli-table3

GitHub cli-table/cli-table3

cli-table3

このような形でターミナルで簡単に table 表示ができます。 ちょっとした工夫で表示を直感的にできます。

boxen

GitHub sindresorhus/boxen

下記のようないわゆる Jumbotron の表示が簡単にできます。

visasq-ctl release deploy --env-stage=dev --live-deploy-progress


⚠ Git tag push remote URL
┌──────────────────────────────────┐
│                                  │
│   git@github.com:xxxxx/xxxxx   │
│                                  │
└──────────────────────────────────┘

ora

GitHub sindresorhus/ora

実行状態の Progress 管理を Spinner 表示しながら、簡単に状態管理のテキストをグラフィカルな表示できます。 また、状態が Done をした場合は、テキストを残す等、細かいカスタマイズができます。

Prompts

GitHub terkelg/prompts

prompts のイメージ

CLI ツールを作るにあたり、ユーザーの入力を求めるシーンがたくさんあると思いますが、 Prompts を利用すると

  • Y/N のコマンド
  • radio ボタン
  • passwrod
  • number の入力
  • list 形式の入力
  • 入力内容のフィルター等

入力シーンで必要なものが一式簡単に扱えるようになります。

pkg

GitHub vercel/pkg

Vercel が提供する NodeJS のコードをクロスプラットフォームにバイナリ化ができる (Go の go build とほぼ同等) ツールです。

CLI ツールを作成するにあたってローカル環境に依存させたツールを作成すると、すぐに魔境化が起こリますが、それをバイナリ化することで安心・安全に CLI を配布することができます。

visasq-ctl では GitHub に リリースタグを Push すると、GitHub Action が連動して、GitHub Release に バイナリ化した ファイルをアップロードされます。

visasq-ctl のリリースノート

最後に

このような形でビザスクでは、コマンドラインツール等、雑多なツールについてもなるべくわかりやすさや使いやすさを追求してエンジニアリングを進めています。

このような、ちょっとしたツール作りに興味がある方は是非こちらも見てください。

GitHub visasq/recruting-public