Advertisement

持续集成(Continuous integration)

阅读量:

一、基本概念

1、持续集成

持续集成技术(Continuous Integration Technology, 简称CI)是一种广泛采用的软件开发方法。这种方法就是定期地将代码整合到核心代码库中,并且通常每隔一段时间就提交一次。

每次集成都采用自动化的构建(涉及编译、发布以及自动化测试)的方式进行验证,并以迅速识别集成问题为目标。

持续集成主要体现在开发人员提交新代码后立即展开构建工作,并随后展开单元测试工作。通过测试结果分析, 可以验证是否能够顺利地将新代码整合到现有系统中。

持续集成的好处:

  • 每次完成一点更新后即可集成到主干中, 这种方式能够迅速定位问题, 同时定位过程也相对便捷;
    • 不经常集成的情况下, 主干持续更新可能会导致分支明显偏离主干方向, 这将可能导致后续集成变得更加困难。

持续集成的目的:

通过产品实现高效的开发周期,并能同时保证产品的高品质。它的关键举措是在代码整合到主干之前这一环节上,则必须经过严格的自动化测试。一旦任何一个测试用例出现故障,则无法进行代码整合

持续集成并不能消除 Bug,而是让它们非常容易的发现和改正。

2、持续交付

持续交付法(CD)是一种方法论:它强调定期发布新版本供质量团队或用户进行评估与协作。经过这些审查确认无误后, 代码被投入生产环境运行中。

持续交付属于持续集成的后续阶段。它关注的重点在于,在任何更新情况下,软件随时可以被提交并发布。

3、持续部署

持续部署(Continuous deployment)是持续交付的后续步骤,在经过评审后将代码自动推送到生产环境中

主要目标是确保代码始终具备可 deploy 性,并支持随时进入生产阶段。持续 deployment 的基础条件是能够自动化完成测试、构建和 deploy 步骤。

4、持续交付和持续部署的区别

CD指持续交付与持续部署。然而,并非所有情况下的"连续集成"都被称为"CD";只有在进行连续的、可监控的开发迭代时才被称为"连续集成"(CI/CD)。其中,在进行"连续集成"的过程中,并非所有情况下的"继续发布"都是自动化的;只有在进行连续的、可监控的开发迭代时才被称为"连续发布"(CI/CD)。在这样的过程中,并非所有情况下的发布都是自动化的;只有通过特定机制才能实现将应用自动部署至生产环境。

二、持续集成的一般流程

根据持续集成的设计,代码从提交到生产,整个过程有以下几步:

(1)提交

流程的第一阶段由开发者将代码提交至代码库完成。后续的所有操作均基于本地一次提交(即commit)的基础之上展开。

(2)测试(第一轮)

代码仓库为 commit 操作配置了一个钩子(hook),在提交代码或将其合并至主干时会执行自动化测试流程。

(3)构建

通过第一轮测试,代码就可以合并进主干,就算可以交付了。

交付后完成后续步骤之前,请首先立即进行构建操作。随后立即进行构建操作之后,请开始第二阶段的测试流程。具体来说,请理解为将源码编译成可执行文件的过程。例如安装必要的依赖项,并配置包括样式表文件、JavaScript脚本以及图像资源等在内的各种资源。

常用的构建工具主要是:jeknins、Travis、codeship等。

(4)测试(第二轮)

当构建完成时,则需要执行第二阶段测试。若在第一阶段中已覆盖了全部测试项目,则第二阶段可被省略;此时则应将构建步骤提前至第一阶段测试之前进行处理。

后续阶段将实施系统性评估:单元测试、承袭检测以及跨模块联调必经流程。如条件允许时,请确保执行跨领域验证。主要依赖自动化手段完成各种功能验证;个别复杂场景仍需人工干预以确保系统稳定性

后续阶段将实施系统性评估:单元测试、承袭检测以及跨模块联调必经流程。如条件允许时,请确保执行跨领域验证。主要依赖自动化手段完成各种功能验证;个别复杂场景仍需人工干预以确保系统稳定性

(5)部署

在经过第二轮测试后, 当前代码就是可以直接部署的一个版本 (artifacts version). 将其所有文件进行压缩 (使用 *tar filename.tar 命令) 并存档, 然后发送至生产服务器.

服务节点将整合文件,并在本地一个专门的目录中解包这些整合文件。同时,在运行路径处创建 symlinks 指向该本地目录。最后重启应用即可。

这方面的部署工具有Ansible、Chef、Puppet等。

(6)回滚

一旦遇到当前版本出现异常情况,则必须回滚至上一版本构建成果。最容易采取的方式是重新配置符号链接以指向前一版本目錄

三、认识DevOps

1、DevOps是什么?

DevOps这一术语起源于将**Development(开发)Operations(运维)**进行融合,并特别强调了开发团队与运维团队之间的协作。借助自动化流程实现软件构建、测试与发布变得更加便捷、频繁且可靠。

如今对DevOps已有众多观点和解释,然而这些观点都围绕着同一个核心理念:弥合开发人员与运维人员之间曾经存在的障碍,促进彼此之间的互动与理解。

DevOps可以通过一个公式来描述:文化观念的变化 + 自动化技术 = 持续应对市场的快速变迁

strongly emphasizes that DevOps is a framework, representing a methodological approach, but not a toolkit. It comprises a series of fundamental principles and practices.

DevOps的核心价值:

  • 更快速地交付,响应市场的变化;
  • 更多地关注业务的改进和提升。

2、为什么需要DevOps?

(1)产品迭代

在现实工作中

答案就是DevOps,因为DevOps是面向业务目标,助力业务成功 的最佳实践。

(2)技术革新

在系统复杂化的推动下,当前的IT架构不断革新。最初时,所有服务都部署在同一台服务器上;如今演变为微服务架构;逐步过渡至自动化工作流程;扩展至公有云平台。

3、DevOps如何落地?

落实DevOps的指导思想

高效率的合作与交流、自动化流程与工具、快速且敏捷的开发流程、持续交付与部署以及不断的学习与创新。

这幅图源自权威的《success with enterprise dev-ops whitepaper》一书。

敏捷管理 :一支训练有素的敏捷开发团队是成功实施DevOps的关键。

根据康威定律:软件团队开发的产品是对公司组织架构的反映

持续交付部署:实现应用程序的自动化构建、部署、测试和发布。

借助技术手段, 将传统的手工操作转换为自动化流程, 这不仅有助于提升产品开发与运维部署效率, 还能有效减少由于人为因素导致的失误与事故, 提前发现潜在问题并迅速采取行动解决, 这样能够确保产品质量水平。下图详细展示了DevOps实现自动化的流程:

IT服务管理(ITSM)是一种将传统的"IT管理"转变为以"服务"为核心管理模式的技术。传统的"IT管理"往往侧重于对服务器、网络以及系统软件的具体维护与部署工作;而在IT服务管理中,则更加注重建立规范化的流程体系与标准化操作规范。这种管理模式不仅明确了各流程的目标设定与范围界定、成本效益评估标准以及关键成功要素等多个重要维度,并且还强调了各岗位人员的责任权限划分及其绩效考核指标的设计。例如构建线上事故处理流程以及服务配置管理系统等具体实践环节。

精益管理 :构建一个以流程为导向的IT服务 pipeline,并消除开发部门与运维团队之间存在的障碍,推动开发部门与运维团队形成一体化的工作模式。

精益生产的实践源于丰田生产方式(TPS)的生产哲学理念。该方法以其减少资源浪费并提高客户满意度而著称。通过减少资源浪费和错误操作来实现更高的效率。其核心理念体现在即时制(JIT)与自动化(Jidoka)中。

精益管理贯穿在整个DevOps过程中,在这一理念下企业被鼓励主动识别问题并提出解决方案,并通过不断优化流程来提升整体效率。这种管理模式旨在实现稳定且及时地交付成果的同时迅速响应用户需求,并通过减少潜在风险的影响范围来确保产品的高质量服务与高水平的服务质量。

4、实施DevOps的具体方法

(1)建立快速敏捷的团队

依据业务功能将团队划分为若干组别;创建通讯群组;设置产品负责人由一名策划人员担任;Scrum Master通常由测试人员担任,并采用测试驱动开发模式;而开发者团队则由前端工程师、后端工程师以及测试工程师各一名组成;从而构建组织架构及系统框架

(2)实现自动化的流程

直接看图说话吧,以下为一个完整DevOps的Pipeline:

  • 提交:开发人员完成本地测试后将代码提交至版本控制系统(如Git代码仓库)。
  • 构建:持续整合系统(如Jenkins CI),在版本控制系统更新触发时自动从Git代码仓库拉取最新代码进行编译构建。
  • 单元测试:Jenkins完成后会自动执行指定的单元测试脚本。
  • 部署到测试环境:单元测试成功后Jenkins会将应用部署至与生产环境相似的测试环境中供进一步验证。
  • 预生产环境测试:经过全面验证后可以在预生境环境下执行最终自动化测试(包括Appium自动化工具调用)以及与实际运行情况高度一致的任务由开发客户团队手动完成。
  • 部署到生产环境:所有验证通过后采用灰度发布策略将新版本推送给实际生产环境以便投入运营。
(3)DevOps在落地实施过程中经常会遇到的问题

人手紧缺;跨部门协作,前期沟通培训成本高;前期投入工作量大见效少。

5、DevOps技术栈

(1)敏捷管理工具

Trello、Teambition、Worktile、Tower

(2)产品&质量管理

confluence、禅道、Jira、Bugzila。

confluence 和禅道主要是产品需求、定义、依赖和推广的综合管理平台;而 Jira 和 Bugzilla 则专注于产品质量管理与监控功能,涵盖测试方案、缺陷记录和质量评估等内容。

目前使用Jira 和 禅道较多。

(3)代码仓库管理

Git、Gitlab、Github.

Git是一个开源的分布式版本控制系统;

Gitlab 和 Github 是主要由开发者维护的开源项目,并专为仓库管理和版本控制而提供支持。它们采用 Git 作为核心代码管理工具,并在此基础上构建而成的网络服务。

(4)自动化构建脚本

Gradle、Maven、SBT、ANT

(5)虚拟机和容器化

VMware、VirtualBox、Vagrant、Docker

(6)持续集成(CI)&持续部署(CD)

Jenkins、Hudson、Travis CI、CircleCI。

Jenkins 是一个基于开源理念开发的软件平台,在计算机科学领域中具有重要地位。它主要采用Java语言构建,并以其强大的自动化能力著称。该工具专注于确保各种自动化任务的一致执行过程,并致力于打造一个简便易用且功能强大的开发环境;它不仅推动了持续集成技术的发展(即Docker连续部署),而且其起源可以追溯到Hudson项目。

它是当前新兴开源持续集成构建方案。其显著优势在于设计简洁且富有特色,并且主要原因在于采用了 yaml 格式。

CircleCI 是一个支持 web 应用开发者的持续集成解决方案,在线为开发团队或个人提供自动化测试、自动化构建与测试流程以及代码发布等服务。

(7)自动化测试

Appium

该自动化框架专为移动端设计,并适用于测试原生应用、移动网页应用及混合型应用程序等场景;同时具备跨平台特性,在iOS、Android以及Firefox操作系统中均可使用

Selenium

Selenium测试能够以真实用户的使用方式进行,在Windows、Macintosh和Linux系统上的Internet Explorer、Mozilla和Firefox都能够执行。

Mock测试

在测试过程中, 对于那些难以直接构造或难以获取的实际对象, 我们会使用一个虚拟的对象来进行模拟测试。这个虚拟的对象被称为Mock对象, 它是真实对象在调试阶段的替身。其中较为常用的是EasyMockMockito等框架。

消费者驱动契约测试

接口契约测试是一种用于评估服务组件行为规范性的重要测试方法。该方法旨在验证服务是否能够满足消费者对服务组件使用行为的预期。在实际应用中,当消费者通过服务组件进行操作时(即完成特定功能),就会形成一个行为规范。这种规范通常包括输入与输出数据格式、性能指标以及多线程处理能力等方面的期望。而PACT则是一种目前主流的消费者驱动式的行为规范性测试框架。

(8)自动化运维工具

Ansible

Puppet

Chef

IT运维 automation 主要体现在将日常繁琐重复性任务通过技术手段实现全自动化处理。这一技术转变不仅实现了工作效率的显著提升,在一定程度上使得这一领域不仅仅停留在维护层面,并且成为了一项管理上的重要组成部分,在整个 IT 运维体系中处于最高层级的重要组成部分。

(9)监控管理工具

Zabbix

Zabbix是一个Web-based开源平台支持分布式系统监控以及网络监控功能的企业级解决方案

ELK Stack日志分析系统

ELK Stack是一个免费开源的日志处理平台方案,其背后的技术公司是Elastic.该方案主要由三个核心组件构成:日志采集与解析工具Logstash,以Lucene为基础的全文字典引擎 Elasticsearch以及分析与可视化平台 Kibana.

云监控(如Amazon CloudWatch)

Amazon Cloudwatch 专注于对AWS云资源及其上运行的应用程序进行持续监控的服务。您可以通过 Amazon Cloudwatch 收集与追踪各种指标、收集与监控日志文件、设定警报以及自动响应AWS资源的变化。

转载于:https://www.cnblogs.com/xiugeng/p/10555847.html

全部评论 (0)

还没有任何评论哟~