Gestor de Versiones de Herramientas (ASDF)
Muchas veces necesitamos utilizar diferentes versiones de terraform, kubectl, vagrant, etc. ¿qué podríamos hacer para tener varios binarios con diferentes versiones disponibles?
Tomemos el binario de terraform como ejemplo. Podemos tener varios binarios de terraform.
- terraform-1.2
- terraform-1.3
- terraform-1.4
- ....
Podemos crear un enlace simbólico terraform que apuntará a alguno de ellos. Pero tenemos que estar cambiando a dónde apunta el enlace simbólico.
La manera más interesante que encontré para resolver este problema fue utilizando un gestor de versiones de herramientas.
asdf hace esto fácilmente y nos permite muchas otras facilidades.
Para instalar terraform o kubectl, sea cual sea el binario, necesitamos agregar el repositorio, agregar la clave del repositorio, hacer un update en el gestor de paquetes, y después instalar.
Cada vez que necesitamos instalar alguna herramienta tenemos que ir a la documentación de la misma y seguir el proceso. Una molestia...
asdf instala todo para ti, en la versión que quieras y con derecho a cambiar de versión sin mucho esfuerzo.
Aún es posible definir la versión por proyecto y mucho más. Vamos a verlo.
Instalación
Los requisitos son solo git y curl.
Como la instalación de asdf está muy bien documentada no vale la pena reinventar la rueda.
Básicamente es hacer el clone del proyecto, configurar en el path del sistema y habilitar el completion para mejorar la interacción con la cli.
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
Solo sigue la documentación para tu tipo de entorno.
Con todo listo podemos verificar un poco de la herramienta.
# completion funcionando
❯ asdf <tab>
current -- mostrar versiones actuales para paquete nombrado (sino todos)
env -- imprime o ejecuta un ejecutable bajo un entorno de comando
exec -- ejecuta el shim de comando para la versión actual
global -- establecer versión global del paquete
info -- imprimir información de depuración de os, shell y asdf
install -- instalar plugin en versión declarada, o todos desde .tools-versions
latest -- mostrar última versión disponible para instalar para un paquete nombrado
list -- listar versiones instaladas de un paquete
list-all -- listar todas las versiones disponibles (remotas) de un paquete
local -- establecer versión local del paquete
plugin -- subcomandos de gestión de plugins
plugin-add -- agregar plugin desde repo asdf-plugins o desde URL git
plugin-list -- listar plugins instalados (--urls con URLs)
plugin-list-all -- listar todos los plugins registrados en repo asdf-plugins
plugin-remove -- remover plugin nombrado y todos los paquetes para él
plugin-update -- actualizar plugin nombrado (o --all)
reshim -- recrear shims para versión de un paquete
shell -- vía env vars, establecer paquete a versión en shell actual
shim -- subcomandos de gestión de shim
shim-versions -- listar para comando dado qué plugins y versiones lo proveen
uninstall -- remover una versión específica de un paquete
update -- actualizar ASDF a la última versión estable (a menos que --head)
where -- mostrar ruta de instalación para paquete dado en versión especificada opcional
which -- mostrar ruta a un ejecutable
❯ asdf version
v0.14.0
Plugins
Cada plugin es responsable de algún proyecto, generalmente runtimes y herramientas.
Para tener una idea de lo que tenemos disponible, ejecuta el comando abajo.
> asdf plugin-list-all
❯ asdf plugin-list-all
updating plugin repository...HEAD is now at 8e311ee feat: add dynatrace-monaco plugin (#951)
...
# La lista es enorme
Vamos a instalar entonces terraform.
❯ asdf plugin-add terraform
Plugin named terraform added
# Instalando la última versión
# no todos los proyectos tienen la tag latest, la gran mayoría sí. A veces es necesario pasar la versión específica.
❯ asdf install terraform latest
# Vamos a ver lo que tenemos usando un completion después de 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 a instalar entonces la versión 1.7.5 como una versión específica.
❯ asdf install terraform 1.7.5
# Ya tenemos dos versiones de terraform, ahora vamos a establecer una de ellas como global.
# usando el completion nos mostrará todas las disponibles que ya están 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 a cambiar a la versión 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 verificar todo lo que está instalado en el sistema entre plugins y versiones podemos utilizar el comando list.
❯ asdf list
terraform
*1.7.5
1.8.1
trivy
*0.50.1
Versión por Proyecto
Tenemos dos proyectos, A y B y vamos a colocar en el archivo .tools-versions la versión correcta de lo que necesitamos en ese proyecto.
❯ mkdir A B
❯ echo "terraform 1.8.1" > A/.tools-versions
❯ echo "terraform 1.7.5" > B/.tools-versions
Recordando que ya tenemos en nuestro sistema las versiones de terraform. Antes vamos a verificar la versión de terraform que está definida como global.
❯ terraform version
Terraform v1.8.1
on darwin_arm64
En A vamos a probar la versión de terraform. No necesitaríamos esto, pues si no hay versión global y no fue definida una versión, la global es la que prevalece.
❯ cd A
❯ terraform version
Terraform v1.8.1
on darwin_arm64
# Igual a la global como esperado
En B ahora...
❯ 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
¡Solo agradezco a los mantenedores de este proyecto que facilita mucho nuestra vida!