progrhyme's tech blog

主にIT関連の技術メモ

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 の利用イメージ

デモ解説:

  • 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 の内容をシェルに反映しています。
  • 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を併用したときのターミナル操作のキャプチャ動画です。

gcloud-promptとzsh-kubectl-promptを併用したイメージGIFアニメ

解説:

  • kubectlのcontext/namespaceの切替についても、pecoを利用する関数を定義しています。それぞれ Ctrl-U + XCtrl-U + N を割り当てています。

終わりに

お気に召したら、どうぞご利用ください。

参考

脚注

*1:参考: SDK 構成の管理 | Cloud SDK のドキュメント | Google Cloud

*2:後述のkubectlのプロンプト対応や、Oh My Zshのテーマを使っているので、現在の私の.zshrcはややこしいですが、抜粋するとこの辺りのコードが該当します。

*3:Bashではjonmosco/kube-ps1を使っています。