原文链接:
http://click.aliyun.com/m/25026/
摘要: 前言 随着微服务架构与容器虚拟化技术的发展,持续集成与持续交付的概念又重新回到了大家的视野,越来越多的公司开始使用持续集成的系统来解决频繁发布带来的质量问题;使用持续交付的工具来实现代码在不同环境上的自动部署。
前言
随着微服务架构与容器虚拟化技术的发展,持续集成与持续交付的概念又重新回到了大家的视野,越来越多的公司开始使用持续集成的系统来解决频繁发布带来的质量问题;使用持续交付的工具来实现代码在不同环境上的自动部署。原本有些学院派乌托邦式的思想正被千千万万次的集成与部署证明着它应有的价值。那么究竟是因为什么让持续集成与持续交付这个已经不再年轻的软件开发与交付的思想重新焕发绽放迷人的光彩呢?
传统软件交付之殇
传统软件的开发与交付的周期都很漫长,一款普通的企业软件通常需要十几个开发人员,几个月的时间来完成,从需求的分析、系统的设计、编写测试用例、系统开发、单元测试、组装测试到交付调试。有条不紊的流程与规范像一辆绿皮火车下的枕木,稳定而可靠的保证整个系统缓慢的推进,每一次交付、升级,都需要提供基础的硬件、软件的环境、软件的代码、软件的文档与手册。还记得刚刚迈入软件开发行业的时候,跟随公司的服务团队,驻场交付产品,每一个驻场工程师都按照之前预演过好多遍的流程,对照着系统的部署手册,一步一步的组装硬件,安装软件,稍有差池,就要按照对应的应急预案进行回滚。开始的时候觉得交付像一个神圣的仪式,将用智慧和汗水构建成的软件交付给客户使用,是一种非常荣耀和值得骄傲的事情;后来越来越多次的产品交付让我深深的感觉每一次交付都像分娩一样痛苦,扪心自问是否有简单更舒畅的流程可以将软件交付给客户呢?
传统模式的反思与CI/CD概念的提出
e8cdc7406d3d90dc853a8fd683d06eac767e3bd4
通常来讲,一个软件的生命周期分为问题的定义、可行性的分析、系统设计、系统编写、系统测试与调试、系统部署与交付、维护与升级等步骤。在传统软件的生命周期中,更倾向于使用瀑布流的模式来去有条不紊的规范整个流程,每一个阶段都期望遵循“活动-结果-审核-再活动-直至正确”的流程来保证系统稳定。整个软件的生命周期就变成了一个很长的二维线性的流程。这也制约了软件的开发迭代与交付的速度,前辈们想了非常多的办法来提高整体的开发速度,比如将一个单体的系统系统设计成为服务化的分布式的子系统,这样可以让一个大型的单体软件的开发变成多个小的独立系统的并行开发;使用组件化的方式组建系统,在不同的系统间复用模块加速开发;通过自动化工具或者脚本进行自动化部署与交付等等。
诚然,这些都解决了软件交付过程中的一些问题与难点,但是这些方式都像西医一样,治标不治本,因为要想快速的交付,首先要明白软件交付过程中遇到的核心问题是什么。总结成两个词“自动”与“可靠”。自动是一个很宽泛的词汇,在软件交付中代表着测试自动化、交付自动化、运维自动化等等,而可靠讲的是每一次交付要保证是当前的交付是稳定的或可回滚到稳定版本的。
为了解决“自动”与“可靠”的问题,敏捷开发鼻祖Martin Fowler提出了持续集成与持续交付的概念,它所描述的软件开发,是从原始需求识别到最终产品部署到生产环境这个过程中,需求以小批量形式在团队的各个角色间顺畅流动,能够以较短地周期完成需求的小粒度频繁交付。频繁的交付周期带来了更迅速的对软件的反馈,并且在这个过程中,需求分析、产品的用户体验和交互 设计、开发、测试、运维等角色密切协作,相比于传统的瀑布式软件团队,更少浪费。通过这种小步快跑的方式,将小功能快速迭代、验证、交付,通过自动化的工具,将测试、部署、运维自动化,减少需求在软件生命周期中流动的时间。但是为什么看上去可以奉为圭臬的持续集成与持续交付的思想却在相当长的时间被开发者束之高阁呢?
实现持续集成持续交付的难点
对持续集成持续交付有一些理解与体会的开发者会经常看到类似下面这张图的持续交付流程。
5272a00477e2f444ae27159412f41075cfc9ad24
在这张图中我们讲述了一个持续集成与持续交付的流程,从代码的提交、构建与编译、单元测试到部署环境、集成测试与发布。软件交付本身就是一件复杂的事情,不同的产品、不同的架构、不同的业务形态会导致持续集成与持续交付的实现上有非常大的不同。还记得很久以前流行一个关于哲学的笑话,当你问十个哲学家什么是哲学的时候,你会得到十一种答案,因为每个人都有对哲学不同的理解。对于持续交付也一样,Martin Fowler讲述了一个乌托邦式的软件开发与交付的模式-持续集成与持续交付,但是前辈只给了我们先进的思想,并没有给出默认的实现。不同的公司、不同的产品、不同的技术栈、不同的开发与部署形态决定了持续集成与持续交付注定是因人而异的,在大家不断摸索什么样的方式是持续集成与持续交付的最佳实践的过程中。有的人做少了,只实践了其中的一部分,导致基本的交付能力上有缺欠;有的人做多了,引入了更多复杂的流程,导致原本应该提速的交付流程,像穿着名牌高跟鞋参加跨栏一样,怎么也快不起来。
如果将上面的流程具象化一个LNMP(Linux、Nginx、MySQL、PHP)的例子,就变成了如下的过程。
b632e8e6e1d395c113bfb413f5af37d4fdda6101
我们会发现当整个持续交付的流程流转到了持续交付系统的时候,流程开始和具体的环境与编程框架开始耦合,比如单元测试在这个例子中需要运行PHPUnit相关的命令去实现;准备环境需要根据具体的部署环境是KVM的虚拟机还是物理机或者是云服务器区别实现;配置环境需要根据具体的编程模型来准备在本例中会通过自动化配管工具例如Ansible来验证与准备不同环境中的代码运行时环境;分发代码后的流程在本例中是通过重启Nginx实现。其实这就是持续集成与持续交付真正难的部分,它并没有特定的要求规定什么流程该用什么方式做什么,就像大型软件系统的架构设计,只有“法”没有“型”,这也就是为什么程序员有很多,但架构师少的可怜的道理。
归根结底,持续集成与持续交付的难点在于如何屏蔽不同语言、不同框架、不同系统之间的持续集成与持续交付流程的差异性。曾经幻想过是否能有一种方式可以归约软件的交付,而这就是Martin Fowler留给我们的课后思考题-论如何实现持续集成与持续交付的流程标准化。
新的交付之道——容器标准化交付
容器虚拟化这几年随着Docker的推出,也逐渐进入到开发者的视野中。刚刚接触Docker的时候,按照学习新知识的习惯,我将Docker和虚拟机或者虚拟化进行了等同,认为他们是一个领域的不同实现,通过类比的方式来学习Docker。但是后来我发现,Docker的意义不在于解决软件底层的环境定义的问题,更多的是在解决交付的问题。
在上文中我们讨论了为什么持续集成与持续交付对于很多公司来讲是有难度的。而解决这个问题的最理想的办法就是是否有一种方式可以将交付的流程编程一个标准化,这样进行持续集成与持续交付的开发者可以很快的像读说明书一样,一步一步完成自己的持续集成与持续交付流程。
容器给交付带来最大的变革就是标准化。
Dockerfile:将代码和环境打包成了镜像,将原来系统中分发的最小单元由代码变成了镜像,不同的环境、不同的软件、不同的配置都可以通过Dockerfile的配置来实现,标准化了交付的最小单元,让交付的最小单元不再和环境、编程框架耦合。
Docker API:将软件的生命周期管理从原来的不同框架不同实现变成了统一标准的命令。启动软件变成了docker run,停止软件变成了docker stop,重启软件变成了docker restart。
原文链接:
http://click.aliyun.com/m/25026/
分享到:
相关推荐
《魅族持续集成及云端交付之路》是一份深入探讨手机制造商魅族在软件开发过程中的实践与探索的文档。这份资料主要围绕两个核心概念:持续集成(Continuous Integration, CI)和云端交付(Cloud Delivery),旨在阐述...
在上一篇中,和大家一起讨论了传统软件交付的问题、持续交付的难点、以及为什么云端的容器交付可以协助大家快速的持续交付。但是当真正的将一个系统通过云端容器交付的时候会发现不能单纯的将Docker作为一种交付工具...
### 软件工程中的持续集成与交付技术 #### 第1章:软件工程概述 - **定义**:软件工程作为一门学科,涵盖了软件从概念到完成的整个生命周期,包括需求分析、设计、编码、测试、部署及后续维护等多个环节。 - **...
随着应用向云端迁移,持续集成与交付成为一项核心技能。然而,云原生 CI/CD 技术与工具繁多,跨项目迁移难度大,对于缺乏经验技术人员来说,学习曲线陡峭。本文从零带大家掌握CI/CD工具与平台,模拟企业项目流程,...
35. 02-5持续部署与发布-1持续交付与持续部署 36. 02-5持续部署与发布-2微服务架构与微服务化应用 37-39. 02-5持续部署与发布-3容器技术概述 40. 02-5持续部署与发布-4自动化的实现“一切即代码” 41. 02-5持续...
微服务化则打破了这一局面,每个服务都可以独立开发、测试和部署,从而实现了快速响应和持续交付。 微服务架构带来了显著的好处,如明确的服务边界,使模块化设计更加清晰;支持独立部署,使得服务可以在不影响其他...
5. **持续集成/持续部署(CI/CD)**:云端系统可能集成了CI/CD流程,如Jenkins、GitLab CI/CD等,以自动化代码构建、测试和部署,确保快速响应变化和高质量交付。 6. **安全性与隐私保护**:云端系统需要考虑数据加密...
灵雀云以容器这个新一代应用交付件为中心,全方位支持云端应用创建、编译、集成、部署、运行的每一个环节。灵雀云采用Docker技术,提供多环境下开发,测试到部署的一站式解决方案,让用户实现持续集成、持续部署,...
- **持续交付(Continuous Delivery)**:通过自动化测试和部署流程,确保新功能可以快速、安全地集成到生产环境中。 - **微服务架构**:将大型应用程序分解为一系列小型、独立的服务,每个服务都可以独立开发、部署...
Dory-Engine是一款轻量级的应用上云引擎,它的设计目标是简化应用程序部署到云端的过程,使得开发者可以更快速、更高效地将他们的应用服务化并迁移到云端环境。这款引擎充分利用了云原生技术,旨在提高应用的可移植...
为了更好地支持这一趋势,云计算领域,特别是云原生技术,如Docker容器技术及Kubernetes容器编排技术,成为了现代软件开发、交付和运维的标准工具。 #### 二、面临的挑战与机遇 1. **深度学习训练的高计算需求**:...
Cloud Native CI/CD(持续集成/持续交付)是现代互联网行业中的一种关键实践,它在云原生时代扮演着至关重要的角色。云原生(Cloud Native)是指一种构建和运行应用程序的方法,充分利用云计算的优势,如弹性、可...
- **CI/CD 集成**:集成持续集成/持续交付 (CI/CD) 管道,实现快速、可靠的部署过程。 - **人工智能整合**: - **算法增强**:利用机器学习和深度学习算法增强人体识别技术的准确性和效率。 - **高级生物识别...
9. **持续集成/持续部署CI/CD**:阿里云CodePipeline为开发者提供了一站式持续集成和持续部署解决方案,加速软件交付流程,提升团队协作效率。 10. **DevOps工具链**:包括代码托管(CodeHub)、项目管理...
1. Azure DevOps Services:这是微软提供的一个全方位的云端服务,包括代码管理、版本控制(如Git)、敏捷项目管理、持续集成/持续交付(CI/CD)、测试管理和协作工具等。 2. Azure Repos:用于源代码管理,支持Git...
综上所述,长沙国家高新技术产业开发区与微软的合作旨在构建一个全方位支持初创企业的孵化平台,涵盖从技术支持到业务咨询的一系列服务,旨在促进区域内科技创新和产业发展,为创业者提供一个理想的创业环境。