本系列将会从宏观角度,讲述CI/CD相关知识。系列文章不求把每一项都讲仔细,而是让大家能对CI/CD整体流程有大致的概念。无论你是前端,后端,或是运维团队,只要是CI/CD链路上的一份子,相信这系列文章对你都会有帮助。
传统开发模式的问题
目前,在国内互联网公司中,小公司仍占大多数。很多开发团队人数并不多,即便是10人以下的团队也不在少数。这些团队往往有一个优势,就是开发灵活,不需要被过多的规范约束开发行为。很多时候只需用代码仓库就能把团队的工作管理起来。
国内比较普遍的代码仓库是gitlab,有的团队也会使用gitee,前后端开发把代码推送到仓库,然后在服务拉取最新代码实现更新。具体操作大致如下:
这种开发模式在项目早期可以迅速得推出第一个版本,把开发效率体现得淋漓尽致。但随着项目的持续迭代,当项目成长到一定程度之后,就会出现各种各样的问题:
-
以往产品的功能较少,开发者可以在本地开发时,把功能测试校验完。但随着产品功能越来越多,测试逐渐成了一件困难的事。
-
早期团队人数较少,大家可以直接把代码推送到项目主干分支。但随着团队人数增加,合并代码的冲突频率变高,处理此类问题所花的时间会显得价值很低。
-
环境服务中内容不同步。过去每次需要把环境更新(一般是内部演示),都需要有人手动在服务器拉取最新代码,并更新服务。
-
如果项目服务较为复杂,涉及到多个服务、应用,每次更新服务都会耗费大量时间。
有问题,就会有人想解决的办法。大家观察以上过程遇到的问题,其中大部分都是一些重复的机械操作,那么我们是否可以做一套流程设计,通过脚本或者工具,让机器自动帮我们完成这个操作呢?答案是肯定的,而这,就是CI/CD诞生的目的。
是什么CI/CD?
CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。其核心概念是持续集成、持续交付和持续部署,分别解决项目从代码提交到服务部署,整个环境中的不同阶段。
CI 持续集成(Continuous Integration)
持续集成阶段主要解决,从开发者本地提交代码,到项目仓库把代码合并这个环节中遇到的问题。 记住,持续集成最直接的好处是可以提高代码的质量,但从根本上,CI/CD的整个环节都是为了提高交付速度。
针对持续集成,最大的优势是:
- 快速发现错误:每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
- 防止分支大幅偏离主干:如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
说白了,这个环节就是通过自动化测试,提前发现代码冲突的方案,优化代码合并的操作。而这些操作既可以在开发者本地完成,也可以交给CI服务自己完成。具体内容我会在后面的文章中详细展开。
CD 持续交付(Continuous Delivery)
持续交付解决的,是开发人员以及把项目产品构建好之后,交付给质量团队或者用户,以供评审的过程。一般情况下,这个过程在项目架构确定之后,就很少改动。因为我们只需要告诉CD工具,在拿到我们的代码之后,应该如何构建项目产物即可。
持续交付可以把开发者从构建操作中分离出来,专心开发项目,确保每次代码更新之后都会交付到用户手中。
CD 持续部署(Continuous Deployment)
持续部署是CI/CD流程的最后环节,它的主要工作是,在代码通过评审以后,把最新交付的项目产物部署(更新)在服务器。这个过程很大程度上需要依赖精心设计的测试自动化。
而这个环节最重要的,就是要留下允许服务回滚的后门。虽然CI/CD机制可以让开发者安心地专注开发工作,但机制本身并不是万能的。一旦发生了在某次持续部署后,服务崩溃或者失效的情况,我们应该要有能力把服务,迅速恢复到上一版本。
CI/CD的设计
现在大家应该明白,CI/CD不过是一套机制,并没有固定的落地规范。我曾经只用一套简单的shell脚本和web server API,就实现了团队内部一个小项目的CI/CD功能。每个团队面临的开发情况都不一样,选择最合适自己的方案才是最重要的。
当然,现在业内也有许多成熟的方案可以提供我们参考,甚至直接套用。在接下来的文章中,我也会讲述一些方案的使用,希望大家可以留意。
总结
今天我们详细地描述了CI/CD的机制,本质他们各自针对优化了,一个项目从开发到交付的不同环节。
- 持续集成:保证了开发代码的质量
- 持续交付:保证了项目产物的构建速度和稳定输出。
- 持续部署:保证了项目服务的更新及时和稳定。
如果你觉得本文对你有一点帮助,麻烦给我点个赞吧~~ 谢谢