Bash/ZshのプロンプトにGoogle Cloud SDKのconfig情報を表示する「gcloud-prompt」を作った
TL;DR
これです。
https://github.com/progrhyme/gcloud-prompt
gcloud-prompt.sh
を読み込んで gcloud_prompt
という関数を実行すると、Google Cloud SDKのconfigurationやconfigの設定値を出力します。
作成の経緯
最近、GCPで複数のプロジェクトを利用しています。 それぞれのプロジェクトの設定をconfiguration(*1)という単位にまとめて管理すると便利です。
しかし、別の作業をしていてターミナルに戻ったときなど、「いまアクティブなconfigurationは何だっけ?」となってしまうことがありそうです。
もちろん、 gcloud config list
などのコマンドで確認できますが、プロンプトにアクティブなconfigurationやプロジェクト名、compute regionなどを表示できれば、より便利で、効率的で、安心できると思います。
このような用途のツールは、GitHubなどを検索すると既に色んな人が作っているようでしたが、自分に合う良い物が見つけられなかったので、自作することにしました。
デモ
デモ解説:
- gcloud-prompt.sh に実装している
toggle_gcloud_prompt
関数を使って、プロンプト表示のON/OFFを切り替えています。.zshrc
の precmd() の中でやっています。*2 - フィルタツールのpecoを使って
gcloud config configurations list
の結果からconfigurationsを選んで切り替える関数を作って使っています。bindkey
でキーCtrl-U + G
を割り当てています。- この辺りのやり方が気になる人は私のdotfilesを見てください。
- Cloud SDKの仕様で、環境変数
CLOUDSDK_ACTIVE_CONFIG_NAME
を設定することでアクティブなconfigurationを上書き設定できます。- ここでは direnv を使って、
~/tmp/gcloud-prompt-demo
に移動したときに.envrc
の内容をシェルに反映しています。
- ここでは direnv を使って、
GCLOUD_PROMPT_CONFIG_KEYS=(core.project compute.region)
のように、表示したいconfigのキーを配列で設定できるようにしました。- 「configurationだけ表示したい」という人は
GCLOUD_PROMPT_SHOW_CONFIG_PARAMS=no
と設定しておくと良いです。
以上です。
gcloud-promptのREADMEにはもう少しだけ情報がありますが、主な機能は上で解説できたと思います。
このスクリプトでは、色を付けたりするオプションは敢えて用意していません。
その辺は利用者側のお好みでどうぞということにしています。
デモでプロンプトに表示している絵文字も .zshrc 側で書いています。
実装の解説めいた注意事項
作り始めたばかりのときには、愚直に gcloud config
コマンドを毎回実行するようにしてみましたが、すぐに遅すぎてまともに作業できないと気づきました。
ので、実行結果をファイルにキャッシュするようにしています。
キャッシュを破棄するかどうかや、アクティブなconfigurationの判定には ~/.config/gcloud/active_config
や ~/.config/gcloud/configurations/config_*
といったファイルを参照しているので、もしその辺りのCloud SDKの仕様が変わったら、このスクリプトも追従する必要があるでしょう。
おまけ: kubectlのcontext/namespaceと併せて表示
私はKubernetesを使う機会も多いので、superbrothers/zsh-kubectl-promptを一緒に使って、kubectlのcontext/namespaceも同時に表示できるようにしています。*3
下は、そちらとgcloud-promptを併用したときのターミナル操作のキャプチャ動画です。
解説:
- kubectlのcontext/namespaceの切替についても、pecoを利用する関数を定義しています。それぞれ
Ctrl-U + X
とCtrl-U + N
を割り当てています。
終わりに
お気に召したら、どうぞご利用ください。
参考
- 作ったばかりのときに書いたメモ ... 類似ツールや、実装時のメモを記しています。
脚注
*1:参考: SDK 構成の管理 | Cloud SDK のドキュメント | Google Cloud
*2:後述のkubectlのプロンプト対応や、Oh My Zshのテーマを使っているので、現在の私の.zshrcはややこしいですが、抜粋するとこの辺りのコードが該当します。
*3:Bashではjonmosco/kube-ps1を使っています。