上次我發表的這篇bug實在太雷了「
鄉民篇-Github actions bash: npm: command not found when on ssh」,覺得網路上的方法無法讓我真正了解問題的根本,所以我去挖掘真相,要跟大家來報告。
本系列所分享的bug實在太雷所以分2篇寫解法,分別是我在網路上找到鄉民寫的類似問題的解法,以及後期我自行去挖掘真相後自己的解法
原因是VPS上的系統環境變數的關係,SSH login角色不同會讀不同的設定檔案,我是參考這篇才得來靈感。同樣是$env取得$PATH,同樣是取得/usr/bin/env但是有沒有加sudo值就有差異。login shell去SSH到VPS直接輸入:
$env
如果是輸入:
$sudo env
sudo的角色明顯環境變數值短很多
我按照這篇文章安裝nvm及npm,然後他會在VPS的~/.bashrc幫我的$PATH增加npm指令路徑
export NVM_DIR="/home/zen_master/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
which npm
原來npm執行指令在這兒:/home/zen_master/.nvm/versions/node/v12.14.0/bin/npm
重點來了,下面來了解什麼情況$PATH才能加載~/.bashrc設定檔的環境變數
設定檔(~/.bashrc,/etc/bash.bashrc,/etc/profile,~/.profile)都可以設定增加環境變數值,因為SSH的login方式不同而加載不同的設定檔,算算後,一共有四種組合:
GitHub actions透過yml檔案去做CI/CD指令在VPS上,這樣的操作是「non-interactive + non-login shell」
/etc/bash.bashrc
,~/.bashrc
/etc/bash.bashrc
,~/.bashrc
/etc/profile
,/etc/bash.bashrc
, ~/.profile
,~/.bashrc
/etc/profile
,/etc/bash.bashrc
, ~/.profile
,~/.bashrc
都確認有加載我要的
~/.bashrc
,那為什麼還是會npm command not found
或/usr/bin/env: ‘node’: No such file or directory
nvm alias default 12.14.0
~/.bashrc
查看裡面這行有沒有註解掉,如果沒有註解這幾行會影響當我們在使用non-interactive的時候SSH,程式就直接跳掉不會繼續往下執行。If not running interactively, don't do anything
上面這個註解就是說「如果跑在non-active的時候,就不做任何事了」(但我們就是需要啊!!)
注意:不能加sudo喔,不然就又會是讀取另一個角色的環境變數值