2017-04-13 90 views
4

在我有一個shell腳本執行更新重新啓動我的應用程序在遠程服務器的持續部署方面不能在shell腳本運行NPM

的腳本是:

ssh [email protected] <<'ENDSSH' 
cd /opt/myapp 
git pull 
npm i 
forever stop src 
npm run staging 
ENDSSH 

輸出爲:

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 

注:

  • 一切工作,如果我ssh到遠程服務器並輸入這些命令手動

  • 節點和故宮都安裝了NVM在遠程服務器上 which npm/root/.nvm/versions/node/v6.10.0/bin/npm

+0

所以它看起來像你試圖使用npm與nvm。您是否曾嘗試在腳本中運行nvm命令來選擇版本?在運行npm之前? – wheeler

+0

@wheeler在腳本中添加了'nvm --version'。得到'-bash:第3行:nvm:找不到命令' – Jordane

+0

當你在用戶使用的'連續部署上下文'中執行時 - 與ssh相同?通過輸入'node --version'確保節點對CI用戶可用# – GreensterRox

回答

2

如果您nodenpm安裝在/root/.nvm/versions/node/v6.10.0/bin然後將此添加到您的腳本應解決問題:

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

替代品y您可以嘗試使用像絕對路徑:

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

等,但,如果您從二進制包從源代碼安裝,而不是你的節點,然後在npm的二進制文件家當線很可能會#!/usr/bin/env node將無法​​正常工作當節點在PATH正確的版本 - 看到這個答案的詳細信息:

當從源安裝節點時,npm將具有正確的shebang行,其絕對路徑爲node二進制文件,並且可以在node不在PATH中時使用。

+0

'PATH =「/ root/.nvm/versions/node/v6.10.0/bin:$ PATH」'解決了我的問題 – Jordane

0

不要做什麼@rsp建議,而不是硬編碼的版本 你應該source NVM這樣的腳本:

. /root/.nvm/nvm.sh 

如果設置了默認的NVM應該可以解決的版本供您, 這樣你就不會因爲你更新到更新的NodeJS版本而回到那個腳本。