You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSH本地可执行npm命令,CircleCI部署管道找不到node/npm

问题分析

本地SSH登录服务器时node/npm可正常使用,但CircleCI通过远程SSH执行sudo bash deploy.sh时提示命令找不到,核心原因有两个:

  • 远程非交互式SSH会话的PATH环境变量和本地交互式登录会话不一致,node/npm的安装路径不在默认的PATH中
  • sudo默认会重置环境变量,即使远程会话能找到node/npm,sudo执行时也会丢失相关路径
解决方案

方案1:使用node/npm的绝对路径

  1. 本地登录服务器,执行以下命令获取node和npm的绝对路径:
which node
which npm
  1. 修改deploy.sh,把node和npm替换成对应的绝对路径,比如:
#!/bin/bash

echo "Starting deploy"
cd ~/apps/clm/core
git pull

# 替换成你拿到的绝对路径
/usr/local/bin/node -v
/usr/local/bin/npm -v
echo "Deploy end"

方案2:让sudo保留环境变量

修改CircleCI配置中的SSH命令,给sudo加上-E参数(保留当前环境变量),同时确保远程会话加载正确的环境配置:

version: 2.1

jobs:
  pull-and-build:
    docker:
      - image: arvindr226/alpine-ssh
    steps:
      - checkout
      - run: ssh -o StrictHostKeyChecking=no ubuntu@xx.xx.xx.xx "cd ~/apps/clm/core; sudo -E bash deploy.sh"

workflows:
  version: 2
  build-project:
    jobs:
      - pull-and-build:
          filters:
            branches:
              only:
                - Desenvolvimento

如果node是通过nvm安装的,需要在deploy.sh开头加载nvm的环境:

#!/bin/bash
source ~/.nvm/nvm.sh
echo "Starting deploy"
cd ~/apps/clm/core
git pull

node -v
npm -v
echo "Deploy end"

方案3:修改sudo的secure_path

通过visudo命令编辑/etc/sudoers文件,将node/npm所在的路径添加到secure_path中(比如node在/usr/local/bin):

Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

确保路径包含node/npm的安装目录,保存后sudo执行时就能自动找到命令。

内容的提问来源于stack exchange,提问作者Gabriel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:45:30