NVM在Jenkins执行shell时无法工作

16

我想在Ubuntu服务器上使用Jenkins执行shell脚本安装和使用nvm,但是我遇到了以下错误:

16:00:21 /tmp/hudson5983664925305072739.sh: 第8行:nvm:找不到命令

我已经尝试了以下方法,但都没有成功:

#!/bin/bash

touch ~/.profile && source ~/.profile;
nvm current || echo "SSH NVM is being installed" &&  touch ~/.profile && curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh -o install_nvm.sh && bash install_nvm.sh && source ~/.profile

echo "checking nvm"
bash ~/.nvm/nvm.sh;
nvm --version || exit 1;

Jenkins执行Shell脚本截图:

输入图片描述

4个回答

22

加上这些就解决问题了:

. ~/.nvm/nvm.sh
. ~/.profile
. ~/.bashrc

6
你可以只使用. ~/.nvm/nvm.sh命令,而其他两个命令可能会配置比你需要的更多或更少(在某些情况下,如果当前shell是非交互式的,即运行shell脚本,则.bashrc文件会提前退出)。 - RichVel
@RichVel,是否有可能在多个sh调用之间使用它? - velop
1
Jenkins在每个sh命令中都会运行一个单独的进程,因此您需要找到一种解决方法。如果您使用的是Ubuntu,可以考虑使用ENV环境变量指向由dash shell(默认为/bin/sh,请参见man sh)运行的脚本 - 但您需要确保Jenkins以某种方式运行/bin/sh作为登录shell。也许另一个答案中提到的NodeJS插件是更好的探索路线。 - RichVel
注意:当你在Consul输出中使用. ~/.bashrc时,你会看到很多无用的日志。为了消除这些行,你应该在. ~/.bashrc之前使用set +x - Mohammad Ravanbakhsh

9

您需要记住,Jenkins在非交互式Shell中运行命令,因此PATH与普通用户不同。解决此问题的一种方法是使用其绝对路径调用nvm。


nvm 是一个 shell 函数。即使 PATH 正确,它也无法工作。 - toraman

7

5

我没有完全得到我想要的答案,但两者都引导我找到了显而易见的解决方案,而这个解决方案甚至在 nvm 的 README 中都有说明。Jenkins 的 shell 脚本中没有路径,因此它找不到可执行文件。

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm

为了找出你的$HOME,你可以运行echo $HOME。例如,$HOME可能是这个样子的:
export NVM_DIR="/var/lib/jenkins/.nvm"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接