文档章节

一个节奏极快的创业公司的web前端持续交付心路历程

卢勇福
 卢勇福
发布于 2017/05/02 09:31
字数 2304
阅读 1691
收藏 56

2014年底,我入职一家创业公司,主要负责web方向团队。

需要说明的是,这是一家节奏超快,风格强悍的公司。怎么说呢,就是说今天想出来的点子明天就想,哦不,不只是想!就是明天一定要上线验证的风格。

这种超快的节奏下,与之配套的前端工程化配置却是非常匮乏,于是我们便走上了一段工程化的心路历程。

先来看看我们当时面临的状况:

  1. 产品节奏非常快,明天就要上线(这个刚才已经说过)

  2. 前端只分为pc,mobile两个大工程,这两个平台的所有页面都在这里,耦合严重

  3. 构建,部署测试环境和线上环境基本靠手工。

 

再看看我们开发测试上线的流程:

   1.前端项目全部通过ajax来和后端隔离,所以开发环境完全本地化,本地联调完,部署测试环境进行测试。

   2.运维同学很慷慨的提供了非常多套测试环境(test1~test100),为了安全,测试环境和开发机之间有跳板机(堡垒机)隔离。

   3.部署测试的时候通过grunt test1~tes100 生产测试包(2个包,一个页面包,一个静态资源包),copy到堡垒机,再copy到目标test环境相应目录(也是2个目录)。正式环境则grunt product出正式包,然后copy到跳板机,再copy到op指定机器的指定目录。然后有op(运维同学)操作上线。

  

 以上状况带来了我们在日程开发工作上造成很大的困扰,很多时间被浪费在了部署上:

   1.代码耦合严重,多人维护统一工程加上超快的开发迭代节奏,最后上线的事情只能是刀耕火种,即工程并非能全量上线,每次上线只能手工挑出来本次上线哪些文件

   2.部署完全手工,先copy到跳板机,再到目标机器。重复体力劳动繁重。加上测试环境多,部署起来更是痛苦。

   3.多人维护的项目经常会将不该提交的代码提交或者由于本地构建忘记update而导致上线出问题

   4.测试环境测试过程中经常被覆盖,导致测试时间浪费

 

为了解决这种问题,我们分几步做了以下优化,最终形成了我们的部署系统ideploy.

 

第一步:用部署命令代替手工scp,减少重复体力劳动,告别刀耕火种

          上面我们说过,一开始的构建部署我们完全在一种刀耕火种的方式下进行,来看看我们的部署流程:

首先我们需要在本地构建生成要部署的代码包,然后先scp到堡垒机(跳板机,相信大部分公司为了安全都会有),然后在登录我们的跳板机,然后scp到目标机器。这种工作一次两次还好,每天都这样简直是噩梦。

是到,稍微有经验的人就会想到为什么我们不用shell脚本来做这个事情,这的确也是我们马上就做的.我们通过expect脚本来进行自动完成从本机将代码传到堡垒机再传到目标机器的工作。我们写了一个叫做wdfe的nodejs命令行程序,在本地构建完成后,直接运行wdfe deploy test1就把代码部署到test1上,其他环境类似。这样我们每次构建部署只要2行命令

1. npm run build test1

2. wdfe deploy test1

这个命令行程序大大减少了我们的体力劳动。

 

  第二步:平台初建,先解决现有问题。

    有了命令行程序我们的效率大大提升,但是命令行程序其实有一些局限性,比如:

 1.命令行程序的维护问题,每次更新(有可能是部署目标机器变化等)需要确保每个人都更新版本。

 2.只能全量更新。

 3.本地构建带来一些代码不同步的问题。

有的局限性在我们这样的团队状况下会有很致命的问题。比如由于历史问题,我们的项目工程是一个多人维护的超大工程,并且每天上线好几次的更新速度使得我们只能走部分文件上线这条路(已经不敢全工程上线),所以wdfe deploy这种全工程上线的方式我们短时间内无法实施(产品节奏,人力都是问题),只能用在测试环境。但人工挑出上线文件这种方式的确也是人神共愤,比如有一次修改较多,有人修改了几十个文件,则这个人需要从大工程里手工挑出这几十个文件,出错概率非常大。所以当时上线之后马上补单的事情经常发生。为了解决这个问题(其实说准确点叫缓解),我们用nodejs写了一个部署系统,部署系统会列出来从上次部署到本次部署期间,代码仓库有哪些文件是修改了的。通过界面列出来让部署者选择本次要部署的文件,这样能把这部分体力活减少90%,下面这张图是一个挑选部署文件界面(这个功能被我们一直保留到现在,因为还是有可能在某种特殊的情况下单独部署一个文件):

   

  

  第三步:拆分项目,完善部署平台,让部署变得顺滑。

   通过前面两步我们通过工具和平台,大部解决了我们的当时团队在构建部署上的痛点,减少了大量重复的体力劳动。我们接着进行了第三步,让团队在构建部署上不再耗费心力。

  首先我们看看第二部完成后,团队在工程化上的需求有哪些和我们的解决办法

  1. 支持全量部署,不用挑选部署文件,当然也支持部分文件部署(这个是工程代码组织问题,需要通过拆分项目解决,但是拆分项目到细粒度,就更需要部署平台的支持,比如一键部署多个项目多个机器)

    针对这一条我们组织人力对项目进行拆分成多个子项目,各个子项目间无依赖,可以自行构建自行部署。并且在部署上提供多机器,多项目一键部署功能。

2.测试环境提测以后,有办法解决测试环境覆盖问题

     首先统一收拢部署入口,所有部署必须经过部署平台,然后在部署平台部署完成后给部署人一个选项,是否锁住不让别人部署,解决覆盖问题:

 

3.上线前需要了解本次上线都需要列出来,放心上线

   多人维护的项目,我们在部署的时候总是想确认那些人修改了哪些文件,避免遗漏我们通过提交日志和diff来给部署的同学非常清晰的说明。在部署前的checkout这一步,我们把本次上线到上次上线间,每个成员的修改次数,修改记录,每个文件的变化都列出来,并且可以细致到每一次修改

 

4.方便的添加项目,添加目标机器。

   项目,部署机器的添加修改,都非常简单,增加一个项目和一个目标机器只要几分钟时间。拆分项目,添加修改部署目标机器完全没有心里负担

5.构建和部署无关化,支持项目自由选择技术栈 。

   构建完全有工程自己决定,部署平台只负责调用构建命令,并将构建结果按照规则部署到相应机器的相应目录下

部署平台的部署流程如下:

 

经过这一步,我们基本形成了我们自己的部署工程化体系,构建部署不再是我们团队成员的负担。并且我们还添加了部署统计这样有趣的模块,让大家对我们项目和人员部署情况有一个大概的了解。

 

最后我们其实把这个平台开源出来放到了github上,项目名字ideploy(希望大家爱上部署。。。),希望我们的这些实践能帮到一些跟我们一样有过或者正在经历痛苦的公司:https://github.com/wdfe/ideploy  ,也可以通过底部阅读原文进入项目主页

 

长按下面二维码图片选择“识别图中二维码”关注帝都码仔公众号:

 

© 著作权归作者所有

共有 人打赏支持
卢勇福

卢勇福

粉丝 39
博文 19
码字总数 22106
作品 9
海淀
高级程序员
加载中

评论(16)

toweave
toweave

引用来自“卢勇福”的评论

引用来自“toweave”的评论

为什么不用个git了,即使是服务机也开放了80端口的,我们也是这种情况,我就做了些简化。
本地提交压缩文件目录(附带源码),一起git,merge到master分支上面,然后通过堡垒机直接在服务机git pull 就好了。

回复@toweave : 哦,这个步骤太繁琐了,而且很容易出问题
是的,在代码压缩的时候merge会出现问题,写成脚本,去处理一些简单的事务还是很方便的。
卢勇福
卢勇福

引用来自“曾经的十字镐”的评论

关于项目的开发、测试、上线我也有自己的小心地,主要依赖于docker和 git branch ,目前正在实现当中,可以加QQ:957600300一块研究讨论。
如果不搞 docker,ideploy基本够用,欢迎试用~
曾经的十字镐
曾经的十字镐
关于项目的开发、测试、上线我也有自己的小心地,主要依赖于docker和 git branch ,目前正在实现当中,可以加QQ:957600300一块研究讨论。
卢勇福
卢勇福

引用来自“toweave”的评论

为什么不用个git了,即使是服务机也开放了80端口的,我们也是这种情况,我就做了些简化。
本地提交压缩文件目录(附带源码),一起git,merge到master分支上面,然后通过堡垒机直接在服务机git pull 就好了。

回复@toweave : 哦,这个步骤太繁琐了,而且很容易出问题
toweave
toweave
为什么不用个git了,即使是服务机也开放了80端口的,我们也是这种情况,我就做了些简化。
本地提交压缩文件目录(附带源码),一起git,merge到master分支上面,然后通过堡垒机直接在服务机git pull 就好了。
凝小紫
凝小紫
代码放到码云上呗
卢勇福
卢勇福

引用来自“polly”的评论

引用来自“卢勇福”的评论

引用来自“polly”的评论

引用来自“卢勇福”的评论

引用来自“K不是你的帝”的评论

jenkins貌似可以解决你的问题,我们的运维上线也就是在Jenkins里点一点~

回复@K不是你的帝 : 是的jenkins可以解决问题,但是我们自己搞的这个ideploy(https://github.com/wdfe/ideploy)里面的功能细节还是很好用的,比如列出来上次部署到本次部署的提交更新等等

@卢勇福 diff问题jenkins有,不过还是关注一下你的项目,造轮子锻炼人

回复@polly : 多谢:)

@卢勇福 纯粹探讨,与本项目无关:以前我的项目组也做过类似的事情,但后来思考,增量更新也有弊端,不断的迭代每次都是增量,时间久了,没有一个完全的版本保证可用,所以集成测试还是要周期做的,当然可以持续化集成,你可以考虑到你的项目中

回复@polly : 嗯,我的意见是增量部署尽量不做的,把大项目拆分,全量部署才对,增量部署只有在于主干或者发布分支被污染的情况下做,个人建议
polly
polly

引用来自“卢勇福”的评论

引用来自“polly”的评论

引用来自“卢勇福”的评论

引用来自“K不是你的帝”的评论

jenkins貌似可以解决你的问题,我们的运维上线也就是在Jenkins里点一点~

回复@K不是你的帝 : 是的jenkins可以解决问题,但是我们自己搞的这个ideploy(https://github.com/wdfe/ideploy)里面的功能细节还是很好用的,比如列出来上次部署到本次部署的提交更新等等

@卢勇福 diff问题jenkins有,不过还是关注一下你的项目,造轮子锻炼人

回复@polly : 多谢:)

@卢勇福 纯粹探讨,与本项目无关:以前我的项目组也做过类似的事情,但后来思考,增量更新也有弊端,不断的迭代每次都是增量,时间久了,没有一个完全的版本保证可用,所以集成测试还是要周期做的,当然可以持续化集成,你可以考虑到你的项目中
卢勇福
卢勇福

引用来自“polly”的评论

引用来自“卢勇福”的评论

引用来自“K不是你的帝”的评论

jenkins貌似可以解决你的问题,我们的运维上线也就是在Jenkins里点一点~

回复@K不是你的帝 : 是的jenkins可以解决问题,但是我们自己搞的这个ideploy(https://github.com/wdfe/ideploy)里面的功能细节还是很好用的,比如列出来上次部署到本次部署的提交更新等等

@卢勇福 diff问题jenkins有,不过还是关注一下你的项目,造轮子锻炼人

回复@polly : 多谢:)
polly
polly

引用来自“卢勇福”的评论

引用来自“K不是你的帝”的评论

jenkins貌似可以解决你的问题,我们的运维上线也就是在Jenkins里点一点~

回复@K不是你的帝 : 是的jenkins可以解决问题,但是我们自己搞的这个ideploy(https://github.com/wdfe/ideploy)里面的功能细节还是很好用的,比如列出来上次部署到本次部署的提交更新等等

@卢勇福 diff问题jenkins有,不过还是关注一下你的项目,造轮子锻炼人
灵雀云发布Alauda EE,基于容器面向DevOps应用的新一代PaaS平台

  【IT168 云计算】6月8日,以“云筹帷幄、从容自如”为主题的Alauda EE企业专享版产品发布会如期举行,灵雀云CEO左�h宣布正式发布企业专享版产品“Alauda EE”。   Alauda EE 是灵雀云...

it168网站
2017/06/12
0
0
关于秋招(前端方向)的一些干货

0 一路走来 秋招是我一路走来最坎坷,也是最充实的经历。 收到的几个offer中,令我满意的有微策略和网易杭州研究院这两个前端开发的offer。 1 干货 一个查薪资的网站: offershow(适配了手机...

huangpin815
2017/10/25
0
0
陈鹏飞:“平台型组织”的核心是构建“价值创造型总部”

陈鹏飞简介:他曾是跨国公司的高管,期间放弃高薪,成功创业,用6年时间成功创办一家咨询公司。如今他选择加入更具成长性的AMT平台,成为AMT合伙人。他持续20多年专注流程咨询和信息化咨询,...

玄学酱
05/22
0
0
顶级运维峰会首次登陆广州,Gdevops嘉宾主题曝光

常常听到群友问,为何各种IT大会总是错过广州?各种想参加,无奈距离太远......现在小编告诉你,可以抛开你那幽怨的小眼神了 因为,我们决定:全球敏捷运维峰会(Gdevops)将于9月23日与你相...

DBAplus社群
2016/07/27
0
0
【资料下载】2017北京云栖大会:云效企业级协同研发专场议题揭秘!

阿里巴巴原汁原味的研发协同平台是如何支撑双十一1682亿背后的研发协同?大中型企业如何完成公有云/专有云/混合云转型升级,实现高效协同研发?中国近5000万的中小企业如何保证研发过程的稳定...

云效平台
2017/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

异步化,高并发大杀器

今天来聊聊如何让项目异步化的一些事。 在进入正文之前,顺便给大家推荐一个Java架构方面的交流学习群:698581634,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分...

Java大蜗牛
7分钟前
0
0
织梦dedecms安全设置

网站本身做好防范: 1、修改默认后台名。 打开网站根目录,找到[dede],这个文件夹就是后台的路径,可以随意修改,比如修改为[adminbuy],此时后台登陆的路径为:http://www.*****.com/admi...

雨季2014
7分钟前
0
0
完美Python入门基础知识点总结,看完你的Python就完全入门了!

Python标识符 在 Python 里,标识符有字母、数字、下划线组成。 在 Python 中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。 Python 中的标识符是区分大小写的。 以下划线...

糖宝lsh
13分钟前
0
0
Java关于前后台传输中文乱码以及Excel下载乱码解决

针对乱码,一般情况是前后台以及中间件编码格式不同导致.故需要保证编码格式相同即可. 1.前台页面格式指定,这里用的是jsp,故需要将pageEncoding指定为"UTF-8" 2.指定服务器编码格式,比如用的t...

勤奋的蚂蚁
16分钟前
0
0
Flutter组件 - Flexible

Flexible是一个控制Row、Column、Flex等子组件如何布局的组件。 Flexible组件可以使Row、Column、Flex等子组件在主轴方向有填充可用空间的能力(例如,Row在水平方向,Column在垂直方向),但是...

一箭落旄头
19分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部