本系列将会从宏观角度,讲述CI/CD相关知识。系列文章不求把每一项都讲仔细,而是让大家能对CI/CD整体流程有大致的概念。无论你是前端,后端,或是运维团队,只要是CI/CD链路上的一份子,相信这系列文章对你都会有帮助。 阅读更多专栏文章
文本涉及 持续交付(Continuous delivery)
前言
我们常说的 持续交付(Continuous delivery) 指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段的过程。
一套完整的 CI/CD 工具,可以保证交付的“持续”进行(想了解 CI/CD 工具相关内容,可以参考我另一篇文章《CI/CD系列 | 一步上手Gitlab CI/CD》)。但今天,我想把重点放在“交付”本身。
为什么强调交付?
作为一名开发者,相信大家对开发流程都有充分的认识。但对于交付流程,则未必所有人都能有清晰的了解。 很多时候我们的开发项目,是由团队固定的脚手架搭建的,其中已经包含着一系列的命令。开发者只要按项目提示,执行命令,就能构建出交付物。
但作为一名好的技术者,我们应该要对我们交付的内容有所了解。甚至有可以自行调整,决定交付物构建的能力,从而在团队中担任更重要的位置。
交付是在部署做服务
交付环节实际上,是在为部署作准备。对于小团队,可能交付产物就是部署的内容。开发的交付物给到部署团队之后,就会直接替换线上服务了。而一些更具规模的团队,也许在交付之后,还会有一个评审环节,评审通过之后才给到部署团队。
但不管是哪种方式,交付物应该都是他们能直接运行的内容。因此开发团队应该构建出怎样的交付物,最终是由部署形式决定的。
部署形式的演变
接下来我们将快速地过一遍,历史上部署方式的演变。
传统部署
传统部署,或者说物理机部署,指的是早期Web服务直接跑在物理机单机上。这种方式要求所有的软件环境都安装在同一台机器上。这种方式最大的好处就是部署方便。但缺点也很明显,各个应用之间没有环境隔离,甚至会互相抢硬件资源。
因此,后来出现了集群部署,把各个应用分别部署在不同的机器上,不仅可以严格隔开各个应用的环境,还可以为不同的应用配置不同的硬件资源。
虚拟机部署
虚拟机技术的发展,让虚拟机部署的方式普及了起来。开发者可以在一台机器上,开启多个虚拟的操作系统,从而达到与直接物理机集群部署的效果。此外,虚拟机部署还有着硬件成本更低(可以省去买硬件,拓展电线,网线之类的成本),以及快速环境备份,恢复,迁移的优势。
容器化部署
容器化部署是目前使用最多的部署方式,是指在一台物理机上,运行多个容器实例,每个容器中运行特定的应用。轻量化是容器化部署最大的特点,它不需要每个容器运行完整的操作系统,和宿主机共用操作系统。同时,它的隔离性好,可以通过命名空间等进行隔离。
容器化作为一种高复杂度的技术,对团队有更高的学习成本。需要团队对各个应用之间的网络连接,以及未来业务拓展作更长远的考虑设计。
交付物的类型
了解完部署方式之后,我们可以看出,实际上我们交付物的部署情况会有两种:
- 直接跑在操作系统上。
- 跑在容器中。
由此,我们可以总结出以下的对应两种交付物类型:
语言对应的项目产物
跑在操作系统上的项目,部署环境必须要有运行项目需要的语言环境。如 Java 项目,部署机器上需要有 JDK ,NodeJs 项目,则要安装好 NodeJs等 。
同时,这种情况下,开发者需要十分熟悉项目语言,尤其是对工具链的运用。举个例子,前端项目很多时候交付物应该是页面资源(HTML,JS,CSS,静态资源等),这就要求一个好的开发者,应该要可以熟悉掌握Webpack,vite,rollup等工具的使用原理。同理,对于 Java 项目,开发者则需要掌握如 Maven,Gradle 等工具。
项目镜像
如果是容器化部署,那么交付物一般都是完整的项目镜像。项目镜像实际上就是基于项目产品,再套上一层运行环境基础镜像。
这时,开发者除了掌握工具链的时候以外,还应该懂得如何制作镜像。实际上,容器化部署的方式会越来越普遍,因此一些团队会有专门的运维团队,来负责镜像的构建管理工作。但作为CI/CD链上的一份子,我还是建议大家可以对镜像的制作有所了解。
镜像的制作
容器化部署的本质,是对多个容器的编排。目前业内使用率比较高的容器编排工具有:
- Docker三剑客的Swarm;
- Apache的Mesos;
- Kubernetes,谷歌开源的容器编排工具;
而这三者,都支持 Docker 容器的运行,实际上 Docker 也是目前业内最普遍的容器工具。因此,掌握 Docker 的使用,对每位开发者来说,都是百利无一害。我会在另一篇文章《CI/CD系统 | 一文掌握Docker镜像的构建》中详细描述Docker镜像的制作过程。
总结
今天的文章内容很简单,我希望通过目前常见的服务部署方式,让大家对自己项目的交付物形态有所了解。其中核心结论就是:选择什么样是交付物,是根据项目的部署方式决定的。
同时,我们引出了关于Docker镜像的说明,对此,我将会在下一篇文章《CI/CD系统 | 一文掌握Docker镜像的构建》中重点讲述。
如果你觉得本文对你有一点帮助,麻烦给我点个赞吧~~ 谢谢