Mise

L'autre jour à l'apero, un pote m'a parlé d'un outil trop cool pour configurer son environnement de dev :
Le concept est super simple : on créé un petit fichier mise.toml dans sont repertoire de travail, et mise va s'occuper d'installer, de configurer tous les outils necessaires pour vous !
C'est un peut comme du ansible avec un inventaire localhost sauf que c'est beaucoup plus rapide (normal c'est écrit Rust, pas en python) et que ça peut gérer plusieurs fichier mises.toml à la fois
Hiérarchie
Le truc cool avec mise, c'est que l'on peut avoir plusieurs fichiers mise.toml qui vont être plus ou moins prioritaires par rapport à l'endoit où ils sont placés.
Par exemple on peut avoir :
/etc/mise/config.toml: une config générale pour toute la machine/home/user/mise.toml: une config pour un user en particulier/home/user/workspace/work1/mise.toml: une conf spécifique pour le projet work1/home/user/workspace/work2/mise.toml: une conf spécifique pour le projet work2/home/user/workspace/work2/backend/mise.toml: une conf spécifique pour le repertoire backend du projet work2
Mise va "truster" les fichiers mise (mise trust /path/to/mise.toml) et ensuite les appliquer par ordre de prio.
Dev Tools
La feature principale de mise, c'est de gérer les outils de développement pour chaque projet !
Fini les outils comme sdkman ou nvm pour gérer les version du JDK ou de nodejs sur sa machine.
Un fichier mise dans le bon répertorie et hop ! ça installe et utilise la bonne version pour le projet.
Concrètement, ça se présente comme ça :
[tools]
java = { version = "temurin-26.0.2+101" }
node = { version = "24.20.0" } #LTS
kubectl = "latest"
python = "latest"
uv = "latest"
Ensuite on a juste à lancer la commande mise install une première fois pour installer les outils.
Les fois d'après, le simple de fait d'aller dans le repertoire va charger les bon paths pour utiliser la version demandée.
Par exemple si dans mon $HOME/mise.toml j'ai node = "latest" mais que dans mon projet $HOME/workspace/work1/mise.toml j'ai node = { version = "24.10.0" },
mise va utiliser la version 24.10 pour le projet work1 et latest pour les autres répertoires.
Il existe une multitude d'outils disponibles sur mise-versions.jdx.dev
On peut même installer des outils à partir de packages npm, de release github, gitlab, forgejo ou bien d'une url http. Il y a plein de backends disponibles pour installer ce qu'on veut.
Bref, le catalogue est bien fourni !
Bootstrap
Mise ce n'est pas que pour installer des outils dans les bonnes version ! C'est aussi un systeme de bootstrap qui va pouvoir installer et configurer des services sur la machine.
Par exemple, avec mise bootstrap il est possible de
- créer des users ou des groupes
- créer des fichiers ou des répertoires
- lancer des docker compose
- installer des packages via le package manager de l'OS (brew, apt)
- démarrer des services
Pour cela il faut ajouter une section [bootstrap] dans son fichier mise.toml :
[bootstrap.packages]
"apt:libssl-dev" = "latest"
"apt:curl" = "latest"
[bootstrap.services]
docker = {state = "running", enabled = true}
[bootstrap.files."~/.gradle/gradle.properties"]
source = ".mise/files/gradle.properties"
template = true
Tasks
Et c'est pas tout ! (j'ai l'impression que vous nous dites pas tout)
Mise est aussi capable de lancer des tâches !
Par exemple je peux ajouter dans mon mise.toml :
[tasks.my-script]
description = "Run my-script.sh"
run = "{{ confif_root }}/scripts/my-script.sh"
et ensuite lancer ma tache quand je veux avec : mise run my-script
Env
Un autre truc cool avec mise, c'est la gestion des variables d'environnement et des secrets. On peut :
- configurer des variables d'env statiques
- récupérer des variables d'en à partir d'un script
- lire des variables depuis un fichier secret sops
- configurer ces secrets dans des secrets mise pour les réutiliser ensuite dans un template
Par exemple :
[bootstrap.secrets]
secret_api_key = "SECRET_API_KEY"
[env]
_.file = { path = ".mise/.env.enc.yaml", redact = true } # fichier sops avec la clef SECRET_API_KEY
_.source = ".mise/env.sh"
_.path = ["{{config_root}}/bin"]
FOO="foo"
[bootstrap.files."~/.local/share/work1/auth.json"]
content = "{\"secret_api_key\": \"{{ secret(name=\"secret_api_key\") }}\"}"
template = true
mode = "0644"
Perso j'utilise sops + age pour le chiffrement de mes secrets. Comme ça je peux les garder dans mon repo git, et seul la clef privée age permet de déchiffrer les secrets.
Divers
Mise peut aussi etre utilisé pour builder des images docker, pour installer des outils en fonction de l'OS (mac ou linux) comme ça on peut garder le même fichier mise pour toute l'équipe. On peut l'utiliser dans la CI/CD pour lancer les builds et les test.
Y'a même une chanson mise !!