Source code of my website
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

✨ : publish mise-en-place article

+350 -35
content/posts/2025-12-19-mise-en-place/cover.png

This is a binary file and will not be displayed.

+350 -35
content/posts/2025-12-19-mise-en-place/index.md
··· 1 1 --- 2 2 date: 2025-12-19 3 3 language: fr 4 - title: Mise en place 4 + title: Adieu `direnv`, Bonjour `mise` 5 5 tags: 6 6 - linux 7 7 - tools 8 - draft: true 8 + - shell 9 + - devops 9 10 --- 10 11 11 - [//]: # (TODO image de couverture) 12 - 13 - J'ai découvert Mise par deux canaux : 14 - 15 - * le support par Clever Cloud (plutôt en tant que package manager donc), avec en particulier leur type d'image "Linux" 16 - 17 - [//]: # (TODO remettre le lien) 18 - * le calendrier de l'avent de Siegfried Erhet, avec une approche de DevTool 12 + J'ai découvert `mise` dans le [calendrier de l'avent de Siegfried Ehret](https://sieg.fr/ied/avent-2025/04-mise/), avec une approche autour de l'outillage de dev. 19 13 20 14 Étant utilisateur de `direnv` depuis plusieurs années, je suis habitué à travailler dans mon shell. 21 - Direnv souffre par contre de plusieurs défauts : il ne peut pas gérer d'alias et se configure uniquement avec du scripting shell. 15 + `direnv` souffre par contre de plusieurs défauts : il ne peut pas gérer d'alias et se configure uniquement avec du scripting. 16 + J'ai donc tout un tas de scripts shells qui traînent sur mes machines, plus ou moins adaptées aux package-managers `apt` et `pacman`, qui s'intègrent avec `direnv`. J'avais d'ailleurs écrit un [article sur mon usage de `direnv`](/2022/06/17/direnv-pour-votre-shell) en 2022. 22 17 23 - Aujourd'hui, je teste l'outil "Mise", pour voir dans quelle mesure cet outil peut venir enrichir mon workflow de dev. 18 + Aujourd'hui, j'ai donc décidé de tester l'outil `mise`, pour voir dans quelle mesure cet outil peut venir enrichir mon workflow de dev, ou (pourquoi pas) remplacer `direnv`. 24 19 25 20 <!--more--> 26 21 27 - ## Mise en place 28 - 29 - Mise en place est un outil développé en Rust, ce qui promet de bonnes performances et de la stabilité. 22 + ## mise-en-place 30 23 31 - Il propose 3 types d'usage : 24 + [mise-en-place](https://mise.jdx.dev/) propose 3 types d'usage : 32 25 33 26 * gestionnaire de packages (un peu comme `asdf`) 34 27 * gestionnaire de variables d'environnement (exactement comme `direnv` donc) ··· 36 29 37 30 Il se veut aussi extensible avec la possibilité d'utiliser ou d'implémenter des plugins. 38 31 32 + Il est développé en Rust, ce qui promet de bonnes performances et de la stabilité. 33 + 39 34 ## L'installation 40 35 41 - L'installation est bien documentée sur le site web : https://mise.jdx.dev/installing-mise.html 36 + L'installation est bien documentée sur le site web : https://mise.jdx.dev/installing-mise.html 42 37 43 - Sur mes postes Linux, j'ai suivi la procédure d'installation avec `apt` : 38 + Sur mes postes Linux, j'ai suivi la procédure d'installation avec `apt` : 44 39 45 40 ```shell 46 - curl -fSs https://mise.jdx.dev/gpg-key.pub | sudo tee /etc/apt/keyrings/mise-archive-keyring.pub 1> /dev/null 47 - echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" | sudo tee /etc/apt/sources.list.d/mise.list 48 - sudo apt update -y 49 - sudo apt install -y mise 41 + $ curl -fSs https://mise.jdx.dev/gpg-key.pub | sudo tee /etc/apt/keyrings/mise-archive-keyring.pub 1> /dev/null 42 + $ echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" | sudo tee /etc/apt/sources.list.d/mise.list 43 + $ sudo apt update -y 44 + $ sudo apt install -y mise 50 45 ``` 51 46 52 - Une fois l'installation terminée, la commande `mise` est disponible dans mon shell : 47 + Une fois l'installation terminée, la commande `mise` est disponible dans mon shell : 53 48 54 49 ```shell 55 - mise --version 50 + $ mise --version 56 51 _ __ 57 52 ____ ___ (_)_______ ___ ____ ____ / /___ _________ 58 53 / __ `__ \/ / ___/ _ \______/ _ \/ __ \______/ __ \/ / __ `/ ___/ _ \ ··· 62 57 2025.12.10 linux-x64 (2025-12-16) 63 58 ``` 64 59 65 - Une dernière étape dans la configuration est importante : la configuration du shell, afin que le shell appelle la commande `mise` lors du changement de répertoires. 60 + Une dernière étape dans la configuration est importante : la configuration du shell, afin que le shell appelle la commande `mise` lors du changement de répertoires. 66 61 67 - Cette opération se fait en éditant le fichier de configuration de votre shell : `~/.bashrc` ou `~/.zshrc` par exemple. 62 + Cette opération se fait en éditant le fichier de configuration de votre shell : `~/.bashrc` ou `~/.zshrc` par exemple. 68 63 69 - Pour Zsh que j'utilise, il faut alors simplement ajouter la ligne suivante dans le fichier `~/.zshrc` : 64 + Pour Zsh que j'utilise, il faut alors simplement ajouter la ligne suivante dans le fichier `~/.zshrc` : 70 65 71 66 ```shell 72 - eval "$(mise activate zsh)" 67 + $ eval "$(mise activate zsh)" 73 68 ``` 74 69 75 70 Une fois ces opérations faites, il suffit donc de redémarrer votre shell pour que la configuration soit prise en compte. 76 71 77 72 ## Les devtools 78 73 79 - Quand je switche entre mes projets, je switche aussi souvent de stack d'outillage, que ce soit la version de Java, de Node, ou d'outils divers (comme Hugo que j'utilise sur ce site). 74 + Quand je switche entre mes projets, je switche aussi souvent de stack d'outillage, que ce soit la version de Java, de Node, ou de divers outils (comme Hugo que j'utilise sur ce site). 75 + 76 + Pour faciliter ces opérations, j'avais implémenté quelques scripts shell que j'utilisais depuis `direnv`. Ces scripts modifiaient mon $PATH pour pointer vers la bonne version de Java, de Node, etc. J'utilisais aussi parfois des outils comme `nvm` 77 + ou `tfenv`. 78 + 79 + `mise` est une alternative plus beaucoup plus simple. 80 + 81 + Pour les outils les plus courants, les langages de programmation principalement, `mise` dispose d'un plugin _core tools_ qui supporte leur configuration et activation automatique. 82 + Pour les autres outils ou packages, `mise` utilise un ou plusieurs backends (_asdf_ en fait partie) qui permettent l'installation sans avoir rien à configurer en plus. Les outils disponibles peuvent être listés avec la commande `mise registry` : 83 + 84 + ```shell 85 + $ mise registry | grep java 86 + java core:java 87 + 88 + $ mise registry | grep graalvm 89 + graalvm asdf:mise-plugins/mise-graalvm 90 + ``` 91 + 92 + La configuration se fait avec un fichier `mise.toml` ou `.mise.toml`. 93 + La configuration est hiérarchique, mise va lire le fichier de configuration dans le répertoire courant, et merger ou surcharger les valeurs de ce fichier avec les valeurs des répertoires parents. 94 + 95 + Il est aussi possible de définir un fichier `mise.toml` à la racine du `$HOME` de l'utilisateur, ou dans le sous-répertoire `$HOME/.config/` pour partager des configurations sur tout le système. 96 + 97 + ### Une stack java 98 + 99 + Déclarer une stack Java est très simple avec un fichier `mise.toml` : 100 + 101 + ```toml 102 + [tools] 103 + java = "temurin-25" 104 + maven = "3" 105 + ``` 106 + 107 + Une fois le fichier crée, au chargement du répertoire, `mise` affichera une erreur, car il ne souhaite par exécuter les fichiers par défaut (par mesure de sécurité) : 108 + 109 + ```shell 110 + $ cd workspaces/gitlab-classrooms 111 + mise ERROR error parsing config file: ~/workspaces/gitlab-classrooms/mise.toml 112 + mise ERROR Config files in ~/workspaces/gitlab-classrooms/mise.toml are not trusted. 113 + Trust them with `mise trust`. See https://mise.jdx.dev/cli/trust.html for more information. 114 + mise ERROR Run with --verbose or MISE_VERBOSE=1 for more information 115 + ``` 116 + 117 + La commande `mise trust` permet donc d'activer le fichier de configuration donné : 118 + 119 + ```shell 120 + $ mise trust 121 + mise trusted /home/jwittouck/workspaces/gitlab-classrooms 122 + mise WARN missing: java@temurin-25.0.1+8.0.LTS maven@3.9.12 123 + ``` 124 + 125 + Il est aussi possible de configurer `mise` pour truster des répertoires complets dans le fichier `.config/mise/config.toml` : 126 + 127 + ```toml 128 + [settings] 129 + trusted_config_paths = ["~/workspaces"] 130 + ``` 131 + 132 + Une fois le fichier créé et trusté, `mise` affichera les outils manquants s'il y en a avec un warning : 133 + 134 + ```shell 135 + mise WARN missing: java@temurin-25.0.1+8.0.LTS maven@3.9.12 136 + ``` 137 + 138 + Pour installer les outils manquants, il suffit alors d'exécuter la commande `mise install` : 139 + 140 + ```shell 141 + $ mise install 142 + mise maven@3.9.12 download apache-maven-3.9.12-bin.tar.gz 8.57 MiB/8.81 MiB (0s) ███████████████████░ 2s 143 + mise java@temurin-25.0.1+8.0.LTS download OpenJDK25U-jdk_x64_linux_hotspot_25.0.1_8.tar.gz 128.19 MiB/134.21 MiB (0s) ███████████████████░ 2s 144 + ``` 145 + 146 + Une fois les outils installés, ils sont ajoutés au `$PATH` et peuvent être utilisés immédiatement : 147 + 148 + ```shell 149 + $ echo $PATH 150 + 151 + /home/jwittouck/.local/share/mise/installs/java/temurin-25.0.1+8.0.LTS/bin:/home/jwittouck/.local/share/mise/installs/maven/3.9.12/apache-maven-3.9.12/bin:/home/jwittouck/.local/bin:/usr/local/bin:/usr/bin:/usr/local/sbin 152 + 153 + $ java --version 154 + openjdk 25.0.1 2025-10-21 LTS 155 + OpenJDK Runtime Environment Temurin-25.0.1+8 (build 25.0.1+8-LTS) 156 + OpenJDK 64-Bit Server VM Temurin-25.0.1+8 (build 25.0.1+8-LTS, mixed mode, sharing) 157 + 158 + $ mvn -v 159 + Apache Maven 3.9.12 (848fbb4bf2d427b72bdb2471c22fced7ebd9a7a1) 160 + Maven home: /home/jwittouck/.local/share/mise/installs/maven/3.9.12/apache-maven-3.9.12 161 + Java version: 25.0.1, vendor: Eclipse Adoptium, runtime: /home/jwittouck/.local/share/mise/installs/java/temurin-25.0.1+8.0.LTS 162 + Default locale: en_US, platform encoding: UTF-8 163 + OS name: "linux", version: "6.17.12-1-manjaro", arch: "amd64", family: "unix" 164 + ``` 165 + 166 + Si je veux utiliser une autre version de Java, rien de plus simple, je peux simplement modifier le fichier `mise.toml`, ou exécuter la commande `mise use` (qui va aussi modifier le fichier `mise.toml`) : 167 + 168 + ```shell 169 + $ mise use graalvm@25 170 + mise ~/workspaces/gitlab-classrooms/mise.toml tools: graalvm@25.0.1 171 + 172 + $ mise use --remove java 173 + mise ~/workspaces/gitlab-classrooms/mise.toml removed: java 174 + 175 + $ java --version 176 + openjdk 25.0.1 2025-10-21 177 + OpenJDK Runtime Environment GraalVM CE 25.0.1+8.1 (build 25.0.1+8-jvmci-b01) 178 + OpenJDK 64-Bit Server VM GraalVM CE 25.0.1+8.1 (build 25.0.1+8-jvmci-b01, mixed mode, sharing) 179 + 180 + $ mvn -v 181 + Apache Maven 3.9.12 (848fbb4bf2d427b72bdb2471c22fced7ebd9a7a1) 182 + Maven home: /home/jwittouck/.local/share/mise/installs/maven/3.9.12/apache-maven-3.9.12 183 + Java version: 25.0.1, vendor: GraalVM Community, runtime: /home/jwittouck/.local/share/mise/installs/graalvm/25.0.1 184 + Default locale: en_US, platform encoding: UTF-8 185 + OS name: "linux", version: "6.17.12-1-manjaro", arch: "amd64", family: "unix" 186 + ``` 187 + 188 + C'est pratique, flexible et bluffant. 189 + 190 + Les packages sont installés par défaut dans le répertoire `~/.local/share/mise/installs/`, et utilisent des liens symboliques pour relier les différentes version et alias de versions : 191 + 192 + ```shell 193 + $ tree -L 2 ~/.local/share/mise/installs/ 194 + /home/jwittouck/.local/share/mise/installs/ 195 + ├── graalvm 196 + │   ├── 25 -> ./25.0.1 197 + │   ├── 25.0 -> ./25.0.1 198 + │   ├── 25.0.1 199 + │   └── latest -> ./25.0.1 200 + ├── java 201 + │   ├── temurin-25 -> ./temurin-25.0.1+8.0.LTS 202 + │   ├── temurin-25.0 -> ./temurin-25.0.1+8.0.LTS 203 + │   ├── temurin-25.0.1+8.0.LTS 204 + │   └── temurin-latest -> ./temurin-25.0.1+8.0.LTS 205 + └── maven 206 + ├── 3 -> ./3.9.12 207 + ├── 3.9 -> ./3.9.12 208 + ├── 3.9.12 209 + └── latest -> ./3.9.12 210 + ``` 211 + 212 + Vu que mon IDE (IntelliJ) télécharge aussi automatiquement des versions de Java, je risque d'avoir des doublons, mais je pense qu'il ne sera pas bien difficile d'utiliser ces versions à la place de celles proposées par IntelliJ. 213 + 214 + Pour une stack Java plutôt classique, `mise` fait très bien le job. 215 + 216 + ### Une stack Hugo pour builder mon site 80 217 81 - Pour les outils les plus courants, les langages de programmation principalement, mise dispose d'un plugin _core tools_ qui supporte leur configuration et activation automatique. 82 - Pour les autres outils ou packages, _mise_ utilise un ou plusieurs backends (_asdf_ en fait partie) qui permettent l'installation sans avoir rien à configurer en plus. Les outils disponibles peuvent être listés avec la commande `mise registry` : 218 + Mon site (ce site) est buildé avec [_Hugo_](https://gohugo.io). 219 + 220 + Bien qu'installer Hugo est plutôt facile, autant essayer de basculer le maximum de choses avec `mise` pour ce test. 221 + 222 + Hugo est disponible dans le registry de `mise` : 83 223 84 224 ```shell 85 - $ mise registry 225 + $ mise registry | grep hugo 226 + hugo aqua:gohugoio/hugo ubi:gohugoio/hugo asdf:NeoHsu/asdf-hugo asdf:nklmilojevic/asdf-hugo 227 + hugo-extended aqua:gohugoio/hugo/hugo-extended 86 228 ``` 87 229 230 + Plutôt que d'intialiser directement le fichier `mise.toml` avec la configuration de l'outil, 231 + il est possible d'utiliser la commande `mise use`, qui va générer le fichier pour nous et installer l'outil directement, qui sera immédiatement utilisable : 88 232 89 - --- 233 + ```shell 234 + $ mise use hugo 235 + mise ~/workspaces/codeka.io/mise.toml tools: hugo@0.152.2 90 236 91 - La prochaine publication est prévue autour du 🗓️ 237 + $ hugo version 238 + hugo v0.152.2+extended+withdeploy linux/amd64 BuildDate=unknown 239 + ``` 92 240 93 - Photo de couverture par sur 241 + Le fichier généré est alors le suivant : 242 + 243 + ```toml 244 + [tools] 245 + hugo = "latest" 246 + ``` 247 + 248 + Utiliser une version "latest" est bien entendu déconseillé, mais cela permet de tester rapidement la nouvelle version de l'outil. 249 + 250 + Et encore une fois, tout fonctionne parfaitement : 251 + 252 + ```shell 253 + hugo serve 254 + Watching for changes in /home/jwittouck/workspaces/codeka.io/{archetypes,assets,content,data,i18n,layouts,static,themes} 255 + Watching for config changes in /home/jwittouck/workspaces/codeka.io/hugo.toml, /home/jwittouck/workspaces/codeka.io/themes/poison/config.toml 256 + Start building sites … 257 + hugo v0.152.2-6abdacad3f3fe944ea42177844469139e81feda6 linux/amd64 BuildDate=2025-10-24T15:31:49Z VendorInfo=gohugoio 258 + 259 + 260 + │ FR │ EN 261 + ──────────────────┼─────┼───── 262 + Pages │ 134 │ 26 263 + Paginator pages │ 3 │ 0 264 + Non-page files │ 234 │ 0 265 + Static files │ 182 │ 182 266 + Processed images │ 160 │ 0 267 + Aliases │ 7 │ 1 268 + Cleaned │ 0 │ 0 269 + 270 + Built in 299 ms 271 + Environment: "development" 272 + Serving pages from disk 273 + Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender 274 + Web Server is available at http://localhost:1313/ (bind address 127.0.0.1) 275 + Press Ctrl+C to stop 276 + ``` 277 + 278 + ## Utiliser des variables d'environnement 279 + 280 + `mise` permet de déclarer des variables d'environnement dans le fichier `mise.toml` avec le bloc `[env]` : 281 + 282 + ```toml 283 + [env] 284 + SPRING_PROFILES_ACTIVE = 'local' 285 + ``` 286 + 287 + Il est aussi possible de charger un fichier `.env` avec [une directive](https://mise.jdx.dev/environments/#env-directives) : 288 + 289 + ```toml 290 + [env] 291 + _.file = '.env' 292 + ``` 293 + 294 + C'est ici très similaire à `direnv`, donc pas de surprise. 295 + 296 + ### Utiliser des secrets 297 + 298 + Là où `mise` se distingue, c'est sur la gestion des secrets. 299 + 300 + `mise` s'intègre avec `fnox` (par le même développeur). Il est alors possible de charger des secrets depuis un Vault ou un secret manager cloud (AWS Secrets Manager, Azure Key Vault, Google Cloud Secret Manager), depuis un Keypass. 301 + 302 + `mise` s'intègre aussi avec `age` qui permet d'utiliser des clés SSH pour chiffrer les secrets, ce qui est bien pratique si vous baladez vos clés sur vos différentes machines, puisqu'il n'y a alors aucune configuration à faire la clé `~/.ssh/id_ed25519` ou `~/.ssh/id_rsa` sera utilisée (dans cet ordre de priorité). 303 + 304 + 305 + ```shell 306 + $ mise set --age-encrypt --prompt GITLAB_CLIENT_ID 307 + Enter value for GITLAB_CLIENT_ID ************ 308 + 309 + $ mise set --age-encrypt --prompt GITLAB_CLIENT_SECRET 310 + Enter value for GITLAB_CLIENT_SECRET ************ 311 + ``` 312 + 313 + Les valeurs chiffrées sont stockées dans le fichier `mise.toml`, qui peut alors être poussé sur un repo git en toute sécurité : 314 + 315 + ```toml 316 + [env] 317 + GITLAB_CLIENT_ID = { age = { value = "KLUv/QBYDR0AukFwDj0ANfCYs5DmZabA2Mi9YcrEQIqnBlqmxxa45qzJ6BIme5SvwM1b8bd87RMmC0YR540QLz2IWr5cNzRj/PEI0ADOANIAqBfCLgps21MFvkmjrMekjza1mjgCw+p8L11IHD38hL0pa5LJTF+jo1AGgjcpTFoprubn359HcX5T458wH/F00eoLinZHXzTatFtdm3l6rwWfMp5Fb6Wb0fa9a3qt53IQaaN2bE4r8x/PWJqUtrROIYthKb91VtSKW/Lk6CrXY87IgenHjEcrm5N87Zo/pep79tdFOz0vxuWG89vnlpJTnIfd+XmzIY2pzaRAunuB0ar/sJi3lbR6PinpumTCpMJ4Cim3I9S2vN9+/tbwBCa1AbNNrhUxnDXLrdl8UoryOpoLM3a9fjoomVX5hnHybBTy3o4crTXKi0D6/qU0D3vGjsZHRe9DgyomNrrXJndAdY+m1phS2rGIyjZbqVcn3n2XRsoi7rb3E6Wx6oWCUyT+E1eRbZrmLMq8XpY+E6/PHVIDdkQdEe7hGJB2ReHvglVm1riPWty/iz6d7fTeDGKpsrY8sbv824jjf2j35IXd2au1Z6g2WUhRt+Hkiphy+32HK9mCYaWSDWt6Y8FgX3tV1HJ7f1P14P40p7iUxsEB9ZflPQbDSfbfZZWFIvO2BRFHUprYBzSEBxcJTc6zKoH1Fs5JE01sQOEy4YJkwqRC3QpH0k/7um0wn3yBvXkS00y88MyU+9JCsThhCE69nh/PKjt+rQt2ycvX/8RXRdkrDmu6CbNjHspqmbv8o74Hc6fsfVVKJ5Dz+O/6rOY58x/SlMlmddqAsxvy2Ke28eLceRzRAnronyS1FNNEb4xlnY+VUKNLYTUd+pPqydJwiCsrnV82yS2r1sznsqnm5mKhvjxH6G3RKC2GU3dfds0tqY8BOgbQuJHBUoGDD8SDDxMmSNQ4kWCIJqCARkaFF0J43FBAZMSHIwFKoMAhZAUBBxv4FlsKDTkW7AABsCFBhIoOP2L2h8kBBxxFQIDAwCCIEZ8DwAJBiNJB66KeAeNADy2GgSE10gpMw9uD+t2+iVrXN0Omy2vqB4+oaZeYO6UBXe2aSyhP/Hwkk8mkQjOVOno3j2vjtCOKpYv7MjhXLReVwzGzVs7Sg+k24m7Ouk1SQD2/cWi+cpl9Di3Z2W3jpbA6ZT0Tp/h5ax0nzFFitrK3mRpZTvHOecZW7VqL9EIWCCU9+2uFrmZzAgA", format = "zstd" } } 318 + GITLAB_CLIENT_SECRET = { age = "YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1yc2EgYWM5WlV3Cmpsa0EweTlISnFLQmJ4NHBRQTRDVGRBd21NM3JWbVo1b3NFZHQ3dXcvZHZaQmFYMkEyWjViWmpJWCtLT0R1aVkKckNsUW1qVHZ1NlBEelYzQm9nNkk1SEp3REJsNzZvdmJuTkdYd2tLV3VCRFBRUXlCYjhhVzNvSnBib0dDcUFXTwpydW1INWIyMWtjaCt2WnlGeEx5dXM5Q205NUJBdmlycjUzdE41ejFFOW9PZ1YzaXczM292bXlsSkpPWW5hVldQCkJOUUZ3ditlbGFJbzRWZU5TeTBaSitoUk1TeDh4RVJqUjRaVkV5MGJrOXhJeitsbjBKcEQ0TkZla1V4bnNybUoKWVBjeSttUkFMVkd2Q2t1dDJVUWxjMk9vcER3cWFZcjNBRHNTZVJqMGZNc01xQ1VZd3pHU2hQazJWczFRbjd6OAowSHRqS0tCeE1HL2MrVG5FaUhaVndvWm9xNzNrME41VjJDRzlzbEFGRzdvQ040elNSeVAxcVdGMVlSK2NsQlM3ClJFbGZtV2pVOUh3VmF2RXlhNE5pekpIcnVpSzF2WWs5YWMvSTRqYnBQMnBMUFpValNTajI2WVp2YXRSTWgxd1AKTGVZektqdWxjRENjMVJaZy9aVEhvQkgzNXdyT01PY1NKT2t0MHB2VW9RK1hCSmxkbk5aWElGVndKeTRZRi90VApXMDhnWFlCVGRZeTFZcHRKSUdRbHkrRXlidXdKY0lCUVNjYy8vR21LbTk5eG5UTFp3L1RUM3JFbldRNldkTkJFCmVsZ2VqWXc3c3Q0eERtb0YxSDhNZjlrOUdJdmp4QjhEVW16UlRGY0xrbGtBZXkwcVkvZ1MrWVRKYXdqTm9QYjkKcUJzNS9MdUR4UENvU05iRHo5cGVEaGpvTDVwdU0xMUsrUGRBQkNaUFZaVQotPiB0LWdyZWFzZSA5KklKaXIgWlcyCjJzUlRqRXo3ZnJ6ZVZndk92UVE5QllNejhNZGZqVjYxMWN5U0JjbzhUbTJhCi0tLSBmRXEwQnh0Ykc4NWtIdk1nd200LzI2aEZtVEJqZ2x6QWp3ZCs0TlJjYThBCrPsAPxQrwsNRNctYosJQ7GQM8+Zc4bdoMoTbSehN6Fyf/5AvfJ2ko3Gm5FJ9L2qnW0ZGW+QTLMsR4vLInmecojm/eu4LKC5EqBB/3oFCAJJNZAdOtYiJnwUCWml5WY" } 319 + ``` 320 + 321 + Et les valeurs sont automatiquement déchiffrées pour être disponibles dans le shell en variable d'environnement : 322 + 323 + ```shell 324 + $ env | grep GITLAB 325 + GITLAB_CLIENT_ID=a578cf01-96cf-4d60-bef0-c89240583992 326 + GITLAB_CLIENT_SECRET=9520fa56-6663-4008-888a-cd50e6b575a9 327 + ``` 328 + 329 + C'est clairement une killer-feature. Je n'ai pas pris le temps de tester en détail l'intégration avec `fnox`, mais je pense que je vais m'y atteler prochainement. 330 + 331 + ## Exécuter des tâches 332 + 333 + Le dernier use-case proposé par `mise` est l'exécution de _task_, qui sont autant de petits scripts que l'on veut, un peu à la manière d'un `Makefile`, `justfile`, ou `Taskfile`. 334 + 335 + L'avantage est que tout s'intègre parfaitement avec `mise`, il est facile d'utiliser des variables d'environnement et des tools dans des scripts qu'on va pouvoir exécuter directement avec `mise run`. 336 + 337 + Et on peut aller assez loin dans la configuration, avec des dépendances entre les tâches ou conditionner l'exécution à la mise à jour d'un fichier par exemple. 338 + 339 + Pour mon site, j'avais un `justfile` qui contenait quelques commandes, je l'ai rapidement migré, et en voici le résultat : 340 + 341 + ```toml 342 + [tools] 343 + hugo = "0.152" 344 + 345 + [env] 346 + HUGO_OPTIONS = "--printI18nWarnings --printPathWarnings --cleanDestinationDir --logLevel debug" 347 + 348 + [tasks] 349 + 350 + [tasks.build] 351 + description = "Build le site avec Hugo" 352 + run = "hugo build $HUGO_OPTIONS" 353 + 354 + [tasks.serve] 355 + description = "Lance le serveur de développement Hugo" 356 + run = "hugo server --openBrowser $HUGO_OPTIONS" 357 + 358 + [tasks.draft] 359 + description = "Lance le serveur en incluant les brouillons et futures publications" 360 + run = "hugo server --openBrowser $HUGO_OPTIONS --buildDrafts --buildFuture" 361 + ``` 362 + 363 + Maintenant, avec un simple fichier `mise.toml`, j'ai tout au même endroit, et je n'ai besoin que d'un seul outil. 364 + Les tâches peuvent bien entendu en appeler d'autres, ou utiliser des [fichiers de script](https://mise.jdx.dev/tasks/file-tasks.html) pour leur implémentation, cette partie est assez riche, 365 + 366 + Je démarre mon site en test avec la commande `mise run draft` ou même directement avec `mise draft`, et je n'aurai plus à me soucier de l'installation de Hugo et Just sur mes machines (voire même dans ma CI 👀). 367 + 368 + ```shell 369 + $ mise run build 370 + [build] $ hugo build $HUGO_OPTIONS 371 + Start building sites … 372 + hugo v0.152.2-6abdacad3f3fe944ea42177844469139e81feda6+extended linux/amd64 BuildDate=2025-10-24T15:31:49Z VendorInfo=gohugoio 373 + 374 + │ FR │ EN 375 + ──────────────────┼─────┼───── 376 + Pages │ 134 │ 26 377 + Paginator pages │ 3 │ 0 378 + Non-page files │ 234 │ 0 379 + Static files │ 182 │ 182 380 + Processed images │ 160 │ 0 381 + Aliases │ 7 │ 1 382 + Cleaned │ 0 │ 0 383 + 384 + Total in 304 ms 385 + Finished in 540.7ms 386 + ``` 387 + 388 + C'est plutôt pratique de pouvoir avoir quelques scripts packagés avec cet outil. Ça permet surtout de ne pas avoir à installer d'autres outils comme `task` ou `just` sur mes machines. 389 + 390 + ## Conclusion 391 + 392 + J'ai testé simplement pendant quelques heures, en migrant les outils de mon site et un de mes projets. 393 + Je suis vraiment bluffé par la puissance de `mise`, sa flexibilité et ses performances. C'est rapide à prendre en main, ça supporte tous les outils et langages que j'utilise, et ça vient en plus avec une solution pour la gestion des secrets et de scripting. 394 + 395 + En une aprèm, je suis déjà conquis. 396 + 397 + Adieu `direnv`, `asdf`, `task` et `just`, et tous mes scripts custom, vous m'avez bien servi. 398 + 399 + ## Liens et références 400 + 401 + * Le blog post de Siegfried Erhet : https://sieg.fr/ied/avent-2025/04-mise/ 402 + * Mon [article sur mon usage de `direnv`](/2022/06/17/direnv-pour-votre-shell) 403 + * La documentation officielle de `mise` : https://mise.jdx.dev 404 + * L'installation de `mise` : https://mise.jdx.dev/installing-mise.html 405 + * L'utilisation des DevTools : https://mise.jdx.dev/dev-tools/ 406 + * La liste des outils disponibles : https://mise.jdx.dev/registry.html#tools 407 + * L'utilisation des variables d'environnement : https://mise.jdx.dev/environments/ 408 + * Utilisation de tâches : https://mise.jdx.dev/tasks/