今天想将一个angular的项目用jenkins来进行发布,但是无论怎么配置,jenkins运行shell的时候使用的是node 6.11
,而不是node 8.11
,但angular项目是只能运行在node 8.9
及以上,这就很绝望,咋办?
检查了创建的发布项目是绝对没问题的,谷歌了半天,也没发现什么值得参考的消息,只能自己看了。
在服务器里面查看node的版本:
1 | node -v |
再查看node的路径:
1 | which node |
然后查看jenkins里面node的路径,让jenkins执行shell的时候里面添加语句:
1 | echo $PATH |
发现输出的是:
1 | + echo /sbin:/usr/sbin:/bin:/usr/bin |
得,就是没有/usr/local/bin
,那咋办?
我们先看看usr
是指Unix System Resource
,而不是User
。通常/usr/bin
下面的都是系统预装的可执行程序,而随着系统升级而改变。/usr/local/bin
目录是给用户防止自己的可执行程序的地方,不会被系统升级而覆盖同名文件。如果两个目录下有相同的可执行程序,谁优先执行受到PATH
环境变量的影响。
那么再看看我服务器里面的$PATH
:
1 | echo $PATH |
果然啊,服务器里面正常使用node 8
是因为环境变量里面,/usr/local/bin
在/usr/bin
之前,而在jenkins里面,jenkins的环境变量/usr/local/bin
在/usr/bin
之后,所以在jenkins里面使用的node是/usr/bin
里面的node 6
。
ok,知道原因了我们可以得到解决办法,/usr/bin
里面的node我们是不用删的,我们只需要在jenkins里面的环境变量之前加上usr/local/bin
就ok了。
怎么加?
谷歌一下,你就知道。然而我谷歌了好久,都没一个具体的方法。尝试了在系统管理的节点那里添加环境变量来着,添加成功了,但是测试发布了一下,并没有起作用。
还是粗暴点,使用export
命令。
export
命令可以新增、修改或删除环境变量,供后续程序使用,我们希望使用/usr/local/bin
来替换默认的那些环境变量,所以直接:
1 | export PATH=/usr/local/bin:$PATH |
我们在执行发布shell的时候,在export
之前和之后分别来输出下环境变量,可以看到,在执行export
之前是默认的/usr/bin
,在执行export
之后是我们系统里面的/usr/loca/bin
。而且我们发布也正常了,good~
归根结底,是jenkins的环境变量读取的问题,奇诡了,之前也发布过,没这个问题,怎么忽然就这样了。。。。问题已解决,就是在执行shell之前先执行export
命令修改环境变量为/usr/local/bin
。
啊,我这该死的,机智~😌