目录
基于 CI/CD 的 DevOps 思想
DevOps 是一组用于促进开发和运维人员之间协作的过程、方法和系统的统称。
DevOps 提倡通过一系列的技术和工具降低开发和运维人员之间的隔阂,实现从开发到最终部署的全流程自动化,从而达到开发运维一体化。通过将 DevOps 的理念引入到整个系统的开发过程中,能够显著提升软件的开发效率,缩短软件交付的周期,更加适应当今快速发展的互联网时代。
一个 DevOps 环境应该满足以下 8 点需求:
- 环境一致性:在本地开发出来的功能,无论在什么环境下部署都应该能得到一致的结果。
- 代码自动检查:为了尽早发现问题,每一次代码提交后,系统都应该自动对代码进行检查,及早发现潜在的问题,并运行自动化测试。
- 持续集成:每次代码提交后系统可以自动进行代码的编译和打包,无需运维人员手动进行。
- 持续部署:代码集成完毕后,系统可以自动将运行环境中的旧版本应用更新成新版本的应用并且整个过程中不会让系统不可用。
- 持续反馈:在代码自动检查、持续集成、持续部署的过程中,一旦出现问题,要能及时将问题反馈给开发人员以及运维人员。开发和运维人员收到反馈后对问题及时进行修复。
- 快速回滚:当发现本次部署的版本出现问题时,系统应能快速回退到上一个可用版本。
- 弹性伸缩:当某个服务访问量增大时,系统应可以对这个服务快速进行扩容,保证用户的访问。当访问量回归正常时,系统能将扩容的资源释放回去,实现根据访问情况对系统进行弹性伸缩。
- 可视化运维:提供可视化的页面,可实时监控应用、集群、硬件的各种状态。
整个环境主要由 6 部分组成。
- 代码仓库 Gitlab 。
- 代码审查平台 Gerrit。
- 容器技术 Docker 。
- 持续集成工具 Jenkins 。
- 代码质量检测平台 SonarQube 。
- 镜像仓库 Harbor 。
- 容器集群管理系统 Kubernetes 。
整个环境的运行流程主要分为以下 6 步:
- 开发人员在本地开发并验证好功能后,将代码提交到代码仓库。
- 通过事先配置好的 Webhook 通知方式,当开发人员提交完代码后,部署在云端的持续集成工具 Jenkins 会实时感知,并从代码仓库中获取最新的代码。
- 获取到最新代码后,Jenkins 会启动测试平台 SonarQube 对最新的代码进行代码检查以及执行单元测试,执行完成后在 SonarQube 平台上生成测试报告。如果测试没通过,则以邮件的方式通知研发人员进行修改,终止整个流程。若测试通过,将结果反馈给 Jenkins 并进行下一步。
- 代码检查以及单元测试通过后, Jenkins 会将代码发送到持续集成服务器中,在服务器上对代码进行编译、构建然后打包成能在容器环境上运行的镜像文件。如果中间有步骤出现问题,则通过邮件的方式通知开发人员和运维人员进行处理,并终止整个流程。
- 将镜像文件上传到私有镜像仓库 Harbor 中保存。
- 镜像上传完成后, Jenkins 会启动持续交付服务器,对云环境中运行的应用进行版本更新,整个更新过程会确保服务的访问不中断。持续交付服务器会将最新的镜像文件拉取到 Kubernetes 集群中,并采用逐步替换容器的方式进行对应用进行更新,在服务不中断的前提下完成更新。
持续集成
持续集成指的是在软件开发过程中,软件开发人员持续不断地将开发出来的代码和其他的开发人员的代码进行合并,每次合并后自动地进行编译、构建,并运行自动化测试进行验证,而不是等到最后各自开发完成后才合并在一起。持续集成能从根本上提高一个团队的软件开发效率。在软件开发过程中引入持续集成,可以帮助团队及时的发现系统中的问题,并快速做出修复,不仅可以缩短软件开发的时间,而且可以交付更具质量的系统。
CI 需要具备:
- 全面的自动化测试。
- 灵活的基础设施。如:容器,虚拟机。
- 版本控制工具。如:Git,CVS,SVN 等。
- 自动化的构建和软件发布流程的工具,如:Jenkins,flow.ci。
- 反馈机制。如构建/测试的失败,可以快速地反馈到相关负责人,以尽快解决达到一个更稳定的版本。
持续集成的优点:
- “快速失败”,在对产品没有风险的情况下进行测试,并快速响应;
- 最大限度地减少风险,降低修复错误代码的成本;
- 将重复性的手工流程自动化,让工程师更加专注于代码;
- 保持频繁部署,快速生成可部署的软件;
- 提高项目的能见度,方便团队成员了解项目的进度和成熟度;
- 增强开发人员对软件产品的信心,帮助建立更好的工程师文化。
持续交付
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。
持续交付和持续集成的优点非常相似:
- 快速发布,能够应对业务需求,并更快地实现软件价值。
- 编码 -> 测试 -> 上线 -> 交付的频繁迭代周期缩短,同时获得迅速反馈;
- 高质量的软件发布标准。整个交付过程标准化、可重复、可靠;
- 整个交付过程进度可视化,方便团队人员了解项目成熟度;
- 更先进的团队协作方式。从需求分析、产品的用户体验到交互设计、开发、测试、运维等角色密切协作,相比于传统的瀑布式软件团队,更少浪费。
持续部署
持续部署是指当交付的代码通过评审之后,自动部署到生产环境中。持续部署是持续交付的最高阶段。这意味着,所有通过了一系列的自动化测试的改动都将自动部署到生产环境。
为什么说持续部署是理想的工作流程?开发人员提交代码,持续集成服务器获取代码,执行单元测试,根据测试结果决定是否部署到预演环境,如果成功部署到预演环境,进行整体验收测试,如果测试通过,自动部署到产品环境,全程自动化高效运转。
实际上,产品在从需求到部署的过程中,会经历若干种不同的环境,例如:QA 环境、各种自动化测试运行环境、生产环境等。这些环境的搭建、配置、管理,产品在不同环境中的具体部署,状况是比较非常复杂的,从头到尾地全自动持续部署的确困难。那么,如果能做到持续交付,保证代码在模拟环境没问题,也许团队成员做到真正的心理有数。
持续部署主要好处是,可以相对独立地部署新的功能,并快速地收集真实用户的反馈。
DevOps 流程示例
来源:oschina
链接:https://my.oschina.net/u/4267117/blog/4527796