2019-10-11

CI/CD 理想模型

云原生下交付理念

随着k8s成为容器编排系统的事实标准,软件构建/交付发生了很大的变化。也许你还没有体验到历史车轮前进的痕迹,但它确悄无声息的一直前行。对于开发、运维人员 这也是一次小小的技术革命,既然是革命总有人(保守派)要为此丢掉原有的奶酪,另外一批人(激进的人士)或多或少出现一些弯道超车的机会,对于行业从业者来说既是机遇也是挑战。传统的运维、dba岗位需求将会越收越紧,开发不再只局限于产品逻辑开发,会不同程度的参与ci部分的建设。即ci会慢慢向研发端下沉,由运维提供构建规范。解放ci构建项目工程的自由度。
k8s以及(service mesh)服务网格的出现打破了互联网构建、交付技术循序渐进的脚步,从而实现不同以往的跨越(也可以称之为技术进步)
本文ci/cd理念便是在这种行业背景下产生的(个人感悟)。

  • ci工具
    在当今以用户体验为主的互联网生存环境下,前后端服务频繁迭代将是常态,随之而来的代码频繁并发性的构建将是常态。随之而来的将是频繁性、瞬时大并发量的构建工程任务。
    常见的ci工具有jenkins、githubci、gitlabci、轻轻量级drone等。他们都是很好的开源工具,用各自的理念,高效处理以上状态下的构建任务,其中jenkins是出现时间最早,插件最多的ci工具。githubci是github最近发布 还处于beta状态。gitlabci是在gitlab在8.0版本开始加入的功能。
  • jenkins2.0为适应云环境的持续构建
    1. 插件式构建过程:整个构建流程使用jenkins上各个插件,由jenkins提供参数选项,使用人员只需添加参数内容。这也是jenkins1.0时代的主要构建方式,2.0版本兼容了1.0的这种方式。
    2. pipeline:pipeline是2.0版本推出的,以适应现代化流水线、申明式的构建环境。其后续小版本逐渐增加了对云原生、k8s环境理念下的支持,其构建过程不再是插件界面拼凑而成。而是由Groovy脚本维护控制,文件内容一般放置在项目工程根目录下.jenkinsfile中
    3. Master/Agent架构方式,支持瞬时大量的构建任务
    4. 支持k8s,可以根据构建任务量级动态伸缩Agent构建节点。
    5. pipeline正在逐渐向声明式构建靠拢,以便其适应云原生环境的复杂构建过程,这也是今后的主流方式。
  • Github ci
    1. 既然是github的产品,肯定是要依赖github,对于没有采用github的企业来说,无法直接使用,迁移到github代价也不小。
    2. 没有Master/Agent方式
  • Gitlab ci
    1. 采用pipeline方式,其构建文件一般放在项目工程的根目录下.gitlab-ci.yml 版本控制跟随项目工程。
    2. 由Commit push操作触发构建操作
    3. 由于是gitlab内置功能所以比较耗费cpu、内存资源,大量任务时硬件资源是其瓶颈,毕竟gitlab原本就需要不少资源
    4. 无法动态伸缩节点,大量构建任务时会出现排队情况
    5. 没有Master/Agent方式
  • Drone:drone是一种基于容器技术交付的持续构建、交付系统,采用声明式,其构建过程都可以是docker容器,采用yaml配置文件管理。
    1. 很新、很潮 基于容器实现,简洁、复杂度低
    2. 任务构建由git push触发操作,目前没有找到其它方式来进行构建操作
    3. 其配置完全由yaml文件控制
    4. 官方文档不完善、晦涩难懂
    5. 由于配置极简,功能不完善,不适合大量任务构建使用
  • 对比发现 drone虽是云原生的,但是很多功能并不完善,大量任务构建时效率差,并且是以git push 来触发任务构建,这在大多数情况下是合适的,但是极端情况下,这种理念并不适合。需要有完善、规范的发布体系来支撑
    gitlab ci功能与gitlab深度耦合,并且不适合k8s环境下的构建交付

  • jenkins现在只是跟上了云原生、k8s环境下构建、交付的脚步。并不是真正意义上的声明式构建工具
    但其高效的master/agent方式,完善的文档、pipeline的引入,让它还没有落后他人。在其它ci工具没有成熟、完善之前,jenkins还是比较稳健的ci构建工具。

  • cd是什么

cd即持续交付,是在ci的生产物上进行的经过ci流程的一系列操作后产生了最终的交付物,但是我们怎么交付给最终用户使用呢,
交付过程中如何做到对用户无感知
交付过程如何做到发布失败对用户没有影响(或者说影响接近于0)
交付过程中如果新版本有错误如何做到安全的版本回滚呢
cd即是在这一复杂情况下诞生的。
在以用户体验为中心的互联网产品频繁迭代、开发、时期我们必须接受失败是一种常态、失败是安全的、低影响的。
在此理念下我们就知道了CD要做什么,而不是关注于cd工具本身。
业界关于cd(持续交付)有以下实践理念

  • 自动化:这种理念下的交付对团队的技术能力要求很强,需要完善的制度来辅助处理自动化下各种复杂情况的出现。其流程上将ci部分的交付产物通过自动化测试用例检测通过后,发布到预发布环境,然后再次进行预发布环境的测试用例检测、通过后进行生产环境灰度发布、或者金丝雀发布,第三次调用测试用例进行检测。这3个环境的测试用例是否相同取决于项目工程的复杂性。如果生产环境的灰度发布检测通过,并且经受了小部分用户的使用检测没有异常,那么cd流程会继续向前推进、逐步加量直至全量发布完成新版本。在此期间各个环境如果测试失败应该由cd根据测试用例返回的结果来进行项目工程回滚,返回上一稳健版本。
    大中型公司、以及产品活跃用户少的初创公司采用此模式,初创公司并不是也具备完整的技术来支持,只是用户数量少,发布过程出现问题也不会对公司产品产生太大的影响。它们基本采用mini版本自动化发布流程。

  • 半自动化:这是在自动化cd基础上为了更加稳固、安全的发布而做了一些妥协,放弃一定的敏捷性,提高发布质量。与自动化不同的地方在于每个环境的发布完成之后,再由研发人员、测试人员对功能再次验证后,再由发布人员进行下一环境的发布操作。以自动化测试为主,人工测试为辅。吸收了自动化的敏捷性、舍去人工重度参与的繁琐性。这里的发布人员有可能是开发,也可能是该项目的测试人员。运维人员在此环境下的参与度弱化,主要负责基础环境的优化、完善,敏捷性开发。

  • 人工参与方式: 由开发人员或者运维人员同步发布平台进行各个环境发布操作,每个环境发布完成后由开发和测试进行功能验证测试,测试通过后通过IM或者口头通知方式告知发布人员进行下一环境的发布上线,然后再次进行验证测试,直至生产环境全量上线。可以看出各个环境的连接人为的进行了断点隔离,以便应对流程外的情况,而且也没有自动化测试用例、或者以人工测试为主自动化测试为辅,目前大多数创业公司员工数50-100人时采用此模式较多,这是因为这类公司一般产品活跃用户数量在50W-150W之间,对发布过程中的故障、问题容忍度低。对产品上线质量要求严格,但还没有比较完善的技术来支持自动化、半自动化方式。

  • CD工具

理念总要有工具或者技术来实现支撑,cd的工具有商业、开源基本这两类,这里只探讨非商业项目
大多数ci工具都提供原生、或者以插件形式扩展集成了cd功能。jenkins、drone、gitlab
但是ci跟cd耦合在一起也会产生不便,如果某一版本发布一段时间后,产品或者测试发现了bug或者莫个功能的缺陷,此时有两种解决方案

1 研发修改代码上线新的版本解决
2 暂时将版本回滚上一稳健版本
当采用回滚方式时由于ci与cd高度耦合无法直接回滚,(除非手动登陆服务器操作)
其回滚会再次经历ci过程,即使跳过ci也会留下一个空的构建版本号。
大中企业一般是采用ci工具,然后使用自研的cd工具、或者平台;也有采用开源cd项目的。单纯使用ci工具处理cd流程功能稍显不足

k8s环境下的cd工具

  • tekton

tekton 是一个强大而灵活的k8s原生开源框架,用来进行持续集成和交付系统,对底层细节实现进行抽象,可以实现跨多云平台、多集群系统交付。可以跟jenkins配合使用

  • flux

CNCF维护项目,未毕业。 基于gitops理念。在git中声明性的描述系统的期望状态,使用YAML来进行强制一致性管理,所有更改都是通过git进行,使用差异化工具来检测状态跟期望状态的差异;提供原子性和事务性,操作要么全部成功,要么全部失败。

  • drone

只支持容器环境,传统服务器软件交付不支持

  • jenkins

利用k8s插件或者ansible进行cd操作,拓展性差。

  • wayne

360公司开源产品,功能齐全,可视化好,不错的权限控制、审计功能。缺点是灵活性不够,配置项太多操作繁琐,没有提供pv文件的管理。所以操作都要通过前端web页面进行操作,不利于后期自动化处理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容