iT邦幫忙

0

真相篇-Github actions bash: npm: command not found when on ssh

前言

上次我發表的這篇bug實在太雷了「
鄉民篇-Github actions bash: npm: command not found when on ssh」,覺得網路上的方法無法讓我真正了解問題的根本,所以我去挖掘真相,要跟大家來報告。

本系列目標

本系列所分享的bug實在太雷所以分2篇寫解法,分別是我在網路上找到鄉民寫的類似問題的解法,以及後期我自行去挖掘真相後自己的解法

環境:Ubuntu 18.04.4 LTS (GNU/Linux 5.3.0-1026-gcp x86_64)

原因是VPS上的系統環境變數的關係,SSH login角色不同會讀不同的設定檔案,我是參考這篇才得來靈感。同樣是$env取得$PATH,同樣是取得/usr/bin/env但是有沒有加sudo值就有差異。login shell去SSH到VPS直接輸入:

$env


如果是輸入:

$sudo env

sudo的角色明顯環境變數值短很多

安裝nvm, npm

我按照這篇文章安裝nvm及npm,然後他會在VPS的~/.bashrc幫我的$PATH增加npm指令路徑

export NVM_DIR="/home/zen_master/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

裝完後我的npm指令位置

which npm

原來npm執行指令在這兒:/home/zen_master/.nvm/versions/node/v12.14.0/bin/npm
重點來了,下面來了解什麼情況$PATH才能加載~/.bashrc設定檔的環境變數

/usr/bin/env環境變數的$PATH會因為加載設定檔而不同值

設定檔(~/.bashrc,/etc/bash.bashrc,/etc/profile,~/.profile)都可以設定增加環境變數值,因為SSH的login方式不同而加載不同的設定檔,算算後,一共有四種組合:

  • login shell:
    • 取得 bash 時需要完整的登入流程的,就稱為 login shell
  • non-login shell:
    • 取得 bash 接口的方法不需要重複登入的舉動
  • interactive 交互式Shell:
    • 提供了命令提示符可以輸入命令
  • non-interactive 非交互式Shell
    • 可以透過bash -c 「CMD指令」

GitHub actions透過yml檔案去做CI/CD指令在VPS上,這樣的操作是「non-interactive + non-login shell」

四種默認配置組合

  • 「non-interactive + non-login shell」會加載/etc/bash.bashrc,~/.bashrc
  • 「interactive + non-login shell」會加載/etc/bash.bashrc,~/.bashrc
  • 「interactive + login shell」會加載/etc/profile,/etc/bash.bashrc, ~/.profile,~/.bashrc
  • 「non-interactive + login shell」會加載/etc/profile,/etc/bash.bashrc, ~/.profile,~/.bashrc

明明有讀~/.bashrc為什麼沒有辦法執行npm指令啊?

都確認有加載我要的~/.bashrc,那為什麼還是會npm command not found/usr/bin/env: ‘node’: No such file or directory
https://ithelp.ithome.com.tw/upload/images/20200714/20121402C5unt0beBM.png

逐一確認以下步驟

  • step1. 檢查logout的時候npm一定也要執行在VPS背景中,我先綁定一個npm版本12.14.0
nvm alias default 12.14.0
  • step2. 打開VPS上的~/.bashrc查看裡面這行有沒有註解掉,如果沒有註解這幾行會影響當我們在使用non-interactive的時候SSH,程式就直接跳掉不會繼續往下執行。
    https://ithelp.ithome.com.tw/upload/images/20200714/20121402KHicvJEuLB.png

If not running interactively, don't do anything
上面這個註解就是說「如果跑在non-active的時候,就不做任何事了」(但我們就是需要啊!!)

成功

https://ithelp.ithome.com.tw/upload/images/20200714/20121402MuyabWdEtd.png

注意:不能加sudo喔,不然就又會是讀取另一個角色的環境變數值


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言