云时代如何借助云的力量实现自动化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代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
23天前
|
jenkins Java 持续交付
软件开发自动化程度的不断提高,持续集成(CI)和持续部署(CD)成为现代软件开发的重要组成部分
随着软件开发自动化程度的不断提高,持续集成(CI)和持续部署(CD)成为现代软件开发的重要组成部分。本文以电商公司为例,介绍如何使用 Jenkins 自动发布 Java 代码,包括安装配置、构建脚本编写及自动化部署等步骤,帮助团队实现高效稳定的软件交付。
29 3
|
22天前
|
运维 Devops 测试技术
自动化运维的魔法——打造高效的DevOps流程
【10月更文挑战第28天】在数字化浪潮不断推进的今天,企业对运维效率的追求如同古人探索魔法一般充满好奇与渴望。本文将带你走进自动化运维的世界,揭秘如何通过DevOps实践,实现从代码到部署的无缝连接,提升企业的IT运营效能。我们将一起探索自动化工具的选择与配置,以及如何构建一个既能快速响应业务需求,又能保障系统稳定性的高效流程。
|
27天前
|
监控 Devops jenkins
自动化部署与监控:打造高效的DevOps流程
【10月更文挑战第24天】在追求快速迭代和持续交付的软件开发时代,DevOps成为提升团队效率的关键。本文深入探讨如何构建一个高效的DevOps流程,包括自动化部署、监控和故障排除等关键环节。通过实际案例,我们将学习如何利用工具简化运维任务,确保系统稳定运行,并快速响应生产问题。
45 2
|
1月前
|
运维 监控 jenkins
运维自动化实战:利用Jenkins构建高效CI/CD流程
【10月更文挑战第18天】运维自动化实战:利用Jenkins构建高效CI/CD流程
|
29天前
|
运维 安全 Devops
DevOps实践:持续集成与持续部署(CI/CD)的自动化之路
【10月更文挑战第22天】在软件交付的快速迭代中,DevOps文化和实践成为企业加速产品上市、保证质量和提升客户满意度的关键。本文将通过一个实际案例,深入探讨如何利用持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)实现软件开发流程的高效自动化,包括工具选择、流程设计以及问题解决策略。我们将一起探索代码从编写到部署的全自动化旅程,揭示其对企业运维效率和产品质量所带来的深远影响。
|
1月前
|
运维 监控 jenkins
运维自动化实践:利用Jenkins实现高效CI/CD流程
【10月更文挑战第18天】运维自动化实践:利用Jenkins实现高效CI/CD流程
|
1月前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进
本文探讨了如何通过自动化和智能化手段,提升IT运维效率与质量。首先介绍了自动化在简化操作、减少错误中的作用;然后阐述了智能化技术如AI在预测故障、优化资源中的应用;最后讨论了如何构建一个既自动化又智能的运维体系,以实现高效、稳定和安全的IT环境。
68 4
|
1月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
56 4
|
12天前
|
机器学习/深度学习 数据采集 人工智能
智能运维:从自动化到AIOps的演进与实践####
本文探讨了智能运维(AIOps)的兴起背景、核心组件及其在现代IT运维中的应用。通过对比传统运维模式,阐述了AIOps如何利用机器学习、大数据分析等技术,实现故障预测、根因分析、自动化修复等功能,从而提升系统稳定性和运维效率。文章还深入分析了实施AIOps面临的挑战与解决方案,并展望了其未来发展趋势。 ####
|
22天前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在故障预测和自动化响应中的应用
智能化运维:机器学习在故障预测和自动化响应中的应用
47 4
下一篇
无影云桌面