随着k8s成为容器编排系统的事实标准,软件构建/交付发生了很大的变化。也许你尚未体验到历史车轮前进的痕迹,但它确悄无声息的一直前行。对于开发、运维人员 这也是一次小小的技术革命,既然是
革命
总有人(保守派)要为此丢掉原有的奶酪,另一批人(激进的人士)或多或少出现一些弯道超车的机会,对于行业从业者来讲既是机遇也是挑战。传统的运维、dba岗位需求将会越收越紧,开发再也不只局限于产品逻辑开发,会不一样程度的参与ci部分的建设。即ci会慢慢向研发端下沉,由运维提供构建规范。解放ci构建项目工程的自由度。
k8s以及(service mesh)服务网格的出现打破了互联网构建、交付技术按部就班的脚步,从而实现不一样以往的跨越(也能够称之为技术进步)
本文ci/cd理念即是在这种行业背景下产生的(我的感悟)。git
现下的ci工具
在当今以用户体验为主的互联网生存环境下,先后端服务频繁迭代将是常态,随之而来的代码频繁并发性的构建将是常态。随之而来的将是频繁性、瞬时大并发量的构建工程任务。
常见的ci工具备jenkins、githubci、gitlabci、轻轻量级drone等。他们都是很好的开源工具,用各自的理念,高效处理以上状态下的构建任务,其中jenkins是出现时间最先,插件最多的ci工具。githubci是github最近发布 还处于beta状态。gitlabci是在gitlab在8.0版本开始加入的功能。github
Drone:drone是一种基于容器技术交付的持续构建、交付系统,采用声明式,其构建过程均可以是docker容器,采用yaml配置文件管理。 docker
对比发现 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基础上为了更加稳固、安全的发布而作了一些妥协,放弃必定的敏捷性,提升发布质量。与自动化不一样的地方在于每一个环境的发布完成以后,再由研发人员、测试人员对功能再次验证后,再由发布人员进行下一环境的发布操做。以自动化测试为主,人工测试为辅。吸取了自动化的敏捷性、舍去人工重度参与的繁琐性。这里的发布人员有多是开发,也多是该项目的测试人员。运维人员在此环境下的参与度弱化,主要负责基础环境的优化、完善,敏捷性开发。ide