之前项目部署都是ssh登陆到服务器,手动执行更新代码、关闭已启动的应用实例、启动应用实例。如果有多台机器的话,效率上就有点偏低了。后来发现阿里云有CodePipeline产品,可以用来做持续集成。配置好后,在web界面里点一下就能一键部署,甚至部署到多台机器。过程中也遇到了一些问题,现记录下。
问题1
首先是项目依赖bcrypt,这个包构建依赖于python,但nodejs的构建机环境是没有python的。解决方式是自己提供python
wget https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tar.xz
tar -xf Python-2.7.15.tar.xz
export PATH=$PATH:$WORKSPACE/Python-2.7.15/bin
npm install
rm Python-2.7.15.tar.xz
rm -rf Python-2.7.15
复制代码
下载python蛮费时间的,我最后选择把python压缩文件包加到仓库里。
问题2
CodePipeline整个流程是这样的,先在构建机构建,完成后上传到oss,最后下载构建好的项目到目标机器上部署。npm install安装是在构建阶段执行的,会symlink包的执行文件到node_modules/.bin下,但是在目标机器部署时,symlink就失效了。所以执行npm scripts时就会报错。
解决方式有两种,首先是直接执行node_modules下包的js文件
"scripts": {
"start": "EGG_SERVER_ENV=prod egg-scripts start --daemon --title=egg-server-lvcaixin-user",
"startCI": "EGG_SERVER_ENV=prod node ./node_modules/egg-scripts/bin/egg-scripts.js start --daemon --title=egg-server-lvcaixin-user"
}
复制代码
当然这样就需要为持续集成新增一个命令。
还有种方式是重新生成node_modules/.bin下的文件。
看了下npm的相关文档,发现npm build会在npm install之后执行,做一些link相关的工作,刚好解决上门的问题,当时实际在背后做这事的是bin-links。
npm build node_modules/egg-scripts
npm run stop
npm run start
复制代码
问题3
在部署阶段执行的脚本,是不会影响CodePipeline作业的构建状态,也就是说部署阶段的脚本出错了,CodePipeline作业的构建状态还是成功的。
这个显然是不符合常理的,我也特意提工单,问了下工作人员。工作人员回复说是异步执行的技术原因,需要进一步的排期。