Skip to main content

Versionador de tool (ASDF)

Muitas vezes precisamos utilizar diferentes versões do terraform, kubectl, vagrant, etc. o que poderíamos fazer para ter vários binários com diferentes versões disponíveis?

Vamos pegar o binário do terraform como exemplo. Podemos ter vários binários do terraform.

  • terraform-1.2
  • terraform-1.3
  • terraform-1.4
  • ....

Podemos criar um link simbólico terraform que irá apontar para algum deles. Porém temos que ficar alterando para onde o link simbólico aponta.

A maneira mais interessante que encontrei para resolver esse problema foi utilizando um versionador de ferramentas.

O asdf faz isso facilmente e nos permite muitas outras facilidades.

Para instalar o terraform ou o kubectl, seja lá qual for o binário, precisamos adicionar o repositório, adicionar a chave do repositório, fazer um update no gerenciador de pacote, e depois instalar.

Toda vez que precisamos instalar alguma tool temos que ir na documentação da mesma e seguir o processo. Um pé no saco...

O asdf instala tudo pra você, na versão que você quiser e com direito a ficar trocando de versão sem muito esforço.

Ainda é possível definir a versão por projeto e muito mais. Vamos conferir.

Instalação

os requisitos são somente o git e curl.

Como a instalação do asdf é muito bem documentada não vale a pena reinventando a roda.

Basicamente é fazer o clone do projeto, configurar no path do sistema e habilitar o completion para melhorar a interação com a cli.

git clone https://github.com/asdf-vm/asdf.git ~/.asdf

É só seguir a documentação para o seu tipo de ambiente.

Com tudo pronto podemos conferir um pouco da ferramenta.

# completion funcionando
❯ asdf <tab>
current -- display current versions for named package (else all)
env -- prints or runs an executable under a command environment
exec -- executes the command shim for the current version
global -- set package global version
info -- print os, shell and asdf debug information
install -- install plugin at stated version, or all from .tools-versions
latest -- display latest version available to install for a named package
list -- list installed versions of a package
list-all -- list all available (remote) versions of a package
local -- set package local version
plugin -- plugin management sub-commands
plugin-add -- add plugin from asdf-plugins repo or from git URL
plugin-list -- list installed plugins (--urls with URLs)
plugin-list-all -- list all plugins registered in asdf-plugins repo
plugin-remove -- remove named plugin and all packages for it
plugin-update -- update named plugin (or --all)
reshim -- recreate shims for version of a package
shell -- via env vars, set package to version in current shell
shim -- shim management sub-commands
shim-versions -- list for given command which plugins and versions provide it
uninstall -- remove a specific version of a package
update -- update ASDF to the latest stable release (unless --head)
where -- display install path for given package at optional specified version
which -- display path to an executable

❯ asdf version
v0.14.0

Plugins

Cada plugin é responsável por algum projeto, geralmente runtimes e tools.

Para ter uma ideia do que temos disponível, execute o comando abaixo.

> asdf plugin-list-all

❯ asdf plugin-list-all
updating plugin repository...HEAD is now at 8e311ee feat: add dynatrace-monaco plugin (#951)
...
# A lista é enorme

Vamos instalar então o terraform.

❯ asdf plugin-add terraform
Plugin named terraform added

# Instalando a ultima versão
# nem todos tem a latest os projetos possuem a tag latest, a grande maioria sim. As vezes é necessário passar a verão específica.
❯ asdf install terraform latest

# Vamos ver o que temos usando um completion depois do terraform

❯ asdf install terraform <tab>
0.1.0 0.11.8 0.12.29 0.14.2 0.5.0 0.7.8 1.0.7 1.2.1 1.4.0-rc1 1.6.3
0.1.1 0.11.9 0.12.3 0.14.3 0.5.1 0.7.9 1.0.8 1.2.2 1.4.1 1.6.4
0.10.0 0.11.9-beta1 0.12.30 0.14.4 0.5.3 0.8.0 1.0.9 1.2.3 1.4.2 1.6.5
0.10.0-beta1 0.12.0 0.12.31 0.14.5 0.6.0 0.8.1 1.1.0 1.2.4 1.4.3 1.6.6
0.10.0-beta2 0.12.0-alpha1 0.12.4 0.14.6 0.6.1 0.8.2 1.1.0-alpha20210616 1.2.5 1.4.4 1.7.0
0.10.0-rc1 0.12.0-alpha2 0.12.5 0.14.7 0.6.10 0.8.3 1.1.0-alpha20210630 1.2.6 1.4.5 1.7.0-alpha20231025
0.10.1 0.12.0-alpha3 0.12.6 0.14.8 0.6.11 0.8.4 1.1.0-alpha20210714 1.2.7 1.4.6 1.7.0-alpha20231108
0.10.2 0.12.0-alpha4 0.12.7 0.14.9 0.6.12 0.8.5 1.1.0-alpha20210728 1.2.8 1.4.7 1.7.0-alpha20231130
0.10.3 0.12.0-beta1 0.12.8 0.15.0 0.6.13 0.8.6 1.1.0-alpha20210811 1.2.9 1.5.0 1.7.0-beta1
0.10.4 0.12.0-beta2 0.12.9 0.15.0-alpha20210107 0.6.14 0.8.7 1.1.0-alpha20210908 1.3.0 1.5.0-alpha20230405 1.7.0-beta2
0.10.5 0.12.0-rc1 0.13.0 0.15.0-alpha20210127 0.6.15 0.8.8 1.1.0-alpha20210922 1.3.0-alpha20220608 1.5.0-alpha20230504 1.7.0-rc1
0.10.6 0.12.1 0.13.0-beta1 0.15.0-alpha20210210 0.6.16 0.9.0 1.1.0-alpha20211006 1.3.0-alpha20220622 1.5.0-beta1 1.7.0-rc2
0.10.7 0.12.10 0.13.0-beta2 0.15.0-beta1 0.6.2 0.9.1 1.1.0-alpha20211020 1.3.0-alpha20220706 1.5.0-beta2 1.7.1
0.10.8 0.12.11 0.13.0-beta3 0.15.0-beta2 0.6.3 0.9.10 1.1.0-alpha20211029 1.3.0-alpha20220803 1.5.0-rc1 1.7.2
0.11.0 0.12.12 0.13.0-rc1 0.15.0-rc1 0.6.4 0.9.11 1.1.0-beta1 1.3.0-alpha20220817 1.5.0-rc2 1.7.3
0.11.0-beta1 0.12.13 0.13.1 0.15.0-rc2 0.6.5 0.9.2 1.1.0-beta2 1.3.0-beta1 1.5.1 1.7.4
0.11.0-rc1 0.12.14 0.13.2 0.15.1 0.6.6 0.9.3 1.1.0-rc1 1.3.0-rc1 1.5.2 1.7.5
0.11.1 0.12.15 0.13.3 0.15.2 0.6.7 0.9.4 1.1.1 1.3.1 1.5.3 1.8.0
0.11.10 0.12.16 0.13.4 0.15.3 0.6.8 0.9.5 1.1.2 1.3.10 1.5.4 1.8.0-alpha20240131
0.11.11 0.12.17 0.13.5 0.15.4 0.6.9 0.9.6 1.1.3 1.3.2 1.5.5 1.8.0-alpha20240214
0.11.12 0.12.18 0.13.6 0.15.5 0.7.0 0.9.7 1.1.4 1.3.3 1.5.6 1.8.0-alpha20240216
0.11.12-beta1 0.12.19 0.13.7 0.2.0 0.7.1 0.9.8 1.1.5 1.3.4 1.5.7 1.8.0-alpha20240228
0.11.13 0.12.2 0.14.0 0.2.1 0.7.10 0.9.9 1.1.6 1.3.5 1.6.0 1.8.0-beta1
0.11.14 0.12.20 0.14.0-alpha20200910 0.2.2 0.7.11 1.0.0 1.1.7 1.3.6 1.6.0-alpha20230719 1.8.0-rc1
0.11.15 0.12.21 0.14.0-alpha20200923 0.3.0 0.7.12 1.0.1 1.1.8 1.3.7 1.6.0-alpha20230802 1.8.0-rc2
0.11.15-oci 0.12.22 0.14.0-alpha20201007 0.3.1 0.7.13 1.0.10 1.1.9 1.3.8 1.6.0-alpha20230816 1.8.1
0.11.2 0.12.23 0.14.0-beta1 0.3.5 0.7.2 1.0.11 1.2.0 1.3.9 1.6.0-beta1 1.9.0-alpha20240404
0.11.3 0.12.24 0.14.0-beta2 0.3.6 0.7.3 1.0.2 1.2.0-alpha-20220328 1.4.0 1.6.0-beta2 latest
0.11.4 0.12.25 0.14.0-rc1 0.3.7 0.7.4 1.0.3 1.2.0-alpha20220413 1.4.0-alpha20221109 1.6.0-beta3 latest:
0.11.5 0.12.26 0.14.1 0.4.0 0.7.5 1.0.4 1.2.0-beta1 1.4.0-alpha20221207 1.6.0-rc1
0.11.6 0.12.27 0.14.10 0.4.1 0.7.6 1.0.5 1.2.0-rc1 1.4.0-beta1 1.6.1
0.11.7 0.12.28 0.14.11 0.4.2 0.7.7 1.0.6 1.2.0-rc2 1.4.0-beta2 1.6.2

# Vamos instalar então a versão 1.7.5 como uma versão específica.
❯ asdf install terraform 1.7.5

# Ja temos duas versões do terraform, agora vamos setar uma delas para ser a global.

# usando o completion nos mostrará todas disponíveis que já estão instaladas.
❯ asdf global terraform <tab>
1.7.5 1.8.1 system

asdf global terraform 1.8.1

❯ terraform version
Terraform v1.8.1
on darwin_arm64

# Vamos mudar para versão 1.7.5
❯ asdf global terraform 1.7.5
❯ terraform version
Terraform v1.7.5
on darwin_arm64

Your version of Terraform is out of date! The latest version
is 1.8.1. You can update by downloading from https://www.terraform.io/downloads.html

Para conferir tudo que esta instalado no sistema entre plugins e versões podemos utilizar o comando list.

❯ asdf list  
terraform
*1.7.5
1.8.1
trivy
*0.50.1

Versão por projeto

Temos dois projetos, A e B e vamos colocar no arquivo .tools-versions a versão correta do que precisamos nesse projeto.

mkdir A B

echo "terraform 1.8.1" > A/.tools-versions
echo "terraform 1.7.5" > B/.tools-versions

Lembrando que já temos no nosso sistema as versões do terraform. Antes vamos conferir a versão do terraforma que esta definida como global.

❯ terraform version
Terraform v1.8.1
on darwin_arm64

Em A vamos testar a versão do terraform. Não precisaríamos disso, pois se não tem a versão global e não foi definida uma versão a global é a que prevalece.

cd A

❯ terraform version
Terraform v1.8.1
on darwin_arm64

# Igual a global como esperado

Em B agora...

cd B

❯ terraform version
Terraform v1.7.5
on darwin_arm64

Your version of Terraform is out of date! The latest version
is 1.8.1. You can update by downloading from https://www.terraform.io/downloads.html

Só agradeço quem aos mantenedores desse projeto que facilita demais a nossa vida!