こんにちは。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
こんな感じのコマンドラインインターフェースを簡単に定義できます。
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
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
このような形でターミナルで簡単に table 表示ができます。 ちょっとした工夫で表示を直感的にできます。
boxen
下記のようないわゆる Jumbotron
の表示が簡単にできます。
visasq-ctl release deploy --env-stage=dev --live-deploy-progress ⚠ Git tag push remote URL ┌──────────────────────────────────┐ │ │ │ git@github.com:xxxxx/xxxxx │ │ │ └──────────────────────────────────┘
ora
実行状態の Progress 管理を Spinner 表示しながら、簡単に状態管理のテキストをグラフィカルな表示できます。 また、状態が Done をした場合は、テキストを残す等、細かいカスタマイズができます。
Prompts
CLI ツールを作るにあたり、ユーザーの入力を求めるシーンがたくさんあると思いますが、 Prompts を利用すると
- Y/N のコマンド
- radio ボタン
- passwrod
- number の入力
- list 形式の入力
- 入力内容のフィルター等
入力シーンで必要なものが一式簡単に扱えるようになります。
pkg
Vercel が提供する NodeJS のコードをクロスプラットフォームにバイナリ化ができる (Go の go build
とほぼ同等)
ツールです。
CLI ツールを作成するにあたってローカル環境に依存させたツールを作成すると、すぐに魔境化が起こリますが、それをバイナリ化することで安心・安全に CLI を配布することができます。
visasq-ctl では GitHub に リリースタグを Push すると、GitHub Action が連動して、GitHub Release に バイナリ化した ファイルをアップロードされます。
最後に
このような形でビザスクでは、コマンドラインツール等、雑多なツールについてもなるべくわかりやすさや使いやすさを追求してエンジニアリングを進めています。
このような、ちょっとしたツール作りに興味がある方は是非こちらも見てください。