一直很想谈谈Continuous Integration(CI),持续集成。

就在不久前一次朋友聚会上,一个刚刚跳槽到一家创业公司的朋友跟我抱怨说他们没有CI,没有code review,要做点事太累了。而其实让这个刚刚开始上手的新手项目经理无语到吐的原因是,他们的一名主要开发人员责任心不够,很难沟通,bug率很高,还不愿加班改bug。

“现在招人很难的啊,所以也不能把他fire掉,哎。。。”

“有了CI又能怎样呢?”

“至少不用等到QA发现问题,下班前就能抓住他了!不过现在我们QA连自动化测试都没有。。。”

“你们的技术主管怎么不搞?”

“他太凶了。。。哈哈哈,其实现在都忙着接单子啦。”

“看来你们生意还兴隆呀?”
“貌似还不错的。”

在走出甜品店的时候他并没有什么心塞的样子,反而我的内心开始踌躇一个问题,“你需要CI吗?”

还是先形式主义一下,谈谈CI的作用吧。

当你花了一下午完成一个模块的代码,拿起还微热的拿铁呷了一口,伸了伸懒腰,惬意地环视一圈咖啡馆里的各色达人。然而,尽管你的代码已经通过本地Unit Test的重重测试,可你还是只能对坐在不远处那桌的妹子投入99%的贼心,因为总有1%的担心徘徊于这样一个问题:“这代码能直接上产线吗?” 你不是胆小,你只是不确定。没错,CI最通俗的作用便是尽早发现质量问题,使你无比自豪地堆完几块代码之后便能全心全意地冲着妹子荡漾春心,当然我知道你也就荡漾一下而已:)

然而,故事的走向或许是这样的。在一个烦躁的离下班还剩5分钟的下午,早已跟妹子约好晚上吃饭电影KTV的你在提交代码10次之后,CI还是红彤彤地一片。你看完最新的log有了一点点头绪,老板正兴致勃勃地期待着晚上的上线。选吧,少年!楼下已经等得没剩多少耐心的可能是你的终身大事和身后要求今天必须出包并完成beta测试已经虎视眈眈的你的金主。没错,CI的另一个作用,就是磨炼你的意志以战胜人性的弱点,在放弃和不放弃之间左右为难,万一你还是个处女座。。。

CI就像是小时候作业本背后的那几页参考答案,它能立刻给你结果,但一旦那结果始终与你的答案相左,便容易陷入抓狂。哈哈,其实也没有那么恐怖,此时便是DevOps的大神们出场的时候。

如同上一篇博文中曾提到的,我喜欢把CI描述为DevOps工作的起点。每个人对CI的看法和解释都会不同,对于吃过猪肉或只见过猪跑的人来说,CI一般可能长这样的(请别介意Jenkins和GitHub):

这张草图描述的是单一模块的CI,我们很多时候都会把多个模块的CI集成在一起形成适用于一个完整产品的CI系统,也有起名字叫作Pipeline。当你坐在市中心的Starbucks一边下午茶一边瞄妹子一边写代码的时候,大概还有几位兄弟在不开空调的办公室一边加班骂老板一边加班改bug呢。你们同时提交一段代码时,有效率的CI系统会把你们的提交按照流水线(Pipeline)的方式妥善安排执行,以避免你们互相踩踏影响各自的春心或苦心:)

这张草图中还有值得注意的三点。其一,部署测试环境(Deploy to Test ENV)和集成测试(Integration Test)都需要依赖某个版本的其他模块,一般会用最新版本或当前产线版本。而这也是Pipeline需要设计的一个部分。其二,有个隐藏关系便是,你的代码最好是基于代码库中最新的版本修改。CI系统应该实现在提交后的代码合并,并在一切都Happy之后自动合并入库。其三,最后那朵小云彩里的内容其实不比整张草图来的简单,那是DevOps大神们需要付出汗水的其他作品,以后再细谈。

尽管业界也有几个成形的CI产品,然而实际上想要找到一个适用于自身项目的CI系统并不容易。尚且先不说购买某CI系统服务需要多少钱,即使买来之后想要用得顺心,还得付出大量人力成本(DevOps)去设计用法和管理维护。因此,相比业界的收费工具,可按需定制搭建的开源产品往往更受到青睐,其中Jenkins应该是大家最熟悉的了,不过我并不打算介绍或评价某个工具的用法或好坏。我的观点是,无论用什么工具来搭建CI,对于DevOps的开发人员来说,都是在制作一件属于自己的产品。

适合的才是最好的,大家好才是真的好:)这便是对CI系统这件产品的要求。具体地,我会用几个方面的指标来衡量一个CI系统的质量高低。

1. 一键触发。高度自动化是对CI系统的基本要求,然而是否高度自动化的衡量更多的是在于对容错机制的实现。一旦提交的代码出现破坏环境的问题,系统是否能够自动回滚以恢复部署环境的健康并不影响代码库的版本控制。对人工干预的需求越少,越体现“一键”的功力。

2. 周期短。由于考虑到Pipeline的实现,协调各模块纷繁复杂的CI需求是件需要智慧的事情。效率是金钱,如果从代码提交到知道结果需要花去你一下午的时间,那对你或对那个妹子来说都是件残忍的事。统筹多方的考虑,我认为一次周期所需的能容忍的时间应该不能长于20分钟,这足以让你伸懒腰,泡咖啡,骂老板,上洗手间,聊人生关键节点了。

3. 配置快。一个可重用的CI系统框架是很多DevOps的追求。可事实却是,世界上基本找不到两个完全可重用的CI框架。原因很简单,对于不同产品,CI的内容也是不同的。其中,部署(Deploy)和集成测试(Integration Test)就是决定性因素。于是优秀的DevOps大神会在部署脚本和测试脚本上花去大部分脑力,而通过快速配置CI系统来实现一个新模块CI的需求。而这其中能重用的便是依此抽象出来的一套配置方式与适用于产品各模块的参数化的脚本。

4. 高可用。其实对于高可用的原则不用赘述。产品必须高可用,这是这一代互联网人的信条。CI是产品,也是保证产线质量的基础设施,自然也适用。

零零落落地写了这么多,我的咖啡也凉了。在这个没有太阳只有小雨的下午,对面坐的是依然美丽动人的老婆,咖啡馆里人也不多。再来杯最爱的美式,陪老婆看完电影就回家~

对了,因为CI而抓狂是正常的,不过也别太抓狂。Remember, CI drives you crazy only because you are a responsile person:)

DevOps is dirty work - CI drives you crazy的更多相关文章

  1. DevOps is dirty work - Dream in One-Click

    真是一晃就到年底,年初许的梦想实现了吗?这么残忍的问题还是不要知道答案了吧:) 这恍若隔世的大半年,不仅没有承接着上篇继续聊Continuous Delivery (CD),反而疑似荒废.然而,梦想还 ...

  2. DevOps is dirty work - What's the deal

    什么是DevOps?终于又回到这个最初的问题. 第一次看到这个词的时候,还身陷于各种敏捷概念轰炸中.用“身陷”这个词其实并不准确,因为那个年代的我也是那些热情洋溢地无处不宣传敏捷的热血文艺青年中的一员 ...

  3. 企业DevOps研发模式下CI/CD实践详解指南

    阅读全文大概需要 10分钟. 1. 前言 借着公司今年新组建的中台研发部东风,我作为其中的主要负责人,在研发中心主导推行DevOps研发管理模式转变及质量管理创新建设,本篇文章摘取自今年9月底,笔者在 ...

  4. DevOps,CI,CD,自动化简单介绍

    前言: 随着企业应用的不断迭代,不断扩大,应用的发布发布可能涉及多个团队,如pc端,手机端,小程序端等等.应用发布也就成为了一项高风险,高压力的超过过程,以及应用的开发迭代的沟通,测试成本也大大的变得 ...

  5. asp.net core webapi/website+Azure DevOps+GitHub+Docker

    asp.net core webapi/website+Azure DevOps+GitHub+Docker 新春开篇作,主要写一下关于asp.net core web/api 2.2 项目借助dev ...

  6. Docker和CI/CD实战

    一.CICD和DevOps 前面已经了解了CI/CD,其实CI/CD已经存在多年了,只是最近软件工程方面又提出了敏捷开发.DevOps,又把CI/CD炒火了. 那么什么是DevOps?DevOps和C ...

  7. 携程酒店DevOps测试实践

    作者简介 王幸福,携程酒店研发部高级测试经理,负责无线自动化测试相关工作.在测试框架和平台研发.移动测试.DevOps等领域有着丰富的经验. 如今很多大型互联网公司.创新型企业都在积极地进行DevOp ...

  8. 优秀DevOps工程师必会的33个面试题

    DevOps面试问题 01 您能告诉我们DevOps和Agile(敏捷)之间的根本区别吗? 答:尽管DevOps与敏捷方法(这是最流行的SDLC[Software Development Life C ...

  9. 「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要点

    1. 前言 随着互联网软件行业快速发展,为了抢占市场先机,企业不得不持续提高软件的交付效率.特别是现在国内越来越多企业已经在逐步引入DevOps研发模式的变迁,在这些背景催促之下,对于企业研发团队所需 ...

随机推荐

  1. mysql命令导出导入数据库

    命令导出数据库: mysqldump -h[主机所在IP] -u[用户名] -p [要导出的数据库]>[导出的路径//[文件名].sql] 命令导入数据库: 1>首先,我们应该在cmd中进 ...

  2. RobotFrameWork(四)变量运算与Evaluate

    一.特殊变量运算: 执行结果: 二.Evaluate使用 函数释义:Evaluate是执行Python表达式,并返回执行结果 示例1: 执行结果: 示例2: 执行结果:

  3. whose view is not in the window hierarchy

    参考:http://www.jianshu.com/p/9e90cb866fdf 在做界面跳转的时候,我们经常会用到这两个函数 func dismissViewControllerAnimated(f ...

  4. MediaElement.js之浏览器跨域请求视频播放

    浏览器跨域问题一直以来都是作为前端开发人员常见的问题,所以今天学习了下如何使浏览器跨域请求资源 需要了解的知识 -域(主域,子域,什么是跨域) 简单来说由于浏览器同源策略,凡是发送请求url的协议(h ...

  5. Mac Pro 16G 安装MyEclipse提示虚拟内存(为0)不够

    百度一下很多人都说开多一点程序,让程序占满内存,使其虚拟内存使用就能通过这一步骤,但这里有个更好一点的方案 通过执行: memory_pressure -l critical 用系统内存压力测试进程占 ...

  6. nginx 反向代理 配置 https 实现http https同时存在

    server { listen ssl; #监听443端口 server_name www.app01.com; ssl on; #启用ssl加密 ssl_certificate /etc/cert/ ...

  7. 事务操作(BEGIN/COMMIT/ROLLBACK/SAVE TRANSACTION)

    BEGIN TRANSACTION 标记一个显式本地事务的起始点. BEGIN TRANSACTION 使 @@TRANCOUNT 按 1 递增. BEGIN TRANSACTION 代表一点,由连接 ...

  8. ajax完整格式

    $.ajax({             url: encodeURI( "@Url.Action("NavList", "Home")"  ...

  9. 移动WEB前端开发资源整合

    meta篇 1.视窗宽度 <meta name="viewport" content="width=device-width,initial-scale=1.0,m ...

  10. bin/sh^M: bad interpreter: No such file or directory解决

    问题:bin/sh^M: bad interpreter: No such file or directory 原因:.sh脚本在windows系统下用记事本文件编写的.不同系统的编码格式引起的. 解 ...