web-dev-qa-db-fra.com

Impossible d'exécuter npm dans un script Shell

Dans un contexte de déploiement continu, un script Shell est exécuté pour mettre à jour et redémarrer mon application sur le serveur distant

le script est:

ssh user@myserver <<'ENDSSH'
cd /opt/myapp
git pull
npm i
forever stop src
npm run staging
ENDSSH

la sortie est:

stdin: is not a tty
Already up-to-date.
-bash: line 3: npm: command not found
-bash: line 4: forever: command not found
-bash: line 5: npm: command not found

Remarque:

  • tout fonctionne si je ssh sur le serveur distant et saisis ces commandes manuellement

  • le noeud et npm sont installés avec nvm sur le serveur distant which npm donner /root/.nvm/versions/node/v6.10.0/bin/npm

10
Jordane

Si vos node et npm sont installés dans /root/.nvm/versions/node/v6.10.0/bin puis l'ajout à votre script devrait résoudre le problème:

PATH="/root/.nvm/versions/node/v6.10.0/bin:$PATH"

Vous pouvez également essayer d'utiliser des chemins absolus comme:

/root/.nvm/versions/node/v6.10.0/bin/npm install

etc. mais notez que si vous avez votre Node installé à partir des paquets binaires et non des sources, alors votre ligne Shebang dans le binaire npm sera probablement #!/usr/bin/env node qui ne fonctionnera pas lorsque la version correcte de Node dans le CHEMIN - voir cette réponse pour plus d'informations:

Lorsque Node a été installé à partir des sources, alors npm aura une ligne Shebang correcte avec un chemin absolu vers le binaire node et peut être utilisé wven lorsque node n'est pas dans le CHEMIN.

5
rsp

Ne faites pas ce que @rsp a suggéré, plutôt que de coder en dur la version, vous devriez source le script NVM comme ceci:

. /root/.nvm/nvm.sh

NVM devrait résoudre la version pour vous si vous définissez la version par défaut, de cette façon vous ne reviendrez pas à ce script simplement parce que vous avez mis à jour vers une version plus récente de NodeJS.

2
TheCodeDestroyer

J'étais confronté au même problème à Jenkins.

Les lignes suivantes étaient en bas du fichier .bashrc, je viens de mettre en haut du fichier .bashrc

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
1
Shree Prakash