フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

asdfによるバージョン管理が楽すぎるのでみんな使おう

チーム開発などをしているとさまざまなツールを使うことがあると思います。

それらのバージョンをきちんと合わせていないとうまく環境が構築できず四苦八苦する経験が皆さんあるんじゃないでしょうか?

asdfというツールを使うと以下のことができるようになります

  • ディレクトリレベルでのツールのバージョン管理
  • asdfを利用したパッケージインストール手順の共通化
    • 厳密にいうとasdfはパッケージバージョン管理ツールで、実際のインストール自体は既存のbrewとかnpmなどが存在しています

インストール方法は公式サイトを見てください。

Home | asdf

ここではあくまでどれだけ便利なのか?について紹介します。 こんなディレクトリを用意します。

$ pwd
/tmp/test

$ ls
test1   test2

Kubernetesを操作するkubectlを複数のバージョンで使用したいものとします。

まずはasdfにて管理できるバージョンの一覧を見てみましょう。

$ asdf list-all kubectl
1.15.12
1.16.9
1.16.10
1.16.11
1.16.12-rc.1
1.16.12
1.16.13
1.16.14
1.16.15
1.17.5
1.17.6
1.17.7
1.17.8-rc.1
1.17.8
1.17.9
1.17.11
1.17.12
1.17.13
1.17.14
1.17.15
1.17.16
1.17.17
1.18.0
1.18.1
1.18.2
1.18.3
1.18.4
1.18.5-rc.1
1.18.5
1.18.6
1.18.8
1.18.9
1.18.10
1.18.12
1.18.13
1.18.14
1.18.15
1.18.16
1.18.17
1.18.18
1.18.19
1.18.20
1.19.0-beta.0
1.19.0-alpha.1
1.19.0-beta.1
1.19.0-rc.1
1.19.0-alpha.2
1.19.0-beta.2
1.19.0-rc.2
1.19.0-alpha.3
1.19.0-rc.3
1.19.0-rc.4
1.19.0
1.19.1
1.19.2
1.19.3
1.19.4
1.19.5
1.19.6
1.19.7
1.19.8
1.19.9
1.19.10
1.19.11
1.19.12
1.19.13
1.20.0-beta.0
1.20.0-rc.0
1.20.0-alpha.1
1.20.0-beta.1
1.20.0-alpha.2
1.20.0-beta.2
1.20.0-alpha.3
1.20.0
1.20.1
1.20.2
1.20.3
1.20.4
1.20.5
1.20.6
1.20.7
1.20.8
1.20.9
1.21.0-beta.0
1.21.0-rc.0
1.21.0-alpha.1
1.21.0-beta.1
1.21.0-alpha.2
1.21.0-alpha.3
1.21.0
1.21.1
1.21.2
1.21.3
1.22.0-beta.0
1.22.0-rc.0
1.22.0-alpha.1
1.22.0-beta.1
1.22.0-alpha.2
1.22.0-beta.2
1.22.0-alpha.3

結構ありますね。じゃあ実際にインストールしてみましょう。

$ asdf install kubectl 1.21.0
$ asdf local kubectl 1.21.0
$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:31:21Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"darwin/arm64"}

インストールをすると実はローカルにこんなファイルが作成されています。

$ cat .tool-versions
kubectl 1.21.0

このファイルによってどのバージョンを使用するかが変化します。


ではディレクトリを移動してみます。

$ cd ../test2
$ kubectl version --client
No version set for command kubectl
Consider adding one of the following versions in your config file at
kubectl 1.21.0

するとエラーが出ます。これはこのローカルでは使用すべきkubectlのバージョンが指定されていないせいです。では、ここでは違うバージョンのものを使ってみましょう。

$ asdf install kubectl 1.22.0-beta.2
Downloading kubectl from https://storage.googleapis.com/kubernetes-release/release/v1.22.0-beta.2/bin/darwin/arm64/kubectl
$ asdf local kubectl 1.22.0-beta.2
$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"22+", GitVersion:"v1.22.0-beta.2", GitCommit:"68922e3deb4696f4c0268ee68e03c816acd4feec", GitTreeState:"clean", BuildDate:"2021-07-14T21:47:57Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"darwin/arm64"}

はい。このように全く違うバージョンのものを指定できました。.tool-versioinsもこのようになっていますね。

$ cat .tool-versions
kubectl 1.22.0-beta.2

ちなみにこのままだとtest1やtest2以外の場所だとkubectlが実行できないので、asdf global kubectl x.x.xのようにして$HOME/.tool-versionsを作成する必要があります。