完全隔离的前端交付环境
随着业务线和开发人员越来越膨胀,之前使用的开发交付环境,越来越低效了。之前的开发交付流程是,在线上准备一台test机器,根据nginx配置,为每个开发人员配置三级域名,分配ssh账号,并指定文件路径。
例如:
- 开发人员小张
- test机器目录:xiaozhang
- 域名:xiaozhang.test.com的域名
- ssh:账户、密码
具体应用:根据phpStorm的deployment下Automatic uploda功能实现代码同步上传到测试服务器。 开发流程是,开发人员本地使用IDE的代码同步功能,将代码同步到test服务器的指令目录上,然后根据对应域名进行验收调试。
单人交付流程是,开发人员将代码提交到git上,使用ssh登录test服务器,找到自己目录,进行git pull的操作,然后将对应域名提交给测试验收。
多人合作的交付模式是,合作的开发人员,将代码合并到一个分支下,使用ssh登录到test服务器,找到test的公共目录,进行git pull 的操作,然后将公共目录的域名提交给测试验收。

就如gif所示,红球代表人为操作,是一种粗暴的串联的模式。每一个节点都不能中断。
对于test机器而言,维护成本的加大,想团队人数暴涨时,每个人都在test机器上开发调试,对机器性能的要求会逐步拔高。
开发调试的不便捷性,前端开发中每个人都会起一个webpack -w命令,这个命令执行在test机器上,当5个人同时执行webpack -w命令时,就会造成服务器卡顿。而且后端的服务也是部署在test中,这样完全就是所有人的资源全部都集中在test机器了。
交付的不便捷性,虽然每个人都独享一个子域名,可以交付测试,但是开发人员在交付一个需求时,下一个需求也是在同时开发是,经常发生开发人员一个断点调试,就会打断所有测试流程。
业务和开发人员强耦合,所有项目都集中在一个git分支上开发,这样在发布上来说,一次就会带上所有业务,如果希望切换业务,那就要创造多个分支,并且开发人员交付时,要在test机器上切换多个分支,供给多个测试。
这个流程是串联的,只有等待上一个需求测试完成,才能切换下一个需求,效率低下。 好吧,是时候开始完全剥离开发环境、交付环境,并且同时创造ci/cd的流程。
需求很简单:
- 开发和交付环境分离
- 交付环境可以串联存在
- 提供ci/cd流程,支持前端一件化打包
- 交付环境根据业务划分
我们开始划分开发环境和交付环境的分离,现在开始限制,开发环境一律在本机进行,所有的前端请求都是使用webpack的devServer功能作为转发。交付环境在test机器上。
交付环境的串联存在and交付环境根据业务划分,首先我们观察域名,我们一般使用的域名是三级域名,在这个基础上我们扩展为四级域名,例如:“a.test.xxx.com”,域名中的a,我们在nginx配置中重写server_name配置。

其中$root为机器路径,这样我们就将域名层面的切分,业务文件夹的切分,做完了。然后就是思考subdomain的命名规则了,这完全就可以取分支名来作为命名,根据开发要求来说,分支名和业务应该是关联的,这样就可以满足交付环境根据业务划分,并且为了保证业务名的不重复性。都将定期清除,test的交付目录下的业务目录。
核心的方案已经确定,最后就到了落实环节了,选型那就是使用jenkins了。使用pipeline构建方案,Git Parameter Plug-In插件可以保证获取到git分支,pipeline的语法完全就可以保证我的需求。 来说说jenkins的具体实现,parameters中使用gitParameter,让开发人员自主选择分支,并且设置name,例如:“BRANCH”。

这样就保证了获取到具体的分支名称接下来划分一下stages流程主要划分为4个流程,start阶段、build阶段、post test阶段,分别对应的功能是,start阶段pull对应分支代码,build执行npm命令,post test阶段将代码压缩发送test机器。
这里主要讲解一下,post test阶段,当前端打包之后会产出一个dist文件夹,这里面就是我们要发送到test机器的文件夹。
那么我们可以分阶段了:
- 打tar.gz压缩包
- 删除远程机器的以“BRANCH”为名的目录
- 发送tar.gz压缩包制定目录
- 解压文件
- 删除远程压缩包

上述就是一个post test阶段的完整流程,这里我们会使用到pssh、pscp.pssh这两个命令,pssh让我们登录远程机器,删除远程机器的以“BRANCH”为名的目录,并且执行压缩命令。pscp.pssh可以发送文件到远程机器,到指定目录下。

简单回顾一下,git中红球代表人为操作,黄球代表机器自动操作。
在本地开发环境中,开发人员可以保持在本地机器开发,提交或者拉取代码即可,跟线上任何服务都无关联。
在交付测试流程中,开发人员只需要去jenkins上选择想构建的branch,剩下的流程,Jenkins都会操作,包括git pull branch、npm build、pssh/pscp.pssh发送到指定机器生成对应branch的文件夹,根据nginx配置的特性,线上也会对应出现符合要求的四级域名。
这个时候我们的一个,使用jenkins构建的,完全隔离的交付环境就这样完成了,又可以愉快的开发了,嘤嘤嘤。
想找我深入了解的话,可以来这里哟(。・ω・。)
