【问题标题】:SSH and execute command for CISSH 和 CI 执行命令
【发布时间】:2019-06-10 17:15:08
【问题描述】:

我有一个 CircleCI 配置,最后有一个部署脚本。该命令应该通过 SSH 连接到服务器,移动到一个目录并执行一个 NPM 脚本。它看起来像这样:

ssh -o StrictHostKeyChecking=no ubuntu@xx.xx.xx.xx "cd /var/www/example.com && npm run restart_qa"

这会引发以下错误:

bash: npm: command not found

这表明服务器上没有安装 NPM,但它是。为了测试这一点,如果我单独运行这些命令,它们就可以工作。例如

ssh -o StrictHostKeyChecking=no ubuntu@xx.xx.xx.xx
cd /var/www/example.com
npm run restart_qa

那么这里有什么问题呢?

【问题讨论】:

  • npm 文件应该在 /usr/local/bin/npm 中。关注这个link
  • @jwatts 我不知道为什么这很重要。如果我通过 SSH 登录,则单独运行它可以工作的 npm 命令。所以 npm 存在于服务器上,它使用普通的 npm 命令运行。为什么我需要在命令中声明它的位置?
  • 当您以交互方式 ssh 时,您的 shell 加载的配置文件集与 ssh 运行命令时不同。例如,在 Bash 中,从 ssh 运行命令时不会获取 .bash_profile。检查 npm 安装程序是否使用 PATH 中的 ~/.npm 更新了您的配置文件。例如,将其移至 .bashrc,以便在两种使用场景中都可用。
  • @bishop 好主意!

标签: bash shell ssh command-line circleci


【解决方案1】:

原来这与 npm 和 node 的安装路径有关。我使用 NVM 安装了两者,所以它们不在 shell 脚本所期望的位置。为了解决这个问题,我做了以下事情:

sudo ln -s /home/ubuntu/.nvm/versions/node/v10.13.0/bin/npm /usr/local/bin/npm
sudo ln -s /home/ubuntu/.nvm/versions/node/v10.13.0/bin/node /usr/local/bin/node

【讨论】:

  • 恕我直言,您可以在运行与 npm 相关的特定命令时进行检查,以便在目标服务器(ssh 之一)中不存在的情况下使用可以得到正确的消息。
猜你喜欢
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2011-09-19
相关资源
最近更新 更多