1 - CI与CD的联系与区别
持续集成(Continuous Integration)、持续交付(Continuous Delivery)和持续部署(Continuous Deployment)的过程,其实就是一个软件开发优化的过程。
- 统一流程:自动化地触发编译、集成、测试、交付和部署
- 保证集成的有序性、可靠性,减少版本发布的不合规性,避免手工打包、测试不充分等
- 版本可控,问题可追溯:可以回溯到具体版本
三者有着不同的目的
- 持续集成的目的是尽早发现问题
- 持续交付的目的是实现快速发布
- 持续部署的目的是在生产环境中进行发布,虽然对发布时间没有明确要求,但要考虑随时发布的情况,确保服务在发布期间不会中断
而且,三者有着不同的软件自动化交付周期和作用:
- 持续集成是指软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。
- 持续交付建立在高水平自动化持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的类生产环境中,进行更多的自动化测试。
- 持续部署是指当交付的代码通过评审之后,自动部署到生产环境中,可以相对独立地部署新的功能,并能快速地收集真实用户的反馈。
由此可见,各种持续方法并不是完全独立地工作,只是对持续开发服务或持续改善服务所需的步骤进行了区分。
2 - 为什么要构建CI&CD平台?
利用开源工具和技术可以搭建一个相对完善的CI&CD体系,能够应对大规模软件开发所面对的交付问题。
- 更新缓慢:代码改动需要很长才能部署
- 包管理混乱:依赖复杂、版本混乱
- 安全性低:软件包容易被篡改
- 资源利用不充分:人工分配方式下,部分硬件资源无法被有效利用
- IP和端口紧张:被长时间的固定占用,导致不够用
- 维护成本高:复杂的工具组合和框架,导致难以有效维护
- 服务难伸缩:无法根据实际服务需求快速扩充和缩小服务规模
3 - CI&CD工具栈
在实施DevOps过程中,构建自动化、流程化、智能化的CI&CD,是必不可少的重要事项和核心部分。
CICD也是一个宽泛的的技术栈,包含众多的工具与方法,主要包括如下环节和内容
- 源代码管理:版本管理(GitLab)、代码扫描(Sonar)、代码审核(Gerrit)等
- 集成部署:编译打包(Maven)、流水线(Jenkins)、容器化部署(Docker)等
- 自动化测试:单元测试(Junit/PyUnit)、测试框架(Robotframe)、接口测试(RESTful)等
- 生产发布:镜像仓库、镜像管理、网络管理(VLAN)、持久化方案、服务发现、服务编排(Kubernetes)等
- 运维与监控:配置(Ansible)、监控(Zabbix)、日志(ELK)等
在实现CICD的过程中,不仅要理解理论,更要围绕问题讲思路、讲办法,讲实际行动 ,也就是要掌握原理、要点和操作。
4 - CI&CD所需要具备的要素
- 全面的自动化测试:构建实用的自动化测试流程和选择合适的工具
- 灵活的基础设施。容器,虚拟机、云平台等
- 版本控制工具与代码仓库
- 自动化的构建和软件发布流程的工具
- 反馈和分析机制:快速地反馈结果到相关人员,并迅速分析
5 - CI&CD的衡量指标
- 代码发布频率与周期
- 代码从提交到发布的速度
- 故障变更率
- 事故恢复时间
- 等等
6 - CI&CD实施云平台化
容器技术能够让应用一次构建,到处运行(物理机、虚拟机、公有云、私有云、各类型系统等),加快了开发和构建,实现了快速交付和部署,同时还在系统操作层面提供资源隔离服务。
因此,CI&CD的虚拟化、容器化、云平台化是大规模部署最适合的途径,也是企业提升生产力的合适选择。
针对于大多数中小型企业来说,可能没有资源或技术储备去构建一个私有化的云平台,但可以选择在公有云上实现CI&CD。
当前主流云平台都提供了从代码库下拉代码、编译打包、单元测试、镜像制作、容器发布的功能,基本上具备了完整的持续集成、持续发布和持续部署的服务能力。
7- CI&CD与DevOps的关系
DevOps是一套工具集合、一组过程与方法、一种组织形式与文化。
DevOps工具和方法的实践与落地,具体的可见的结果就是构建一套高效可用的CI&CD平台。
简单的来说,在应用CI&CD后,再加上Web版本的门户,集中的账户管理系统以及运维监控体系,即可打造一个基础的自动化DevOps平台。