Skip to content

DC-5886: Construire le PATH asdf avec $HOME au lieu d'un tilde - #3

Merged
burisu merged 2 commits into
mainfrom
DC-5886/expand-asdf-path-in-default-env
Sep 15, 2026
Merged

burisu merged 2 commits into
mainfrom
DC-5886/expand-asdf-path-in-default-env

Conversation

@burisu

@burisu burisu commented Sep 15, 2026

Copy link
Copy Markdown

Le problème

Sur les 11 apps Rails de DC-5886, le nodejs d'asdf n'est pas pris en compte au déploiement, alors que config/deploy.rb déclare pourtant set :asdf_tools, %w[ruby nodejs].

asdf:map_bins construit bien le PATH et le pose sur SSHKit.config.default_env — cette partie fonctionne, et rien ne l'écrase. Mais SSHKit exporte l'environnement entre guillemets doubles, devant chaque commande distante :

cd /var/www/current && ( export GHR_TOKEN="" PATH="~/.asdf/shims:~/.asdf/bin:$PATH" ; /usr/bin/env node --version )

Or un shell ne développe pas un tilde entre guillemets. Avec la valeur par défaut d'asdf_path (~/.asdf), les deux entrées ajoutées en tête de PATH désignent un répertoire littéral ~/.asdf/… qui n'existe pas : aucun shim n'est atteignable. $HOME, lui, est bien développé entre guillemets.

Ce qui change

map_bins développe le tilde de tête en $HOME pour construire le PATH :

asdf_home = fetch(:asdf_path).sub(%r{\A~(?=/|\z)}, "$HOME")

asdf_path lui-même n'est pas touché : les autres usages (within, test -d, command_map[:asdf]) continuent de recevoir la valeur d'origine. C'est volontaire — within passe par shellescape_except_tilde, qui échappe un $ mais laisse un ~ intact : un asdf_path réglé sur $HOME/.asdf produirait cd \$HOME/.asdf et casserait asdf:setup. Le tilde reste donc la bonne valeur pour asdf_path, et seul le PATH exporté en est débarrassé. Un asdf_path absolu est utilisé tel quel.

Tests

test/capistrano/test_map_bins.rb charge la tâche dans une configuration Capistrano minimale, l'invoque, puis lit le PATH tel que SSHKit l'écrit dans la commande (SSHKit::Command#to_command) plutôt que la variable interne — c'est la forme qui compte, puisque le bug est un défaut de développement du shell :

  • le PATH exporté ne contient aucun tilde ;
  • un path déjà posé par l'app est conservé derrière les entrées asdf ;
  • un asdf_path absolu est laissé tel quel.

Les deux premiers échouent sans le correctif ("~/.asdf/shims:~/.asdf/bin:$PATH" au lieu de "$HOME/.asdf/shims:$HOME/.asdf/bin:$PATH"), le troisième documente le comportement à préserver. bundle exec rake : 4 runs, 0 échec, standardrb sans offense.

Suite

Une fois cette version publiée sur gems.codeur.com, les 11 apps de DC-5886 bumpent capistrano-asdf et retirent la ligne path: ajoutée en contournement dans leur set :default_env (voir facture#1324, où le contournement a été trouvé). La vérification définitive ne peut se faire qu'au premier déploiement réel.

🤖 Generated with Claude Code

burisu and others added 2 commits September 15, 2026 11:56
SSHKit exports the environment inside double quotes (PATH="..."), where a
shell never expands a tilde. With the default asdf_path of ~/.asdf, the two
entries map_bins prepends pointed at a literal ~/.asdf directory that does
not exist, so no asdf shim was ever reachable and the asdf nodejs was not
picked up on deploy.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@burisu
burisu marked this pull request as ready for review September 15, 2026 10:00
@burisu
burisu merged commit 4c268bd into main Sep 15, 2026
1 check passed
@burisu
burisu deleted the DC-5886/expand-asdf-path-in-default-env branch September 15, 2026 10:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant