DevOps与ci/cd简介
什么是DevOps
DevOps(Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。
透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
DevOps经常被描述为“开发团队与运营团队之间更具协作性、更高效的关系”。由于团队间协作关系的改善,整个组织的效率因此得到提升,伴随频繁变化而来的生产环境的风险也能得到降低。
AWS对DevOps模式做了一个完整的定义:
DevOps集文化理念、实践和工具于一身。可以提高组织交付应用程序和服务的能力。与使用传统软件和基础设施管理流程相比,能够帮助组织更快的发展和改进产品。这种速度使组织更好的服务其客户,并在市场上高效的参与竞争。
简单来说,DevOps希望做到的是软件产品交付过程中IT工具链的打通,使得各个团队减少时间损耗,更加高效地协同工作。
DevOps发展阶段
软件行业的研发模式,可以发现大致有三个阶段:瀑布式开发、敏捷开发、DevOps。
DevOps的概念很早就有,但是为什么最近两年才开始受到越来越多的企业重视和实践呢?
因为现在有越来越多的技术支撑。微服务架构理念、容器技术使得DevOps的实施变得更加容易,计算能力提升和云环境的发展使得快速开发的产品可以立刻获得更广泛的使用。
DevOps的实现可以基于新兴的容器技术;也可以在自动化运维工具Puppet、SaltStack、Ansible之后的延伸;还可以构建在传统的Cloud Foundry、OpenShift等PaaS厂商之上。
DevOps的好处
最大的好处就是可以高效交付,这也正好是它的初衷。
Puppet和DevOps Research and Assessment (DORA) 主办了2016年DevOps调查报告,根据全球4600位各IT公司的技术工作者的提交数据统计,得出高效公司平均每年可以完成1460次部署。与低效组织相比,高效组织的部署频繁200倍,产品投入使用速度快2555倍,服务恢复速度快24倍。在工作内容的时间分配上,低效者要多花22%的时间用在为规划好或者重复工作上,而高效者却可以多花29%的时间用在新的工作上。所以这里的高效不仅仅指公司产出的效率提高,还指员工的工作质量得到提升。
对应用程序发布的影响
在很多企业中,应用程序发布是一项涉及多个团队、压力很大、风险很高的活动。然而在具备DevOps能力的组织中,应用程序发布的风险很低,原因如下:
- 减少变更范围
与传统的瀑布式开发模型相比,采用敏捷或迭代式开发意味着更频繁的发布、每次发布包含的变化更少。由于部署经常进行,因此每次部署不会对生产系统造成巨大影响,应用程序会以平滑的速率逐渐生长。
- 加强发布协调
靠强有力的发布协调人来弥合开发与运营之间的技能鸿沟和沟通鸿沟;采用电子数据表、电话会议、即时消息、企业门户(wiki、sharepoint)等协作工具来确保所有相关人员理解变更的内容并全力合作。
- 自动化
强大的部署自动化手段确保部署任务的可重复性、减少部署出错的可能性。
应用发布流程
有的公司还会有预发布环境和灰度测试
什么是CI/CD?
CI/CD包含两个独立而又互补的部分。
-
持续集成是指在应用代码的新组件集成到共享存储库之后自动测试和构建软件的流程。这样一来,就可以打造出始终处于工作状态的应用“版本”。持续集成流程中纳入了单元测试,因而可以验证软件的功能。这样可以提前识别错误,并避免反馈回路后期的周期浪费。
-
持续交付是指将CI流程中创建的应用交付到类似生产环境的过程,在该过程中将对应用进行额外的自动化测试,以确保应用在部署到生产环境以及交付到真实用户手中时能够发挥预期作用。这样还可以确保最新构建版本能够以预期方式与其他软件和应用交互。成功的CD意味着,无论是通过自动化还是手动,构建版本都随时可以部署到生产环境。
CI/CD的重要意义
- 基于业务要求按需部署软件
采用CI/CD的团队只需几分钟即可将新应用代码部署到生产环境,并且可以在最符合业务需求的时候而不是按照预定的发布时间进行部署。
- 降低软件在生产环境中无法正常运行的风险
采用CI/CD,代码在交付之前会经过严密的自动化测试,从而大幅降低错误或问题代码进入生产环境的风险。
- 实现根据客户反馈进行快速迭代
CI/CD优化了敏捷方法和DevOps,它可以提供必要的功能,将向用户持续学习所得的经验付诸实践,使团队能够以小批量快速迭代和交付软件。
- 加快发生故障时的恢复速度
如果生产环境中发生故障(这种情况极少发生),CI/CD可以快速找出错误代码并将修复程序推送到生产环境,让团队能够缩短平均恢复时间(MTTR),从而最大限度减少对最终用户的影响。
环节
- 代码仓库,用于存储程序源文件的地方。如:GitLab,Github
- 构建,这是一个持续集成工具,用于编译、打包程序,运行单元测试 如:GitLab-ci,Jenkins
- 测试,提供有关业务风险反馈的连续测试工具。 如:JUnit
- 发布,快速上线部署,自动化发布。如:docker,k8s
- 监控与日志,应用监控、基础日志,帮助快速定位问题。如:ElasticStack,zipkin
在我们项目中的实际应用
在我们应用中的pipeline流程:
gitlab -> gitlab-ci -> docker repository -> rancher(k8s)
网友评论