helm
コマンドはクライアント側とサーバー側のバージョンが異なると上手く動かないことがあります。特にIBM Cloud Privateはv3.1.2でもhelm
のバージョンがv2.9.1と古いです。kubectl
はhelm
に比べ寛容なのであまり困らないですが、サーバーとクライアントでバージョンが一致していた方が望ましいと思います。
kubectl
やhelm
のバージョンを簡単に切り替えるよいツールがあったら教えて欲しいのですが、適当に探した限りみつからなかったので、適当なシェルスクリプトでシンボリックリンクで切り替えることにしました。環境はMacです。他によいやり方があったら教えて下さい。
使い方
各バージョンのバイナリをダウンロードして/usr/local/bin
に置いておきます。
$ ls -l /usr/local/bin/helm*
lrwxr-xr-x 1 sotoiwa admin 39 5 8 13:32 /usr/local/bin/helm -> /usr/local/bin/helm-v2.9.1-darwin-amd64
-rwxr-xr-x@ 1 sotoiwa staff 41593416 1 23 06:29 /usr/local/bin/helm-v2.12.3-darwin-amd64
-rwxr-xr-x 1 sotoiwa admin 34396224 5 15 2018 /usr/local/bin/helm-v2.9.1-darwin-amd64
$
スクリプト(後述)を実行します。
$ switch-helm.sh
Current helm version:
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Available helm version:
/usr/local/bin/helm-v2.12.3-darwin-amd64
/usr/local/bin/helm-v2.9.1-darwin-amd64
/usr/local/bin/helm-v2.12.3-darwin-amd64 <- use this version? (y/n/a):n
Skip!
/usr/local/bin/helm-v2.9.1-darwin-amd64 <- use this version? (y/n/a):y
helm version changed!
Current helm version:
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Done!
$
スクリプト
シンボリックリンクを張り替えるだけのスクリプトです。COMMAND
変数を変えればkubectl
でも同じことができると思います。
swicth-helm.sh
#/bin/bash
set -eu
COMMAND=helm
# コマンドがシンボリックリンクではない場合は終了
if [ ! -L /usr/local/bin/${COMMAND} ]; then
echo ${COMMAND} is not symbolic link
exit 1
fi
# 現在のバージョンを表示
echo "Current ${COMMAND} version:"
/usr/local/bin/${COMMAND} version --client
echo ""
# 利用可能なバージョンを表示
echo "Available ${COMMAND} version:"
find -f /usr/local/bin/${COMMAND}* -type f
echo ""
# シンボリックリンクではないファイルについて繰り返し
for v_command in $(find -f /usr/local/bin/${COMMAND}* -type f)
do
while true
do
read -p "${v_command} <- use this version? (y/n/a):" yn
case $yn in
[yY]*)
rm -f /usr/local/bin/${COMMAND}
ln -s ${v_command} /usr/local/bin/${COMMAND}
echo "${COMMAND} version changed!"
echo ""
echo "Current ${COMMAND} version:"
/usr/local/bin/${COMMAND} version --client
echo ""; echo "Done!"; exit ;;
[nN]*)
echo "Skip!"; echo ""; break ;;
[aA]*)
echo "Abort!"; echo ""; exit ;;
esac
done
done
echo "Done!"
本当は最初に一覧を表示して数字とかで選ぶようにしたかったのですが、そのように作るやり方がすぐにわからなかったのでぐるぐる回すようにしました。