今年4月份,开始自己的第二份工作,习惯了老东家如丝般的发布体验,一下子感觉来到了“原始社会”。 首先这是一篇长文,主要介绍自己在做自动发布这个过程的一些思考。
引用玉伯的 Web研发模式演变 来说,现在我们处于 - Web1.0时代:
遇到这种情况,首先会想到的肯定是前后端分离。但考虑到目前的人员、技术储备情况,直接过渡到基于NodeJS的全栈式开发,阻力大,周期长,很可能会难产。
而我们首要要 解决的问题
是:
所以我们暂时先做到 前后端物理分离
,大致如 - Web2.0时代
我们先从开发、发布流程来看我们最终希望的结果是什么,然后再分析如何完成这一目标
首先聊一下一般发布的流程:
这是一些纯体力活,要保证步骤顺序和正确性,容易出问题,而且没有记录和日志,所以一般做权限控制,发布个普通需求还要找对应的同学发布,变更麻烦
所以发布必须 自动化
,网上搜前端自动化发布,大多数的结果都是Jenkins + githook ( Jenkins+github 前端自动化部署 )
其核心原理主要是通过
但是如果我想要查看发布记录、回滚、控制发布流程,看起来Jenkins就帮不上忙了(可能有对应的插件,没深究)
同样的发布脚本,用node也能执行,所以我们打算使用node来写一个 发布集成服务
来代替Jenkins,它可以做更细致的控制:
所以我们的发布自动化主要做三个东西
该CLI是一套标准的前端开发生命周期命令,通过几个子命令去完成前端开发流程的各个任务,包含了:
vue-cli init
,不过比较入门简单(因为暂时业务的体量并不需要频繁创建新项目) npm run dev
,也不是重点 关于CLI的开发参考 -如何用Node开发CLI 主要是:commander +inquirer
从此发布就变成了一个命令的事
发布平台提供了比CLI更多的功能:
到了重头戏,这里就介绍一些概念
首先,最终代码部署到服务器肯定都是通过scp等命令来同步文件到服务器,因为 权限问题 ,通过云端统一管控是比较靠谱的。
然后,每个人的机器环境都不一样,有可能在A这构建成功,在B那却构建失败(比如A添加了一个依赖,但没有保存dependencies),所以以统一的环境来编译构建,可以 避免因为环境问题引起的构建问题 。
最后,需要一个地方去 统一管理发布记录 ,避免发布冲突,记录发布日志,方便回滚操作等。
每个人都基于Master拉取自定义分支开发,最终通过发布自动同步到Master分支,保证开发时都是基于最新的线上代码,同时发布时做冲突检查,保证发布安全。
发布过程的分支变化如下:
在整个发布过程,我们的代码要通过日常、预发测试才能最终上线,这个过程是需要占用对应服务器并保持稳定,需要避免出现其他同学发布覆盖的情况,所以我们使用MongoDB来维护 发布记录
,实现发布控制和流程控制
发布控制当指定发布环境有一个项目发布时,该环境被占用,其他项目发布会提示 有其他项目发布,联系对应的发布同学
,双方根据重要性来决定是否退出发布让后来的项目先上
流程控制为了保证最终上线的代码是正确运行的,整个过程需要测试和Code Review,必须通过 测试、审核
才能进入下一个环节
发布脚本需要执行上面提到一系列的过程,这需要一个等待的过程,我们需要实时给发布同学提供发布反馈(发布流程、成功与否),并将相关信息保存到日志。所以发布过程通过soket.io建立socket链接,集成发布服务有任何流程变化都会反馈
同步服务器可以使用 scp 或 rsync 命令,关于它们的介绍和不同看这个
这两个命令通过ssh同步,都需要在执行命令后输入密码,所以需要 配合expect来实现自动同步
最终整个服务选用了:express + socket.io + mongodb,这里就不赘述了