<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>DevOps on Rémi Tech Notes</title><link>https://www.vrchr.fr/tags/devops/</link><description>Recent content in DevOps on Rémi Tech Notes</description><generator>Hugo -- 0.154.5</generator><language>fr-fr</language><lastBuildDate>Tue, 28 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.vrchr.fr/tags/devops/index.xml" rel="self" type="application/rss+xml"/><item><title>Mise-en-place &amp; Fnox : mon setup de gestion multi-projets</title><link>https://www.vrchr.fr/posts/2026/04/28/mise-en-place-fnox-setup-multi-projets/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><guid>https://www.vrchr.fr/posts/2026/04/28/mise-en-place-fnox-setup-multi-projets/</guid><description>Comment j&amp;#39;utilise Mise au quotidien pour gérer mes versions d&amp;#39;outils, mes variables d&amp;#39;environnement et mes secrets sur plusieurs projets</description><content:encoded><![CDATA[<p>J'ai eu la chance de présenter <a href="https://mise.jdx.dev/">Mise</a> à <a href="https://www.devoxx.fr/">Devoxx France 2026</a> il y a quelques jours. J'utilise cet outil depuis plusieurs mois, et je trouvais intéressant de partager mon utilisation avec vous. Voici un retour d'expérience sur <strong>mon setup</strong>.</p>
<p>Si vous souhaitez une introduction plus complète vous pourrez bientôt voir la vidéo youtube, sinon les slides sont dispos <a href="https://presentations.verchere.fr/Mise_Devoxxfr_2026">ici</a>.</p>
<h2 id="le-problème--jongler-entre-contextes">Le problème : jongler entre contextes</h2>
<p>Je suis consultant Cloud Native Infra, et je gère au quotidien plus d'une <strong>dizaine de projets</strong> avec chacun leurs clusters Kubernetes en <strong>dev</strong> et en <strong>prod</strong>, hébergés sur des zones différentes. Chaque projet a ses propres versions d'outils, ses variables d'environnement, ses secrets, ses scripts...</p>
<p>Au quotidien, ça donne grosso modo ça :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">## Projet A - Dev - Helium ☕</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">$ java --version  <span class="c1"># openjdk 25.x</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">$ python --version  <span class="c1"># 3.14.x</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">$ kubectl version  <span class="c1"># v1.35.x</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">$ <span class="nb">export</span> <span class="nv">KUBECONFIG</span><span class="o">=</span>~/.kube/helium
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">$ <span class="nb">export</span> <span class="nv">ANSIBLE_INVENTORY</span><span class="o">=</span>inventories/helium/dev
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="c1">## Projet B - Prod - Lithium ⚓</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">$ java --version  <span class="c1"># openjdk 17.x</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">$ python --version  <span class="c1"># 3.11.x</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">$ kubectl version  <span class="c1"># v1.33.x</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">$ <span class="nb">export</span> <span class="nv">KUBECONFIG</span><span class="o">=</span>~/.kube/lithium
</span></span><span class="line"><span class="ln">13</span><span class="cl">$ <span class="nb">export</span> <span class="nv">ANSIBLE_INVENTORY</span><span class="o">=</span>inventories/lithium/prod
</span></span></code></pre></div><p>Concrètement :</p>
<ul>
<li>🔄 Versions d'outils <strong>différentes</strong> selon les projets</li>
<li>🌍 Variables d'environnement <strong>spécifiques</strong> à chaque contexte</li>
<li>📜 Scripts <strong>custom</strong> à maintenir</li>
<li>⚠️ <strong>Oublier</strong> de switcher = bugs, erreurs, frustration (😱 le <code>terraform plan</code> sur le mauvais projet qui demande de redéployer un cluster, c'est arrivé ^^)</li>
</ul>
<p>Avant, je faisais tout cela avec un mix d'outils :</p>
<table>
  <thead>
      <tr>
          <th>Outil</th>
          <th>Ce qu'il fait</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>asdf</strong></td>
          <td>Gestion de versions d'outils</td>
      </tr>
      <tr>
          <td><strong>direnv</strong></td>
          <td>Variables d'env par répertoire</td>
      </tr>
      <tr>
          <td><strong>sdkman / venv / nvm</strong></td>
          <td>Version manager (1 langage)</td>
      </tr>
      <tr>
          <td><strong>Scripts shell</strong></td>
          <td>Tout le reste (notamment source de secrets)</td>
      </tr>
  </tbody>
</table>
<p>Ça marchait, mais c'était <em>perfectible</em>. Et puis j'ai (re)découvert <a href="https://mise.jdx.dev/">Mise</a>, un outil créé par <a href="https://github.com/jdx">@jdx</a> en 2023, écrit en <strong>Rust</strong> (donc <em>vachement rapide</em>), qui agrège dans un seul binaire <code>asdf</code> + <code>direnv</code> + un task runner, avec une activation automatique par répertoire, le tout configurable simplement avec des fichiers au format <code>TOML</code>.</p>
<p>Pour l'installation, c'est un simple <code>curl https://mise.run | sh</code> puis <code>eval &quot;$(mise activate zsh)&quot;</code> dans le shell. Je ne vais pas refaire la doc ici, vous trouverez tout sur <a href="https://mise.jdx.dev/">mise.jdx.dev</a>, je préfère vous montrer mon vrai setup.</p>
<h2 id="mon-setup--un-dizaine-de-projets--clusters-kubernetes">Mon setup : Un dizaine de projets &amp; clusters Kubernetes</h2>
<p>J'ai une arborescence du genre :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="ln"> 1</span><span class="cl">projects-kubernetes-clusters/
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">├── calcium/              # Projet A
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">│   ├── calcium-dev/
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">│   └── calcium-prod/
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">├── lithium/              # Projet B
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">│   ├── lithium-dev/
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">│   └── lithium-prod/
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">├── helium/               # Projet C
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">│   ├── helium-dev/
</span></span><span class="line"><span class="ln">10</span><span class="cl">│   │   └── ansible/
</span></span><span class="line"><span class="ln">11</span><span class="cl">│   └── helium-prod/
</span></span><span class="line"><span class="ln">12</span><span class="cl">└── ...                   # 10+ projets identiques
</span></span></code></pre></div><p>Et la magie de Mise, c'est que la configuration est <strong>hiérarchique</strong> sur 3 niveaux :</p>
<ol>
<li><strong>Global</strong> (<code>~/.config/mise/config.toml</code>) : ce qui s'applique partout (proxy WireGuard par exemple)</li>
<li><strong>Projet parent</strong> (<code>calcium/mise.toml</code>) : variables OVH, endpoints, project name</li>
<li><strong>Environnement spécifique</strong> (<code>calcium/calcium-dev/mise.toml</code>) : nom du cluster, kubeconfig</li>
</ol>
<p><img alt="Architecture 3 niveaux Mise" loading="lazy" src="/2026/04/2026-04-28-mise-architecture-3-niveaux.svg"></p>
<h3 id="niveau-global">Niveau global</h3>
<p>Au niveau de mon home, j'ai juste de quoi sourcer mon proxy WireGuard quand je suis chez un client :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="ln">1</span><span class="cl"><span class="c"># ~/.config/mise.toml</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="p">[</span><span class="nx">env</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c"># WireGuard Proxy</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="nx">_</span><span class="p">.</span><span class="nx">source</span> <span class="p">=</span> <span class="p">[</span><span class="s2">&#34;~/.config/mise/proxy.sh&#34;</span><span class="p">]</span>
</span></span></code></pre></div><h3 id="niveau-projet-parent">Niveau projet parent</h3>
<p>Au niveau du projet parent, je définis les variables communes à tous les environnements (dev + prod), et j'active <code>fnox</code> pour les secrets :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c"># calcium/mise.toml</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">[</span><span class="nx">env</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="nx">OS_REGION_NAME</span> <span class="p">=</span> <span class="s2">&#34;GRA7&#34;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="nx">OVH_ENDPOINT</span> <span class="p">=</span> <span class="s2">&#34;ovh-eu&#34;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="nx">OS_AUTH_URL</span> <span class="p">=</span> <span class="s2">&#34;https://auth.cloud.ovh.net/v3/&#34;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="nx">VAULT_ADDR</span> <span class="p">=</span> <span class="s2">&#34;https://vault.gravitek.io&#34;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="nx">VAULT_OVH_PROJECT</span> <span class="p">=</span> <span class="s2">&#34;calcium&#34;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="nx">TF_VAR_project_name</span> <span class="p">=</span> <span class="s2">&#34;{{env.VAULT_OVH_PROJECT}}&#34;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="c"># fnox pour les secrets</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="nx">_</span><span class="p">.</span><span class="nx">fnox-env</span> <span class="p">=</span> <span class="p">{</span> <span class="nx">tools</span> <span class="p">=</span> <span class="kc">true</span> <span class="p">}</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="p">[</span><span class="nx">plugins</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="nx">fnox-env</span> <span class="p">=</span> <span class="s2">&#34;https://github.com/jdx/mise-env-fnox&#34;</span>
</span></span></code></pre></div><p>Les secrets sont gérés via <a href="https://fnox.jdx.dev/">fnox</a>, l'outil compagnon de Mise. Chez moi, j'utilise principalement <strong>HashiCorp Vault</strong> pour ce qui est partagé. La conf tient dans un <code>fnox.toml</code> au niveau du projet :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c"># calcium/fnox.toml</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">[</span><span class="nx">providers</span><span class="p">.</span><span class="nx">vault-ovh-project-api</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="nx">type</span> <span class="p">=</span> <span class="s2">&#34;vault&#34;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="nx">address</span> <span class="p">=</span> <span class="s2">&#34;https://vault.gravitek.io&#34;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="nx">path</span> <span class="p">=</span> <span class="s2">&#34;secret/myorg/ovh/calcium&#34;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="p">[</span><span class="nx">providers</span><span class="p">.</span><span class="nx">vault-ovh-project-openstack</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="nx">type</span> <span class="p">=</span> <span class="s2">&#34;vault&#34;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="nx">address</span> <span class="p">=</span> <span class="s2">&#34;https://vault.gravitek.io&#34;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="nx">path</span> <span class="p">=</span> <span class="s2">&#34;secret/myorg/ovh/calcium/openstack&#34;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="p">[</span><span class="nx">secrets</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="nx">OVH_APPLICATION_KEY</span> <span class="p">=</span> <span class="p">{</span> <span class="nx">provider</span> <span class="p">=</span> <span class="s2">&#34;vault-ovh-project-api&#34;</span><span class="p">,</span> <span class="nx">value</span> <span class="p">=</span> <span class="s2">&#34;API_CREDENTIALS/OVH_APPLICATION_KEY&#34;</span> <span class="p">}</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="nx">OVH_APPLICATION_SECRET</span> <span class="p">=</span> <span class="p">{</span> <span class="nx">provider</span> <span class="p">=</span> <span class="s2">&#34;vault-ovh-project-api&#34;</span><span class="p">,</span> <span class="nx">value</span> <span class="p">=</span> <span class="s2">&#34;API_CREDENTIALS/OVH_APPLICATION_SECRET&#34;</span> <span class="p">}</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="nx">OS_USERNAME</span> <span class="p">=</span> <span class="p">{</span> <span class="nx">provider</span> <span class="p">=</span> <span class="s2">&#34;vault-ovh-project-openstack&#34;</span><span class="p">,</span> <span class="nx">value</span> <span class="p">=</span> <span class="s2">&#34;admin/OS_USERNAME&#34;</span> <span class="p">}</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="nx">OS_PASSWORD</span> <span class="p">=</span> <span class="p">{</span> <span class="nx">provider</span> <span class="p">=</span> <span class="s2">&#34;vault-ovh-project-openstack&#34;</span><span class="p">,</span> <span class="nx">value</span> <span class="p">=</span> <span class="s2">&#34;admin/OS_PASSWORD&#34;</span> <span class="p">}</span>
</span></span></code></pre></div><p>Et pour le <code>VAULT_TOKEN</code> lui-même, je le stocke dans le <strong>Keychain macOS</strong>, ce qui m'évite de l'avoir en clair quelque part :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">[</span><span class="nx">providers</span><span class="p">.</span><span class="nx">keychain</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nx">type</span> <span class="p">=</span> <span class="s2">&#34;keychain&#34;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="nx">service</span> <span class="p">=</span> <span class="s2">&#34;fnox&#34;</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="p">[</span><span class="nx">secrets</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="nx">VAULT_TOKEN</span> <span class="p">=</span> <span class="p">{</span> <span class="nx">provider</span> <span class="p">=</span> <span class="s2">&#34;keychain&#34;</span><span class="p">,</span> <span class="nx">value</span> <span class="p">=</span> <span class="s2">&#34;VAULT_TOKEN&#34;</span> <span class="p">}</span>
</span></span></code></pre></div><h3 id="niveau-environnement-spécifique">Niveau environnement spécifique</h3>
<p>Au niveau de l'environnement spécifique, j'ajoute le nom du cluster, l'URL, et surtout un <strong>hook</strong> qui auto-switch le contexte <code>kubectl</code> à l'entrée du répertoire :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c"># calcium/calcium-dev/mise.toml</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">[</span><span class="nx">env</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="nx">CLUSTER_NAME</span> <span class="p">=</span> <span class="s2">&#34;calcium-dev&#34;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="nx">CLUSTER_URL</span> <span class="p">=</span> <span class="s2">&#34;https://xxx.k8s.ovh.net&#34;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="p">[</span><span class="nx">hooks</span><span class="p">]</span>   <span class="c"># mode expérimental</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="nx">enter</span> <span class="p">=</span> <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="s2">if [ -n &#34;</span><span class="err">$</span><span class="nx">CLUSTER_NAME</span><span class="s2">&#34; ] &amp;&amp; kubectl config get-contexts &#34;</span><span class="err">$</span><span class="nx">CLUSTER_NAME</span><span class="s2">&#34; &amp;&gt;/dev/null; then
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="s2">  kubectl config use-context &#34;</span><span class="err">$</span><span class="nx">CLUSTER_NAME</span><span class="s2">&#34;
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="s2">fi
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="s2">&#34;&#34;&#34;</span>
</span></span></code></pre></div><p>Plus de <code>kubectx</code> à la main, plus de risque de <code>terraform plan</code> sur le mauvais cluster 🙏.</p>
<h3 id="bonus--sous-répertoire-ansible-avec-venv-python">Bonus : sous-répertoire Ansible avec venv Python</h3>
<p>Pour mes répertoires Ansible, j'ajoute encore un niveau de configuration avec un venv Python dédié grâce à <code>uv</code>, et des tâches pour installer les dépendances :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c"># helium/helium-dev/ansible/mise.toml</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">[</span><span class="nx">tools</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="nx">python</span> <span class="p">=</span> <span class="s2">&#34;3.14&#34;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="p">[</span><span class="nx">env</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="nx">_</span><span class="p">.</span><span class="nx">python</span><span class="p">.</span><span class="nx">venv</span> <span class="p">=</span> <span class="p">{</span> <span class="nx">path</span> <span class="p">=</span> <span class="s2">&#34;.venv&#34;</span><span class="p">,</span> <span class="nx">create</span> <span class="p">=</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">python</span> <span class="p">=</span> <span class="s2">&#34;3.14&#34;</span><span class="p">,</span> <span class="nx">uv_create_args</span> <span class="p">=</span> <span class="p">[</span><span class="s1">&#39;--seed&#39;</span><span class="p">]</span> <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="p">[</span><span class="nx">tasks</span><span class="p">.</span><span class="nx">install</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="nx">description</span> <span class="p">=</span> <span class="s2">&#34;Installer les dépendances et les rôles Ansible&#34;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="nx">run</span> <span class="p">=</span> <span class="p">[</span><span class="s2">&#34;uv pip install ansible ansible-lint python-gitlab&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">       <span class="s2">&#34;ansible-galaxy install -r roles/requirements.yml -p roles --force&#34;</span><span class="p">]</span>
</span></span></code></pre></div><h2 id="le-résultat-au-quotidien">Le résultat au quotidien</h2>
<p>Concrètement, en switchant de répertoire :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln"> 1</span><span class="cl">$ <span class="nb">cd</span> projects/calcium/calcium-dev/
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">🔑 <span class="o">[</span>MISE<span class="o">]</span> Environnement CALCIUM détecté.
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">$ <span class="nb">echo</span> <span class="nv">$PROJECT_NAME</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">calcium
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">$ kubectl config current-context
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">calcium-dev
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">$ <span class="nb">echo</span> <span class="nv">$OVH_APPLICATION_SECRET</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">s3cr3t_p4ssw0rd      <span class="c1"># résolu depuis Vault automatiquement</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl">$ <span class="nb">cd</span> ../../lithium/lithium-prod/
</span></span><span class="line"><span class="ln">11</span><span class="cl">🔑 <span class="o">[</span>MISE<span class="o">]</span> Environnement LITHIUM détecté.
</span></span><span class="line"><span class="ln">12</span><span class="cl">$ <span class="nb">echo</span> <span class="nv">$PROJECT_NAME</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">lithium
</span></span><span class="line"><span class="ln">14</span><span class="cl">$ kubectl config current-context
</span></span><span class="line"><span class="ln">15</span><span class="cl">lithium-prod
</span></span></code></pre></div><p>Je <code>cd</code> dans un répertoire, <strong>tout est automatiquement chargé</strong> : versions d'outils, variables d'env, secrets résolus depuis Vault ou le Keychain, contexte <code>kubectl</code> switché. Zéro friction, zéro oubli.</p>
<p><img alt="Context switch entre projets avec Mise" loading="lazy" src="/2026/04/2026-04-28-mise-context-switch.svg"></p>
<p>Au final, Mise a remplacé chez moi : <code>asdf</code>, <code>direnv</code>, mes scripts shell custom, et même les virtualenvs python. C'est devenu <strong>le</strong> point d'entrée de mes projets.</p>
<h2 id="ressources">Ressources</h2>
<ul>
<li><strong>Documentation</strong> : <a href="https://mise.jdx.dev/">mise.jdx.dev</a> &amp; <a href="https://fnox.jdx.dev/">fnox.jdx.dev</a></li>
<li><strong>GitHub</strong> : <a href="https://github.com/jdx/mise">jdx/mise</a> &amp; <a href="https://github.com/jdx/fnox">jdx/fnox</a></li>
<li><strong>Slides Devoxx France 2026</strong> : <a href="https://presentations.verchere.fr/Mise_Devoxxfr_2026">presentations.verchere.fr/Mise_Devoxxfr_2026</a></li>
<li><strong>Dépôt de démo</strong> : <a href="https://github.com/gravitek-io/mise-demo">github.com/gravitek-io/mise-demo</a></li>
<li><strong>Blog Julien Wittouck</strong> : <a href="https://codeka.io/2025/12/19/adieu-direnv-bonjour-mise/">Adieu direnv, bonjour mise</a></li>
<li><strong>Blog Stéphane Robert</strong> : <a href="https://blog.stephane-robert.info/docs/outils/systeme/mise/">Mise</a></li>
</ul>]]></content:encoded></item></channel></rss>