1.この記事で達成したいこと

  • asdfとそのプラグインを設定する方法が頭の中でごちゃごちゃしていた。たとえば、、。
    • asdf plugin-addとasdf installはどっちからコマンド実行するの?
    • 既にプラグインはをインストールしているか?確認するのはどうやるの?
  • そこで実際に以下のasdfのプラグインを使いながら、その設定方法を理解したい

2.はじめに

  • そもそもasdfとはなにか?という説明は公式ドキュメントに譲りたいが、ひとことでいえば バージョン管理ツール である
    • バージョン管理の類似ツールを挙げるとすれば、pythonのvirtualenvはそのひとつであろう。相違点はバージョン管理の対象がひとつだけか複数か。(virtualenvの場合はpythonのみのひとつだけ。)
  • asdfでバージョンを管理するためには、asdf自体のインストールすることに加えて、バージョン管理したいツールに対応したプラグインもインストールする必要 がある

3.環境情報

$ grep VERSION= /etc/os-release 
VERSION="20.04.3 LTS (Focal Fossa)"

$ asdf --version
v0.10.0-0f99d0a

4.asdf自体のインストール

  • asdfのドキュメントに従って進めればよいが、そのインストール方法はいくつかある
  • 今回採用した方法はasdfのリポジトリのブランチを指定してクローンするという方法
    • 指定したリリースブランチは、release-v0.10.0
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch release-v0.10.0
$ tail ~/.bashrc

. $HOME/.asdf/asdf.sh
. $HOME/.asdf/completions/asdf.bash

これでasdfのインストールは終わった。いよいよプラグインのインストールに移るが、ややこしく感じたので大まかな流れをおさえておきたい。

5.バージョン管理したいプラグインのインストールと設定の大まかな流れ

  • 必要になったプラグインあるいはそのバージョンが既にあるか確認
$ asdf plugin list | grep <プラグイン>
  • プラグインがなければ追加
$ asdf plugin-add <プラグイン> <リポジトリ>
  • 任意のバージョンをインストール
$ asdf install <プラグイン> <バージョン>
  • asdf global/localで導入
$ asdf local <プラグイン> <バージョン>
  • 導入したプラグインとそのバージョンが書かれていることを確認
$ asdf current
$ cat .tool-versions
  • (不要なバージョンはuninstall)
$ asdf uninstall <プラグイン> <バージョン>

参考:https://asdf-vm.com/guide/getting-started.html#install-the-plugin

それでは実際にkubectlプラグインをインストールしてみよう。


6.kubectlの場合

  • 必要になったプラグインあるいはそのバージョンが既にあるか確認
## プラグインがある場合。ないと表示されない。
$ asdf plugin list | grep kubectl
kubectl
$ asdf plugin-add kubectl https://github.com/asdf-community/asdf-kubectl.git
  • 任意のバージョンをインストール
## 1.23.0をインストール
$ asdf install kubectl 1.23.0

## インストールできるバージョンを探すにはasdf list all <プラグイン>
$ asdf list all kubectl | tail
1.23.0-rc.1
1.23.0-alpha.2
1.23.0-alpha.3
1.23.0-alpha.4
1.23.0
1.23.1-rc.0
1.23.1
1.23.2-rc.0
1.24.0-alpha.0
1.24.0-alpha.1

## alpha版などは除外して探すときの一例
$ asdf list all kubectl | grep -Ev "alpha|beta|rc" | tail -5
1.22.3
1.22.4
1.22.5
1.23.0
1.23.1
  • global/localで導入
$ asdf local kubectl 1.23.0
  • 導入したプラグインとそのバージョンが書かれていることを確認
$ asdf current
kubectl 1.23.0  /path/to/.tool-versions
$ grep kubectl .tool-versions
kubectl 1.23.0

## globalで導入した場合
$ asdf install kubectl 1.22.0
$ asdf global kubectl 1.22.0
$ asdf current
kubectl 1.22.0  $HOME/.tool-versions
$ grep kubectl ~/.tool-versions
kubectl 1.22.0

※asdf global/local <プラグイン> <バージョン>を実行すると.tool-versionsに適用したプラグインとそのバージョンが記載される。globalを使うと$HOME/.tool-versionsに、localを使うとカレントディレクトリ直下に.tool-versionsに それぞれ適用したプラグインとそのバージョンが記載される。

※また、asdf list < プラグイン>ではインストールしているプラグインのバージョンを列挙する。globalあるいはlocalで適用しているかどうか問わず。

$ asdf list kubectl
  1.22.0         <-- globalで適用
  1.23.0         <-- localで適用
  1.24.0-alpha.1 <-- asdf installでインストールしただけ
  • 任意のバージョンをアンインストール
$ asdf uninstall kubectl 1.22.0

## ただし、アンインストールしたプラグインのバージョンが書かれた.tool-versionsは残ったまま
$ cat ~/.tool-versions
kubectl 1.22.0


## なお、.tool-versionsに適用したいプラグインのバージョンが書かれている場合、バージョンを指定しなくてもインストールできた
$ asdf install kubectl

最後にバージョンを切り替えてみよう。

7.プラグインはインストールしているけど異なるバージョンに切り替える(kubectlの場合)

  • 既に1.23.0を導入しているけど1.24.0-alpha.1に切り替える
$ kubectl version --client | cut -b 1-70
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.
$ grep kubectl .tool-versions 
kubectl 1.23.0
$ asdf list all kubectl | tail -n 5
1.23.1-rc.0
1.23.1
1.23.2-rc.0
1.24.0-alpha.0
1.24.0-alpha.1 <-- コレに切り替える
  • 切り替え先の1.24.0-alpha.1をインストールしてlocalで適用
$ asdf install kubectl 1.24.0-alpha.1

## localで適用する前
$ grep kubectl .tool-versions
kubectl 1.23.0

## localで適用
$ asdf local kubectl 1.24.0-alpha.1

## localで適用した後
$ grep kubectl .tool-versions 
kubectl 1.24.0-alpha.1
  • また以前のバージョン(1.23.0)に戻す
$ asdf list kubectl
  1.23.0 <-- コレに戻す
  1.24.0-alpha.1 <-- 今使っている

# 1.23.0に戻す
$ asdf local kubectl 1.23.0
$ grep kubectl .tool-versions 
kubectl 1.23.0
  • すでにインストールしたバージョンをインストールしようとするとどうなるか?
    • already installed と教えてくれる。特に影響はないかんじ。
$ asdf install kubectl 1.23.0
kubectl 1.23.0 is already installed

8.[おまけ]Bashにおけるkubectlの補完スクリプトbash-completionはBash 4.1以上が必要[macOSユーザーは特に注意]

※asdf経由でkubectlをインストールしている場合でもkubectlの補完スクリプトは使える。ただし、BASHのバージョンが4.1以上でないと使えない点に注意。

  • bash-completionにはv1とv2のバージョンがあり、v1はBash 3.2(macOSのデフォルト)用で、v2はBash 4.1以降向けです。kubectlの補完スクリプトはbash-completionのv1とBash 3.2では正しく動作しません。bash-completion v2およびBash 4.1が必要になります。


2022/05/10 更新

以下のように LTSバージョンをインストールすることもできる。(lts が alias として扱われているみたい)

$ asdf install nodejs lts
Installing alias lts as 16.15.0
Trying to update node-build... ok

略

Linking "lts" to "16.15.0"

参考: