GitHub Actions中SSH机器nvm安装后无法执行npm install怎么办
解决SSH远程机器中nvm安装后无法使用node/npm的问题
问题描述
在GitHub Actions中通过SSH连接到远程机器,执行nvm安装脚本后,无法调用node命令或执行npm install,尽管检测到nvm已安装。使用的Actions代码如下:
name: SSH Git Clone on: [push] jobs: ssh-git-clone: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Create file on SSH server uses: appleboy/ssh-action@master with: host: '${{ secrets.SSH_HOST_DEV }}' username: '${{ secrets.SSH_USERNAME_DEV }}' password: '${{ secrets.SSH_PASSWORD_DEV }}' port: '${{ secrets.SSH_PORT_DEV }}' script: | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash nvm install node 16.19.0 REPO_DIR="/home/dev/backend" eval `ssh-agent -s` ssh-add - <<< '${{ secrets.SSH_CLONE_KEY }}' rm -rf "$REPO_DIR" git clone ${{ github.event.repository.ssh_url }} "$REPO_DIR" cd "$REPO_DIR" npm install
问题原因
- 非交互式Shell不加载nvm配置:nvm安装脚本会将环境变量写入
~/.bashrc或~/.zshrc,但SSH执行脚本时默认使用非交互式Shell,不会自动加载这些配置文件,导致当前会话无法识别nvm、node、npm命令。 - nvm命令格式错误:
nvm install node 16.19.0的写法不正确,正确格式应为nvm install 16.19.0。 - SSH密钥格式问题:直接用
<<<传递密钥可能导致换行符丢失,进而导致密钥无效。
修正后的脚本
将script部分修改为以下内容:
# 安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 手动加载nvm环境变量,让当前Shell识别nvm命令 export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # 安装指定版本的Node.js nvm install 16.19.0 # 验证Node.js和npm是否可用(可选,用于调试) node --version npm --version REPO_DIR="/home/dev/backend" # 启动ssh-agent并添加密钥,用echo -e保留密钥换行 eval $(ssh-agent -s) echo -e '${{ secrets.SSH_CLONE_KEY }}' | ssh-add - rm -rf "$REPO_DIR" git clone ${{ github.event.repository.ssh_url }} "$REPO_DIR" cd "$REPO_DIR" npm install
关键修正说明
- 手动加载nvm配置:通过导出
NVM_DIR并sourcenvm.sh,强制当前非交互式Shell加载nvm环境,确保node和npm命令可用。 - 修正nvm安装命令:去掉多余的
node参数,直接指定版本号即可正确安装对应版本的Node.js。 - 修复SSH密钥传递:使用
echo -e传递密钥,保留密钥中的换行符,避免密钥格式错误导致Git克隆失败。
另外需要注意:runs-on: ubuntu-latest指定的是GitHub Actions的运行器环境,实际所有Node.js相关操作都是在你通过SSH连接的远程机器上执行,两者环境相互独立,不要混淆。
内容的提问来源于stack exchange,提问作者Tlaloc-ES
相关产品推荐
相关产品推荐

