Linuxのプロンプトに現在のGitのbranch名やk8sのコンテキスト・ネームスペースを表示してみる

# 0.はじめに

最近個人や現場でも、Linuxを用いたGitの開発と、k8sによるクラスタ管理を行うことが増えてきました。
現場で実際にあったミスですが、対象のコンテキストを間違えてデプロイしてしまってアプリが止まるといったこともあり、プロンプトに情報を表示するに越したことはないと思い、個人の備忘として記載しておきます。

Gitのプロンプト表示、k8sのプロンプト表示をそれぞれ解説し、その複合版も記載しますが先に結論は記載しておきます。
# TL;DR
ユーザの`~/.bashrc`に以下を記載

```bash
# Git ブランチ名を取得する関数
function parse_git_branch() {
  branch=$(git branch 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
  if [ -z "$branch" ]; then
    echo "N/A"  # ブランチが無ければ "N/A" を表示
  else
    echo "$branch"  # ブランチがあればそのまま表示
  fi
}

# リポジトリ名取得関数
function parse_git_repos() {
  # Gitリポジトリかどうかを確認
  if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then
    # Gitリポジトリの場合、リモートURLを取得しリポジトリ名を表示
    repos=$(basename -s .git "$(git remote get-url origin)")
    echo "$repos"  # リモートリポジトリ名を表示
  else
    echo "N/A"  # Gitリポジトリでない場合
  fi
}

# 色設定
RED="\[\033[01;31m\]"
YELLOW="\[\033[01;33m\]"
GREEN="\[\033[01;32m\]"
BLUE="\[\033[01;34m\]"
WHITE="\[\033[01;37m\]"
CYAN="\[\033[01;36m\]"
BOLD="\[\033[1m\]"
NO_COLOR="\[\033[00m\]"

# kube-ps1 の読み込み
source "/work/kube-ps/kube-ps1.sh"

# kube-ps1 のオプション設定
export KUBE_PS1_SYMBOL_ENABLE=false

# PS1 の統合
PS1="$GREEN\u@\h$WHITE:$BLUE\w $YELLOW($NO_COLOR$RED\$(parse_git_branch)$YELLOW) $NO_COLOR$BOLD\$(kube_ps1)$WHITE\$ $NO_COLOR"
#お試し版
#PS1="$CYAN\u$GREEN@\h$WHITE:$BLUE\w $YELLOW($BLUE🔧$YELLOW|$RED\$(parse_git_branch)$YELLOW) $BOLD\$(kube_ps1)$WHITE\$$NO_COLOR "
#PS1="$CYAN\u$GREEN@\h$WHITE:$BLUE\w $YELLOW($RED\$(parse_git_repos)$YELLOW:$CYAN\$(parse_git_branch)$YELLOW) $BOLD\$(kube_ps1)$WHITE\$$NO_COLOR "
```

## Gitのbranchがある時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/48604214-32cb-25d8-c7ff-a99a698b9001.png)

## Gitのbranchがない時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/3696b965-6fba-766d-96fa-2feb3aa29abe.png)

## k8sのネームスペース切替
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/fe8f6078-f635-c310-992b-3ff754b4586a.png)

# 1.Gitのプロンプト表示
主に[こちら][gitlink1]や[こちら][gitlink2]のサイトを大いに参考(ほぼ丸パクリ)させて頂きました。
やっていること非常にシンプルで、`git branch`の結果を`PS1`変数に返しているだけです。

## 1-1.Gitのbranch名表示
以下の設定内容を`~/.bashrc`に記載し、`source ~/.bashrc_`で読み込みます。
色や表示内容はかなり好みによると思いますので、色々変えてみてください。

```bash
function parse_git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
 
RED="\[\033[01;31m\]"
YELLOW="\[\033[01;33m\]"
GREEN="\[\033[01;32m\]"
BLUE="\[\033[01;34m\]"
NO_COLOR="\[\033[00m\]"
PS1="$GREEN\u@\h$NO_COLOR:$BLUE\w $RED\$(parse_git_branch)$NO_COLOR\$ "
```

Gitのbranchがあるディレクトリに移動すると、以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/29b47cae-0e7b-b456-9508-84ed1306aa45.png)

当然branchの切替を行うと、以下のように変更も反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/6a09d8a9-b447-0e9e-5ddc-5cd76a191a52.png)

# 2.k8sのコンテキスト・ネームスペースのプロンプト表示
[こちらのGit][k8slink2]にインストール手順などが記載されています。
まずは単純に資材をcloneします。今回は`/work/kube-ps`にcloneしています。

```bash:
root@k8s-master-node01:~ $ git clone https://github.com/jonmosco/kube-ps1.git /work/kube-ps
Cloning into '/work/kube-ps'...
remote: Enumerating objects: 760, done.
remote: Counting objects: 100% (195/195), done.
remote: Compressing objects: 100% (108/108), done.
remote: Total 760 (delta 107), reused 165 (delta 83), pack-reused 565 (from 1)
Receiving objects: 100% (760/760), 7.72 MiB | 13.94 MiB/s, done.
Resolving deltas: 100% (401/401), done.
```

次に、手順に記載の通り`~/.bashrc`に以下のように追記します。
```bash:
source /work/kube-ps/kube-ps1.sh
PS1='[\u@\h \W $(kube_ps1)]\$ '
```

`source ~/.bashrc_`で読み込むと以下のように現在のコンテキストやネームスペースが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/261d772d-3afb-8206-60b9-9e2a514b150a.png)

# 3.Gitもk8sもどっちも表示する
解説も兼ねていたので、Gitとk8sそれぞれの表示方法を記載しました。
ただ、タイトルにもある通りどっちも見たいので、`PS1`変数に対していい感じにマージした物が冒頭の物になります。
上記で紹介した個別の物とマージ版で少し内容が変わっています。

- branchが無い時は`(N/A)`と返却するように変更
- `KUBE_PS1_SYMBOL_ENABLE`変数を`false`に設定(`⎈`マークが非表示になる)

# 4.最後に
プロンプトに何を表示させるかは個人の好み、現場の方針などでだいぶ変わると思いますが、これで瞬時に判別できるようになるのでオペミスが減る…のでは…。


## 参考サイト

・Git ブランチ名を Bash プロンプトに表示する方法とカラーコーディング
https://qiita.com/c8h9no2/items/f54b1f2c43892d4b6310

・プロンプトをカスタマイズしてgitブランチを表示する
https://qiita.com/caad1229/items/6d71d84933c8a87af0c4

・kube-ps1
https://github.com/jonmosco/kube-ps1

[gitlink1]: https://qiita.com/c8h9no2/items/f54b1f2c43892d4b6310
[gitlink2]: https://qiita.com/caad1229/items/6d71d84933c8a87af0c4
[k8slink2]: https://github.com/jonmosco/kube-ps1