起因
今天上午把双十二活动相关的页面给上线了,这次的发版,涉及的内容点比较多,上线的时候,没仔细想,打了一个tag就直接在线上git pull,然后活动页挂了…
糟糕的一连串操作
我是用的pm2 list
查看的项目的状态,发现状态变成errored
才知道出了问题。
这时候一回想才意识到,有些模块没安装。
在本地执行tig -- package.json
,快速的查找两个版本之间都安装过哪些模块,然后对应的在线上npm install。但是一直被webpakc
的uglifyjs-webpack-plugin
干扰的没法正常安装。 一狠心,rm -rf webpack
直接把webpack给移除了。再次执行安装,还是同样的错误,再找到node_modules/.bin/webpack
,移除(后面才知道用npm rm/uninstall 才是更正确的做法)。
webpack的错误总算没了,然后安装又报403的错误,自有的npm服务verdaccio
出错了。
这时候终于意识到,问题不是一会儿能解决的,时间来来回回也过了十分钟,赶紧回滚服务到稳定版不:
git checkout v1.18.1
,把代码回滚到之前稳定版本。- 修改pm2的配置文件
ecosystem.config.js
,配置关闭watch模式,这样后面安装模块和分支切换不会干扰正在运行的服务 - 用
pm2 restart
来重启服务,顺利关闭watch模式,服务本身也没有报错。
回滚完成。
接下来先是登上内网服务器来修复npm服务的问题:
ps aux | grep verdaccio
找到verdaccio的进程号,kill掉- verdaccio & 重启verdaccio
- 在线上尝试npm install一个模块,还是有问题
- 发现线上访问npm服务用的域名是之前废弃的
- 编辑~/.npmrc 调整相关配置
- 再次安装,成功通过
现在npm服务正常,开始来面对之前出现的webpack出错的问题。我这个是线上服务器,是用不上webpack的,在安装模块的时候,出现这样的问题,很不正常。
Google了一下,发现可以用npm install --only=production
来让npm只安装package.json
里面dependencies
部分的模块。
编辑package.json,整理dependencies和devDependencies
,使得对应的模块在对应的分类中。
执行npm install --only=production
安装所有更新,之前查package.json的编辑历史那一步是多余的。
更新完毕之后,
git checkout .
去掉所有临时修改的文件。git checkout master
回到master分支- 用
pm2 restart
来重启服务 - 用
pm2 list
和pm2 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来包裹服务,保证其代码和环境的一致性。