关于NodeJs项目发版的一些想法

起因

今天上午把双十二活动相关的页面给上线了,这次的发版,涉及的内容点比较多,上线的时候,没仔细想,打了一个tag就直接在线上git pull,然后活动页挂了…

糟糕的一连串操作

我是用的pm2 list查看的项目的状态,发现状态变成errored才知道出了问题。

这时候一回想才意识到,有些模块没安装。

在本地执行tig -- package.json,快速的查找两个版本之间都安装过哪些模块,然后对应的在线上npm install。但是一直被webpakcuglifyjs-webpack-plugin干扰的没法正常安装。

一狠心,rm -rf webpack直接把webpack给移除了。再次执行安装,还是同样的错误,再找到node_modules/.bin/webpack,移除(后面才知道用npm rm/uninstall 才是更正确的做法)。

webpack的错误总算没了,然后安装又报403的错误,自有的npm服务verdaccio出错了。

这时候终于意识到,问题不是一会儿能解决的,时间来来回回也过了十分钟,赶紧回滚服务到稳定版不:

  1. git checkout v1.18.1,把代码回滚到之前稳定版本。
  2. 修改pm2的配置文件ecosystem.config.js,配置关闭watch模式,这样后面安装模块和分支切换不会干扰正在运行的服务
  3. pm2 restart来重启服务,顺利关闭watch模式,服务本身也没有报错。

回滚完成。

接下来先是登上内网服务器来修复npm服务的问题:

  1. ps aux | grep verdaccio找到verdaccio的进程号,kill掉
  2. verdaccio & 重启verdaccio
  3. 在线上尝试npm install一个模块,还是有问题
  4. 发现线上访问npm服务用的域名是之前废弃的
  5. 编辑~/.npmrc 调整相关配置
  6. 再次安装,成功通过

现在npm服务正常,开始来面对之前出现的webpack出错的问题。我这个是线上服务器,是用不上webpack的,在安装模块的时候,出现这样的问题,很不正常。

Google了一下,发现可以用npm install --only=production来让npm只安装package.json里面dependencies部分的模块。

编辑package.json,整理dependencies和devDependencies,使得对应的模块在对应的分类中。

执行npm install --only=production安装所有更新,之前查package.json的编辑历史那一步是多余的。

更新完毕之后,

  1. git checkout .去掉所有临时修改的文件。
  2. git checkout master回到master分支
  3. pm2 restart来重启服务
  4. pm2 listpm2 log来检测状态和日志

一切正常,完成上线。

后续操作

在本地,重新审查了一遍package.json,一个模块一个模块的查找,去掉代码里面已经没有使用的模块,划分清除相关模块归属。

编辑ecosystem.config.js,配置development环境里面开启watch模式,production环境禁用。

打tag。

整个操作算是完成。

总结

这次的发版算是一次当头棒喝,在尝试用NodeJs来做后端的前台服务这么久,一直顺风顺水,有点忘却应有的严谨。

后端代码的线上环境没法跟前端这样明确,很多时候一个git pull没法解决所有问题。

需要一个持续集成的好的工作流。

这次出问题的一个主要原因就是太长时间的一个大的任务分支,导致整个项目跨度太大,这样在合并主分支并上线的时候风险自然就大了。

下次上线,一个正确的更新应该类似这样:git pull;npm install --only=production;pm2 restart {server}

还是不打算把node_modules/目录的内容放到git仓库里,虽然这样可以保证模块的同步,可是会增加仓库的体积,也会对其他成员的开发环境造成干扰。

或许可以考虑用Docker来包裹服务,保证其代码和环境的一致性。