gcloud でシェル毎にプロジェクトの切り替え設定

[gcloud でプロジェクトの切り替え設定](https://qiita.com/sonots/items/906798c408132e26b41c) に書いたように `gcloud config configurations activate` で設定を切り替える場合、`$HOME/.config/gcloud` 以下の設定が切り替えられるため、シェルを複数立ち上げても(ユーザー)グローバルに同じプロジェクトを指すことになる。

シェル毎に別のプロジェクトを指すことができるようにして、tmux のウィンドウ毎に別のプロジェクトに切り替えたい。

関連: [aws cliでシェル毎にデフォルトプロファイルの切り替え設定](https://qiita.com/sonots/items/5055c1d4a11d2c484c93)

# gcloud の切り替え

### CLOUDSDK_CONFIG

[gcloud でプロジェクトの切り替え設定](https://qiita.com/sonots/items/906798c408132e26b41c)の発展としては、`gcloud config configurations activate 設定名` と同様の効果をもたらす環境変数があると良いのだが、どうやらなさそう(あったら教えてください)。

そこで代わりに `CLOUDSDK_CONFIG` 環境変数で `$HOME/.config/gcloud` の場所を変えられるので、この環境変数をシェル毎に設定し直して切り替える戦略を取った。

### 切り替え設定スクリプト

こんな感じになった。

```zsh:.zshrc
export GX_CONFIG_DIR=$HOME/.gx-config
function gx-init() {
  name="$1" # alias
  if [ -z "$1" ]; then
    echo "gx-init <name> [project]"
    return 1
  fi
  if [ -z "$2" ]; then
    project="$name"
  else
    project="$2"
  fi
  gx-activate "${name}"
  gcloud config configurations create "${name}"
  gcloud config set project "${project}"
  gcloud auth login
}
function gx-activate() {
  name="$1"
  export CLOUDSDK_CONFIG="${GX_CONFIG_DIR}/${name}"
}
function gx-current() {
  echo ${CLOUDSDK_CONFIG##*/}
}
function gx-complete() {
  _values "gcloud-config" $(\ls "${GX_CONFIG_DIR}")
}
function gx() {
  name="$1"
  if [ -z "${name}" ]; then
    name=$(\ls "${GX_CONFIG_DIR}" | peco)
  fi
  gx-activate "${name}"
}
compdef gx-complete gx
```

使い方は、以下のコマンドでプロジェクトの初期化をして、

```
$ gx-init 設定名 プロジェクト名
```

あとは gx コマンドで切り替える

```
$ gx[TAB] で自動補完
$ gx[ENTER] でpecoによる絞り込み
```

gcloud に加えて [peco](https://github.com/peco/peco) も入れておく必要があります。

# GKE の切り替え

ついでに GKE のクラスタもシェル毎に切り替えられるようにした

### KUBECONFIG

`KUBECONFIG` 環境変数で `$HOME/.kube/config` の場所を変えられるので、この環境変数をシェル毎に設定しなおせば良い

### 切り替え設定スクリプト

```zsh:.zshrc
function gke-get-credentials() {
  cluster="$1"
  zone_or_region="$2"
  if echo "${zone_or_region}" | grep '[^-]*-[^-]*-[^-]*' > /dev/null; then
    echo "gcloud container clusters get-credentials \"${cluster}\" --zone=\"${zone_or_region}\""
    gcloud container clusters get-credentials "${cluster}" --zone="${zone_or_region}"
  else
    echo "gcloud container clusters get-credentials \"${cluster}\" --region=\"${zone_or_region}\""
    gcloud container clusters get-credentials "${cluster}" --region="${zone_or_region}"
  fi
}
function gcloud-current-project() {
  gcloud config get-value project 2>/dev/null
}

export GKX_CONFIG_DIR=$HOME/.gkx-config
function gkx-init() {
  name=$(gx-current)
  gcloud container clusters list | tail -n +2 |  while read line; do
    cluster=$(echo "${line}" | awk '{print $1}')
    zone_or_region=$(echo "${line}" | awk '{print $2}')
    gkx-activate "${name}" "${cluster}"
    gke-get-credentials "${cluster}" "${zone_or_region}"
  done
}
function gkx-activate-default() {
  name=$(gx-current)
  if [ -d "${GKX_CONFIG_DIR}/${name}" ]; then
    cluster=$(\ls "${GKX_CONFIG_DIR}/${name}" | head -n 1)
    export KUBECONFIG="${GKX_CONFIG_DIR}/${name}/${cluster}"
  else
    unset KUBECONFIG
  fi
}
function gkx-activate() {
  name="$1"
  cluster="$2"
  export KUBECONFIG="${GKX_CONFIG_DIR}/${name}/${cluster}"
}
function gkx-current() {
  echo ${KUBECONFIG##*/}
}
function gkx-complete() {
  name=$(gx-current)
  _values "gke-config" $(\ls "${GKX_CONFIG_DIR}/${name}")
}
function gkx() {
  cluster="$1"
  name=$(gx-current)
  if [ -z "${cluster}" ]; then
    cluster=$(\ls "${GKX_CONFIG_DIR}/${name}" | peco)
  fi
  gkx-activate "${name}" "${cluster}"
}
compdef gkx-complete gkx
```

使い方は、GCP project は選択されているとして、以下のコマンドで初期化して、

```
$ gkx-init
```

あとは gkx コマンドで切り替える

```
$ gkx[TAB] で自動補完
$ gkx[ENTER] でpecoによる絞り込み
```

# プロンプトに表示する

gx-current と gkx-current を `PROMPT` もしくは `RPROMPT` に良いように表示させてください

```zsh:.zshrc
PROMPT='あなたのいつもの設定($(gx-current)/$(gkx-current))$ '
```

とか

# ディレクトリに入ったら自動で切り替える

[direnv](https://github.com/direnv/direnv) を入れて、ディレクトリに .envrc ファイルをおいておく

```bash:.envrc
export CLOUDSDK_CONFIG=$GX_CONFIG_DIR/設定名
export KUBECONFIG=$GKX_CONFIG_DIR/設定名/クラスタ名
```

# Special Thanks

ポイントとなる環境変数については [tamtam180](https://twitter.com/tamtam180/status/1161657622338007045?s=21)さんに教えていただきました。