云时代如何借助云的力量实现自动化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所造成的损失就可以降到最低。所以我们应该培养出整个团队规范化合并的代码的习惯,哪怕一个功能上线也要保证单元测试覆盖。


相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
利用 GitHub Actions 自动化你的软件开发流程
GitHub Actions 是由 GitHub 提供的自动化工具,可让你在仓库中触发和执行自动化工作流程,如自动运行测试和部署应用。其核心概念包括工作流程(定义在 YAML 文件中的一系列自动化步骤)、作业和步骤。本文将指导你如何设置和使用 GitHub Actions,并提供实用的自动化示例,帮助你提高开发效率和代码质量。通过简单的配置文件,你可以实现自动运行测试、部署应用甚至自动合并 Pull Requests。
利用 GitHub Actions 自动化你的软件开发流程
在现代软件开发中,自动化是提升效率与质量的关键。GitHub Actions 作为 GitHub 的强大自动化工具,允许你在仓库中自动执行多种任务,如测试、打包、部署代码及自动合并 Pull Requests。本文介绍了 GitHub Actions 的核心概念、设置方法及其实用示例,帮助你快速上手并优化开发流程。通过 YAML 文件定义的工作流程可显著提高工作效率和代码质量。
|
24天前
|
开发者
利用 GitHub Actions 自动化你的软件开发流程
在快速发展的软件开发环境中,自动化对于提升效率与质量至关重要。GitHub Actions 作为一款强大的工具,能帮助开发者实现从自动运行测试到部署应用等工作的自动化。本文详细介绍了 GitHub Actions 的核心概念、设置方法及实际应用示例,如自动测试、部署和合并 Pull Requests,助力提升开发流程的自动化水平。
|
28天前
|
缓存 数据可视化 jenkins
推荐2款实用的持续集成与部署(CI&CD)自动化工具
推荐2款实用的持续集成与部署(CI&CD)自动化工具
利用 GitHub Actions 自动化你的软件开发流程
GitHub Actions 是 GitHub 提供的自动化工具,可在仓库中触发和执行工作流程,包括自动运行测试、部署应用等。其核心概念包括工作流程(Workflow)、作业(Job)和步骤(Step),均定义在 YAML 文件中。本文将指导你如何设置和使用 GitHub Actions,并提供自动运行测试、部署应用及合并 Pull Requests 的示例,帮助提高开发效率和代码质量。
|
2月前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
49 1
|
2月前
|
持续交付 jenkins C#
“WPF与DevOps深度融合:从Jenkins配置到自动化部署全流程解析,助你实现持续集成与持续交付的无缝衔接”
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)项目中应用DevOps实践,实现自动化部署与持续集成。通过具体代码示例和步骤指导,介绍选择Jenkins作为CI/CD工具,结合Git进行源码管理,配置构建任务、触发器、环境、构建步骤、测试及部署等环节,显著提升开发效率和代码质量。
48 0
|
29天前
|
运维 Ubuntu Devops
自动化运维工具的魅力:Ansible入门
【9月更文挑战第5天】在快速变化的IT世界里,自动化运维不再是可选项,而是必需品。Ansible,一款简单却强大的自动化工具,正成为众多DevOps工程师的首选。本文将带你了解Ansible的基本概念、安装步骤以及如何编写简单的Playbook,从而开启你的自动化之旅。
67 36
|
6天前
|
机器学习/深度学习 运维 Cloud Native
构建高效运维体系:从自动化到智能化的演进之路
在当今数字化时代,运维作为信息技术的重要支柱,其效率与创新能力直接关系到企业信息系统的稳定性和业务连续性。本文将探讨如何通过技术手段,实现运维从传统手工操作向自动化、智能化的转变,进而构建一个高效、可靠的运维体系。我们将从自动化工具的应用开始,逐步深入到智能运维的实践,最终展望云原生架构下的运维未来趋势。
|
9天前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进之路
在当今数字化时代,运维作为保障企业IT系统稳定运行的关键环节,正经历着前所未有的变革。本文将探讨如何通过实施自动化和引入智能化技术,构建一个更加高效、可靠的运维体系,以应对日益复杂的业务需求和技术挑战。
22 1
下一篇
无影云桌面