云时代如何借助云的力量实现自动化CI/CD流程?

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 21世纪如何借助云的力量更加便捷地实现持续集成和持续交付?运维工程师如何正确使用阿里云容器镜像服务提供的持续交付和持续部署功能?本文将带领大家从一个资深运维人员的角度去探讨云时代自动化的CD(持续集成和持续部署)流程如何让运维工程师“失业”。

摘要:21世纪如何借助云的力量更加便捷地实现持续集成和持续交付?运维工程师如何正确使用阿里云容器镜像服务提供的持续交付和持续部署功能?本文将带领大家从一个资深运维人员的角度去探讨云时代自动化的CD(持续集成和持续部署)流程如何让运维工程师“失业”。


本次直播视频精彩回顾,戳这里!


演讲嘉宾简介:

谢于宁(花名:予栖),阿里云容器服务团队资深研发工程师,多年互联网摸爬滚打经验,早期从事全栈开发,后专注于 DevOps 工程化。在容器服务团队主要负责推进从研发、测试,到生产的流程自动化。 


以下内容根据演讲嘉宾视频分享以及PPT整理而成。


本次的分享主要围绕以下几个方面进行:

一、 CI/CD(持续集成和持续交付)的发展历程

二、 什么是Docker Image(镜像)?

三、 简易CD流程演示

四、 接下来应该怎么办?


一、 CI/CD(持续集成和持续交付)的发展历程

提到CI/CD,可能会有一些人不甚了解。但提到Docker,相信大部分人听说或者用过。阿里云容器服务在全球超过14个地域提供免费容器集群托管服务,在阿里云的平台上,使用者可以在几分钟甚至几秒钟之内一键搭建出一个集群,然后把自己的应用部署上线。

所谓“借助云的力量来实现持续交付”则是借助阿里云的产品进行持续集成、持续交付、持续部署,即CI/CD。从开发者的角度来看,其开发的代码想要合并到主干分支,需要经过代码分析,例如语法检查,之后甚至还要经过单元测试来检查每一个函数和API返回是否符合开发者的预期,这便是持续集成。将此代码合并到主干分支之后,阿里云提供的服务会将其推送到一个特定的环境中,这个环境可以是测试人员的一个集成测试的环境,也可以是交付到一个客户手中让其自行部署,这边是持续交付。而持续部署则是在持续交付的基础上更进一步,它能够帮助开发者将其开发的软件发布到生产环境当中。

3187b29c1c628261aedca7247e3fe973d1ca104c

从本质上来看,CI/CD并不是用于帮助开发者移除其开发的代码中出现的Bug,而是用于让开发者在开发流程中更快地发现Bug。传统的CI/CD可以总结为四个字“基本靠吼”,也就是项目管理人员在部署上线时通知开发人员进行统一的分支合并、问题校对和项目发布。

而进阶的CI/CD从某种角度来说还是“基本靠吼”。现在的运维同学们例如阿里的运维已经学会了开发和写代码,能够使用例如Ansible/Chef/Puppet/Shells等这些东西来做一些解放人力的操作。比如在我们团队的日常的工作中使用Ansible来解决一些机器的维护和预置(Provisioning),也会使用阿里巴巴自己的 StarAgent 来完成机器的批量初始化。购买到阿里云的ECS服务器之后,使用者需要在服务器上安装一些配置文件,这些本来需要运维人员人工进行输入的一些很枯燥的Provision操作,现在可以通过使用Ansible来完成,这便是我们所谓的进阶的CI/CD。但即使是这样的CI/CD也并不是我们最想要的,因为这样的CI/CD只能使得运维人员进行更加快捷的部署上线,却并不能实现生产环境无运维。怎么样才能做到生产环境无运维呢?首先我来介绍一下21世纪的CI/CD 的基础——容器。

二、 什么是Docker Image? 

相信大家都听说过容器,可能部分人只是听说却没有使用过,其实可以把容器类比为虚拟机。在部分开发者看来,容器是一个轻量级的虚拟化环境,进程在其内运行,只是所需要的内存要求更低,其实不然,容器真正关键的点在于它的镜像,也就是接下来要提到的Docker Image。

5b37ddaa1c52fe44a763a231fee4cc9a14d9a9c6


那么,Docker镜像是什么呢?从本质上来看,它是一系列的存储文件,是软件定义交付。举个例子来说,假设我想通过虚拟机打包一个软件,首先我需要安装操作系统,通常来说系统的规模通常达到GB级别。但是在相同的情况下,如果将其做成Docker镜像,分成两层,一层是操作系统层,另一层是其上的软件,完成相同目的的这两层加起来所需总的占用硬盘空间最多也就几百兆,前后对比相差好几倍甚至几十倍,优劣显而易见。谈到这里,可能有人会问,这个分层的好处是什么呢?分层核心是易于扩展,比如另外一个开发者拿到了上述的镜像,他就可以在原有的基础上做任何修改,而这种修改只需要在原有层面上继续添加层即可。分层的另一个好处是比如当我们交付产品给客户时,同时也把产品运行的环境交付给了客户,而客户所需做的只是运行产品,这就为客户提供了许多便利。


ea09b1a3a81cbff7ebc8af8e6880f246c5fc254b


组建Docker Image的过程如下图所示:


044915600abb69f7a0eb89e90421b1018b073d38

其中的“FROM”是使该镜像基于某一个基础镜像的意思,中间的“ADD”和“RUN”则是装载一些依赖包的过程,最后的“ADD”则是将当前目录的“APP”文件夹拷贝到镜像中的“APP”文件夹。然后通过使用“docker bulid”命令就可以创建一个镜像,产生的镜像所需的空间大小却只有30几兆。生成的镜像Docker Image的分层结构正如上图右侧所示,分为四层,最底层是系统层,有一个非常轻量级的系统alphine,在系统层之上安装有Python、Flask两个应用,在这之上则装有一些第三方的库,而最顶层则存储阿里开发的应用代码。当如上所述的镜像交付给客户之后,客户就可以在其系统上添加依赖之后运行我们开发的程序,这便是Docker Image提供的软件定义交付的功能。在此基础上,我们又是如何把Docker Image变成一个进程呢?很简单,只需一句“Docker RUN”然后在“-D”之后加上它的镜像地址。而这个镜像可以托管在共有云的基础服务之上,开发人员在本地将镜像建立好之后可以将其上传到云服务器上,然后再拉取运行即可。

容器内运行的应用实质上并不复杂,它只不过是一个在独立的命名空间中运行的进程,容器服务为其提供了很好的隔离性,每个应用共享系统的内核,这就使它形成了一种非常轻量级且能保证用户之间相互隔离的包装形式。

三、 简易CD流程演示

结束上文的科普,下面就进入正文环节。下面是演示所用的阿里云代码项目:

92b3c70d0dbd4c997b70d379a7a3fcb5c7a16a1b

首先,在Docker File 中定义一个镜像并安装一些依赖,以一个简单的Python的Flask应用作为样例,将其放入镜像之中。之后此应用去链接我们的Redis,此时该应用会渲染一个模板并从Redis之中取出一个值添加到HTML代码中。接下来使用者要做的便是创建一个容器镜像——Docker Image,开发者可以使用阿里云容器镜像服务,这也是阿里云上目前免费提供的服务,它可以做到容器镜像的在线构建。在此之后我们创建一个镜像仓库——CD Demo,镜像服务支持多种代码源,并不需要担心网络问题无法访问,它可以关联在其他平台的代码仓库。当开发者对某个分支的代码作出变更之后,就会通过Webhook机制触发容器镜像的构建。构建容器镜像时,阿里云容器服务会提供一个非常具有特色的功能——海外节点构建,即开发者的Dockerfile如果依赖于一些国外互联网的资源时,可以使用此功能,这样开发者就可以下载到所需要的国外节点资源,然后再将其推送到国内节点。

34c2c40dd30cfe5a7bd7e99ce77ca280ca87316d

68589980fdad546e896b6404c012a4ec07e90f97


当开发者创建好了源代码构建的镜像之后,开发者就可以使用阿里云的容器服务来辅助进行部署。使用编排模板创建应用,就可以体验Docker Compose模板。使用阿里云容器服务,开发者点击创建并部署之后只需等待几秒钟就可以把应用部署完毕。回顾下刚刚发生的场景,当开发者对代码进行修改之后,自动触发了镜像的构建,之后则是容器服务中的应用更新,这就完成了一整个CD的流程。

882a015d23a1a41caaf14731dcfeff7d2cbf02b4

流程演示到这里,是否有人发现整个流程中少了一些内容呢?是的,开发者还会需要一些反馈的内容来时刻监督开发的进度。那么这个反馈内容在哪里呢?阿里云提供了一个名为Code Pipeline的产品,该产品有点类似于Jenkins,它是阿里云上公测的一个服务,该服务在Jenkins的基础上做了非常多的改进,它打通了阿里云多种产品,并且在部署失败的时候能够及时给开发者信息反馈,以便于开发者进行修改,这种反馈支持邮件和钉钉等多种通知方式,为开发者提供了诸多便利。

45078db74e5829a140bec31cf8162931b93380dd

四、接下来怎么办? 

最关键的是传统测试转型自动化测试。如果整个CD流程依赖过多人工介入的话,那就需要比较多的人力来完成,这对于创业公司来说是一笔非常高的成本开销。 如果一个Bug到了发布上线之后才发现的话会造成很大的损失,但是如果开发人员能够在本地测试环境中发现问题,那么这个Bug所造成的损失就可以降到最低。所以我们应该培养出整个团队规范化合并的代码的习惯,哪怕一个功能上线也要保证单元测试覆盖。


相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
13天前
|
监控 前端开发 jenkins
Jenkins在前端项目持续部署中的应用,介绍了Jenkins作为自动化部署工具的基本概念和流程
【4月更文挑战第29天】本文探讨了Jenkins在前端项目持续部署中的应用,介绍了Jenkins作为自动化部署工具的基本概念和流程。前端持续部署涉及代码提交、构建、测试和部署四个步骤。实现过程中需配置代码仓库、构建、测试和部署任务,安装相关插件并确保环境一致性。注意事项包括代码质量控制、环境一致性、监控预警和安全管理。通过Jenkins,可提升前端开发效率和质量,但需不断学习以应对技术发展。
|
13天前
|
机器学习/深度学习 人工智能 供应链
【专栏】阿里云RPA的Rap程序是自动化流程脚本,基于AI和机器学习,实现业务流程自动化
【4月更文挑战第29天】阿里云RPA的Rap程序是自动化流程脚本,基于AI和机器学习,实现业务流程自动化。具有灵活性、易用性、高效稳定和智能学习等特点。广泛应用于财务、人力资源、客服和供应链等领域,未来将与AI深度融合,跨平台应用,行业定制化,并构建完善生态,助力企业效率提升和创新。
|
13天前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于容器技术的持续集成与持续部署(CI/CD)实践
【4月更文挑战第29天】 随着云计算和微服务架构的兴起,自动化运维已成为提升企业IT效率、确保系统稳定性的关键因素。本文旨在探讨如何利用容器技术构建一套高效的自动化运维体系,实现软件开发过程中的持续集成(CI)与持续部署(CD)。文章首先分析了传统运维模式面临的挑战,然后详细介绍了基于Docker和Kubernetes等容器技术的CI/CD流程设计与实施策略,并通过一个实际案例来展示该方案在提高部署频率、降低人力成本及提升系统可靠性方面的显著优势。
|
15天前
|
运维 监控 测试技术
【专栏】自动化测试、持续集成(CI)和持续交付(CD)如何提升软件开发效率
【4月更文挑战第27天】本文探讨了自动化测试、持续集成(CI)和持续交付(CD)如何提升软件开发效率。自动化测试通过特定工具和框架确保软件质量,缩短开发周期,包括单元测试、集成测试等类型,并使用Selenium等框架。持续集成在合并代码前进行自动化测试,保证代码质量,促进团队协作,使用Jenkins等工具。持续交付则实现快速迭代,自动化部署过程,降低部署风险,提高软件质量和运维效率。这三者结合助力企业在竞争中胜出。
|
18天前
|
jenkins Java 持续交付
Jenkins与Docker的自动化CI/CD实战
Jenkins与Docker的自动化CI/CD实战
|
22天前
|
存储 运维 监控
提升数据中心效率的关键策略:自动化运维流程
【4月更文挑战第20天】随着企业对数据处理和存储需求的不断增长,数据中心的效率成为了优化的焦点。在本文中,我们将探讨自动化在数据中心运维中的应用,并分析其如何显著提升操作效率、降低成本以及提高服务水平。通过案例研究和最佳实践的分享,读者将获得实施自动化运维流程的实用指南,以支持其在不断变化的技术环境中保持竞争力。
|
29天前
|
运维 Prometheus 监控
构建高效自动化运维流程的策略与实践
【4月更文挑战第13天】 在现代IT基础设施管理中,自动化运维已成为提升效率、确保稳定性和快速响应变化的关键因素。本文将详细探讨构建一个高效自动化运维流程的战略规划、关键技术选型以及实际执行过程中的最佳实践。我们将通过具体案例分析,展示如何整合配置管理工具、持续集成/持续部署(CI/CD)管道、监控告警系统以及日志分析平台,来形成一个协同工作的整体解决方案。文章的目标是帮助运维团队构建出能够适应不断变化需求的自动化框架,实现运维工作的标准化、系统化和智能化。
|
1月前
|
监控 Shell 持续交付
通过Shell脚本实现局域网管理软件的自动化部署流程
本文介绍了如何使用Shell脚本自动化局域网软件部署流程,以简化管理和提高效率。脚本包括定义安装目录、服务器列表和软件包,然后遍历服务器进行传输和解压。此外,还展示了通过Shell脚本监控网络设备和软件状态,并自动将监控数据提交到网站的功能,有助于及时发现和解决问题,提升系统稳定性。通过这种方式,可有效减轻管理员的工作负担,降低成本。
80 0
|
1月前
|
运维 Prometheus 监控
构建高效自动化运维流程的策略与实践
【4月更文挑战第3天】 在当今快速发展的IT环境中,自动化已经成为提高运维效率和确保系统稳定性的关键手段。本文将探讨构建高效自动化运维流程的核心策略,包括工具选择、流程设计、异常处理以及持续优化等方面。通过实例分析和技术深度剖析,旨在为读者提供一套可行的自动化运维解决方案。
10 0
|
1月前
|
数据采集 存储 API
网络爬虫与数据采集:使用Python自动化获取网页数据
【4月更文挑战第12天】本文介绍了Python网络爬虫的基础知识,包括网络爬虫概念(请求网页、解析、存储数据和处理异常)和Python常用的爬虫库requests(发送HTTP请求)与BeautifulSoup(解析HTML)。通过基本流程示例展示了如何导入库、发送请求、解析网页、提取数据、存储数据及处理异常。还提到了Python爬虫的实际应用,如获取新闻数据和商品信息。

热门文章

最新文章