Be an Engineer.

社会人からWEBエンジニアになった人間の備忘録的勉強記録

zshのpromptにアクティブなgcloud configrationを表示する

小ネタ的なポストです。

仕事なりプライベートでGCPを使っていると、ターミナルからgcloudコマンドラインツール(以後「gcloudツール」)を使うことにもなろうかと思います。そしてGCPで複数のプロジェクトがあり、それぞれのプロジェクトのリソースに対してgcloudツールから操作する場合、複数の「configration」を設定して操作するプロジェクトに応じて対応するconfigrationをactivateしていることかと思います。

https://cloud.google.com/sdk/docs/configurations

ちなみに私はこのconfigrationの切り替えはpecoで行っています。
chgcp と叩いたらconfigrationのリストがpecoで表示され、選択するとそのconfigrationがactivateされるという動きです。

github.com

たったこの4行ぽっちですがはちゃめちゃに便利で効果的に感じていて、これが無いと「ええいgcloudツールを使わないといけないGCPなんて使ってられるかーっ!」と荒々しく叫んでしまいそうです。

便利にしたい欲は絶えない

こうしてアクティブなconfigrationを変更することはカンタンにできるようにしたわけですが、今度はアクティブなconfigrationを確認するのが面倒という気持ちが芽生え始めました。
これは面倒という問題だけでなく、間違ったconfigrationをアクティブにしていたことによりオペミスが発生してしまう可能性が存在する問題です。

そして手っ取り早く「zshのpromptに常に現在アクティブなconfigration名を表示する」という方法でカンタンに確認できるようにしました。実装としては以下のような形です。

load_current_gcp_config() {
  local config_path="$HOME/.config/gcloud/active_config"
  if [ -f $config_path ]; then
    GCP_PROFILE=$(cat $config_path)
  fi
}

precmd() {
    psvar=()
    load_current_gcp_config
    psvar[1]=$GCP_PROFILE
}

local p_gcp="[gcp:%1v]"

# 例えば右寄せで表示する
RPROMPT="$p_gcp"
# どこに表示するかは `$p_gcp` を `PROMPT` や `RPROMPT` 変数の差し込む場所で調整できる

実際に使っている筆者の設定はこんな感じです。
https://github.com/shirakiya/dotfiles/blob/master/zshrc#L168-L192

少し解説すると、

load_current_gcp_config で現在アクティブなconfigrationを読み取っています。*1 そしてその load_current_gcp_configprecmd という関数から呼び、configration名が入った GCP_PROFILEpsvar 配列に格納しています。

ここでミソなのが以下のポイントです。

  • precmd : prompt表示前にフックされる関数
  • psvar : prompt表示時に使える配列。 psvar[x] の x にはintegerを与え、PROMPT側では %xv で値を取り出せる

ref. https://zsh.sourceforge.io/Doc/Release/Prompt-Expansion.html#Prompt-Expansion

こんな感じになった

これでpromptに常にアクティブなconfigration名が表示されるようになったので、事故を未然に防げて便利になりました。

configration名を表示したターミナルの様子

*1:もしgcloudツールの仕様変更でファイルパスが変わったりファイル名が変わったりするとこのコードは動かなくなる