需求描述
最近添置服务器 之前只有一个的时候使用比较原始的方式:
- 手动ftp上传文件
- ps -ef|grep node* 找到在后台运行的node项目 kill这个进程
- 进入项目目录 nohup npm start &启动
这样重复的工作在数量少的情况下没感觉什么。一旦要几台服务器做负载均衡的时候,就显得比较繁琐了。
于是开始尝试用jenkins自动构建
测试环境 Jenkins+JDK8+win10 nodejs5.0.0 SVN1.8
遭遇和解决的一些问题
网上这方面的资料比较少,主要是这么奇葩的搭配
Jenkins本身是Java编写的对maven有支持,不过我这边是node没啥卵用。
网上随便搜了一篇教程跟着写踩了几个坑记下来防止再坑
前面一切正常,新建job选择了自由风格 就是第一项。
问题1:
因为是Windows系统 增加构建步骤的时候不要选择 execute shell,而应该选择execute Windows batch Command 小问题
问题2:
在execute Windows batch Command 写入(express4.0模块的启动命令)
cd mytestnpm start
然后构建运行。。。
问题来了,根本停不下来啊!服务完全启动了但就是不报构建成功。(一直是红色圆圈)
进控制台看log, 一切正常,各种请求都能响应。
这应该是jenkins判断任务完成的机制的问题。百度了半天未果。
然后找了半天在界面上发现了这个(机翻注意)
为建设项目运行一个窗口批处理脚本。该脚本将以当前目录的工作区作为运行。你在文本框中输入的文本将作为一个批处理文件执行,并将被认为是失败如果在执行%errorlevel%不是0。如果在供应链管理中已经有一个批处理文件,可以在批处理文件中键入路径(相对于工作区目录),并且简单地执行。
问题一下子明白了 ,输入的命令的返回结果不是0
在cmd中输入
echo %errorlevel%
就能打印错误码了。
关于命令的返回码 可以参考这篇文章 点击打开链接
继续输入
npm start
因为是在Windows上前台启动,这时候如果无法打印输出 %errorlevel% 控制台在打印log状态,是不是可以认为是没有返回呢?或者说没有返回0?
于是考虑转为后台启动,Windows上后台启动就无法使用nohup了。而且nohup的启动方式关闭时也不方便用统一的脚本重启。
这就是node这边代码的问题了,想着干脆一步到位把守护进程也加上吧 找到了forever和pm2这两个模块。
测试之后(使用环境为centos)发现pm2的似乎功能能强大一点,比较遗憾的是Windows上使用pm2有些问题,无法正常启动,于是改成用forever (全局安装)
npm install forever -g
forever命令无法接npm start了,只好用 forever start bin/www的形式。
这里注意不要进入bin目录去start www。因为node中如果使用相对路径,可能会把根目录对应到启动位置,而默认的npm start的启动位置是bin那一级,可能会出现读不到对应资源的情况。
于是execute Windows batch Command中的内容变成了这样
cd mytestforever start bin/www
这里有个问题是可能会报错forever 不是内部命令
这是由于Jenkins使用系统环境变量而不是某个用户的环境变量,forever命令所在的目录(就是npm目录)可能不在系统的环境变量中,会导致上述错误。
配置完成后,点击构建 执行 蓝色圆圈 构建完成
一个简单的本地测试项目的就完成了