文档章节

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

卢勇福
 卢勇福
发布于 2017/05/02 09:31
字数 2304
阅读 1689
收藏 56
点赞 3
评论 16

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有,不过还是关注一下你的项目,造轮子锻炼人
老王亲述:我的运维心路历程

本文根据高效运维专家群友文章整理并发布。欢迎关注“高效运维”公众号,以抢先赏阅诚意满满的各种原创文章。 嘉宾简介 王津银 他,曾经从业腾讯、YY、UC等知名互联网公司 他,维护的微信订阅...

luoahong ⋅ 2016/01/26 ⋅ 0

灵雀云发布Alauda EE,基于容器面向DevOps应用的新一代PaaS平台

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

it168网站 ⋅ 2017/06/12 ⋅ 0

关于秋招(前端方向)的一些干货

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

huangpin815 ⋅ 2017/10/25 ⋅ 0

陈鹏飞:“平台型组织”的核心是构建“价值创造型总部”

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

玄学酱 ⋅ 05/22 ⋅ 0

【资料下载】2017北京云栖大会:云效企业级协同研发专场议题揭秘!

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

云效平台 ⋅ 2017/12/11 ⋅ 0

开源图书--《全栈增长工程师指南》

依据在《Repractise简介篇:Web开发的七天里》中所说的 Web 开发的七个步骤而展开的电子书。当然它也是一个 APP,它一本关于如何成为全栈增长工程师的指南。 简介 我们都会学习,但是有时候我...

Phodal ⋅ 2016/04/15 ⋅ 1

总编下午茶:技术老男人的创业经

不知道是巧合还是什么,最近 “总编下午茶”做访谈的,都是和老杨年龄相仿的“老男人”——十几年的从业经验让这群人少了一些锐气和鸡血,但足够的阅历却让他们的思考更深入、决策更稳妥。和...

yangsir ⋅ 2016/07/10 ⋅ 0

持续交付:价值主张

软件工程快速地从敏捷开发到持续集成、再到持续交付的发展,如何才能跟上互联网大规模协作的软件进程?持续交付不是做不做的问题,而是不得不做、如何去做、如何做好的问题。 英文链接:Con...

openthings ⋅ 2016/06/08 ⋅ 0

关于前端工程化开发的框架资料汇总

1.2015前端框架何去何从(http://www.cnblogs.com/sskyy/p/4264371.html) 2.迷你MVVM框架 avalonjs 入门教程(http://www.cnblogs.com/rubylouvre/p/3181291.html) 3.全面理解虚拟DOM,实现虚拟......

IT追寻者 ⋅ 2016/10/29 ⋅ 0

腾讯Web前端大会 TFC2017 会议 现场纪实(上午)

1.前言 之前很早的时候就听说腾讯要开Web 前端大会了,但是苦于囊肿羞涩,没办法参加。但是那句话怎么说来着?天(傻)无(人)绝(有)人(傻)之(福)路,掘金送了一张门票给我。于是本喵...

mr_lp ⋅ 2017/06/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Netweaver和SAP云平台的quota管理

Netweaver 以需要为一个用户上下文(User Context)能够在SAP extended memory区域中分配内存尺寸创建quota为例。 对于Dialog工作进程,使用事务码修改参数 ztta/roll_extension_dia. 对于非D...

JerryWang_SAP ⋅ 13分钟前 ⋅ 0

IDEA提示编码速度

焦点移动 将焦点冲代码编辑窗口移动到菜单栏:Alt+菜单栏带下划线字母 将焦点从工具窗口移动到代码编辑窗口 Esc或Shift+Esc 将焦点从代码编辑移动到最近使用的工具窗口 F12 模板提示 Ctrl+J...

bithup ⋅ 22分钟前 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 45分钟前 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 52分钟前 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

python3.6 安装pyhook_3

我的是在win下的,忙了半天老是安装不了, pip install 也不行。 那么可以看出自己的版本是32bit 一脸懵逼 没办法 只好下载32版本的来安装 我一直以为 是 对应32 位的 。 下面是 小例子 http...

之渊 ⋅ 今天 ⋅ 0

004、location正则表达式

1、location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。 2、location的语法 = 开头表示精确匹配 ^~...

北岩 ⋅ 今天 ⋅ 0

CentOS7 静默安装 Oracle 12c

环境 CentOS7.5 最小安装 数据库软件 linuxx64_12201_database.zip 操作系统配置 关闭 SELinux sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config 关闭防火墙 systemctl disable ......

Colben ⋅ 今天 ⋅ 0

Yii2中findAll()的正确使用姿势/返回为空的处理办法

从一次错误的操作开始 $buildingObject = Building::findAll("status=1"); 1 这个调用看着没有任何毛病,但是在使用时返回的结果却是一个空数组。再回过头来看看数据表中: 按照套路来讲,查...

dragon_tech ⋅ 今天 ⋅ 0

如何优雅的编程——C语言界面的一点小建议

我们鼓励在编程时应有清晰的哲学思维,而不是给予硬性规则。我并不希望你们能认可所有的东西,因为它们只是观点,观点会随着时间的变化而变化。可是,如果不是直到现在把它们写在纸上,长久以...

柳猫 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部