想小步快跑吗?来一份持续集成流水线套餐吧

前言

随着云计算的不断成熟,人们已经意识到计算机自动化带来的优势,因此传统工业中越来越多的工作逐渐交由软件控制。软件研发组织更应该转变生产方式,将重复的低成本的人工处理转变为软件自动处理。

《Google软件测试之道》中说道:“每天,Google都要测试和发布数百万个源文件,亿万行代码。数以亿计的构建动作会触发几百万次的自动化测试,并在好几十万个浏览器实例上执行。面对这些看似不可能完成的任务,谷歌是如何测试的呢?”

我们在平时的工作中,总有一部分工作是相对机械化的,易出错的,例如一次又一次的打包部署应用。如果可以把这部分工作交给机器来做,我们仅需要轻轻地点一下鼠标,再泡杯咖啡就能让自己轻松地完成工作,岂不是美滋滋?

此时,我们就可以考虑引入自动化持续集成工具。一套连贯的工作流程和流水线可以大大的简化大规模项目的部署。

简单地说,使用自动化持续集成工具的目的,是为了让我们仅仅去关注产品开发中最核心的功能:编写代码,满足用户需求的功能。

用友云技术中台(开发者中心)提供的持续集成流水线功能,就是我们基于Docker容器精心打造的一款自动化持续集成工具。

在本系列文章中,我们将探讨在容器时代如何在基于Docker的环境中创建连贯的工作流程和流水线来简化大规模项目的部署。另外,我们还将详细介绍如何使用技术中台的持续集成流水线,以满足客户所需的使用场景。

什么是持续集成流水线

在了解持续集成流水线之前,我们首先了解一些概念。

什么是持续集成

一个软件开发方面的著作者马丁福勒说得很好:“ 持续集成(CI,Continuous Integration)是一种软件开发实践。如果团队开发成员经常集成他们的工作,每次集成都通过自动化的构建——包括编译,发布,自动化测试——来验证,则可以尽早地发现集成错误。”

可以看到,如果每个成员每天至少集成一次,则整个系统每天就会发生多次集成。

CI的优点在于,整合代码变成了“非事件”,软件一直在编写和集成。在出现CI以前,代码集成发生在创建过程结束之后,所有整合一次性完成,其需要花费大量时间。现在有了CI,代码集成每天都在发生,并且只需要花费几分钟的时间。

什么是持续集成流水线

所谓技术中台持续集成流水线,是指技术中台里提供的一种持续集成加代码部署能力,它以应用为中心,在技术层面将集成后的代码部署到客户所需的多套环境中,形成自动化持续交付工作流,最终打造为一条结构完整的流水线。

对于流水线的概念,我们可以参考汽车工厂的生产线来理解。如果要建造一辆新车,需要先安装模具冲压,获得我们想要的模具;然后根据模具进行焊装,涂鸦工艺;最后对车辆进行总装,安装发动机、变速箱等。经过各模块装配和各零部件的安装后,再经过车轮定位、车灯视野检测等调整后,整辆车就可以下线使用了。

将整个汽车流水线中的各个环节,类比至软件持续集成中,就可以更好的理解持续集成流水线。如将其中的模具冲压理解为代码获取;将模具焊装理解为代码构建;将涂鸦工艺理解为生成镜像;将车辆下线理解为应用发布等。

顺势而生的持续集成流水线

在DevOps的理念中,企业的IT价值链流转的速度越快,意味着企业互联网产品的交付能力越强。这也意味着企业在同行业的竞争中,凭借IT能力的优势,能够收获更大的竞争优势。

软件的开发过程已趋于成熟,其过程中涉及产品经理、研发、测试、运维等各个角色。一般情况下,各角色间的开发过程为:

·项目一开始是先划分好模块,分配模块给相应的开发人员;

·开发人员开发好一个模块就进行单元测试;

·等所有的模块都开发完成之后,由项目经理对所有代码进行集成;

·集成后的项目由项目经理部署到测试服务器上,被交由测试人员进行集成测试;

·测试过程中出现 Bug ,就把问题记录至 Bug 列表中;

·项目经理分配 Bug 给相应的责任人进行修改;

·修改完成后,项目经理再次对项目进行集成,并部署到测试服务器上;

·测试人员在下一次的集成测试中进行回归测试;

·通过通过之后就部署到生产环境中;

·如果测试不通过,则重复上述“分配 Bug → 修改 Bug → 集成代码 → 部署到测试服务器上 → 集成测试”工作。

这个过程中可能会出现如下问题:

·应用交付中的各环节没有真正打通,交付周期过长

·应用问题不能及时发现,并不断积累,影响交付质量

·无法自动化验证并解决问题,研发效率低

·没有统一视角的研发过程,各部门间沟通效率差,浪费大量资源

为解决这些问题,人们发明了DevOps理念。

DevOps实现了将研发与运维的功能流程形成闭环。在此闭环下,应用的构建、编译、部署等环节紧密连接在一起,从而将研发、测试、运维等人员紧密结合在一起,打通了部署相关的各个环节,降低了沟通成本,缩短了产品的部署周期。

那么结合DevOps理念,打造一款符合互联网应用架构特点,能够助力企业数字化转型的产品就变得尤为重要。持续集成流水线便在这其中顺势而生。

开发者中心提供的持续集成流水线为研发及运维人员带来了如下好处:

·实现应用快速发布,应对业务需求,并更快地实现产品价值

·缩短构建、部署、测试、上线的迭代周期,同时增强了反馈机制

·有利于产品研发、实施和发布的标准的推进,规范了整个产品交付过程,有助于提升产品质量

·整个应用交付过程进度可视化,方便研发及运维人员跟进产品,了解部署进度

·推动了DevOps理念的落地,推进团队以更先进的协作方式,加强了与产品相关的各角色间的密切协作,减少了资源浪费。

持续集成流水线的技术详解

在开发者中心的持续集成流水线中,持续集成的过程被拆分为了拉取代码、分析代码质量、编译代码、单元测试、生成镜像、请求部署、数据库变更、审核、执行部署等环节。各个环节相互联结,有机的结合为一个整体。

当用户将流水线中各个环节的配置修改完成后,仅需点击一个按钮,持续集成流水线即可按照要求,按顺序执行各个环节,最终完成应用的构建和部署操作。

在技术层面,持续集成流水线为满足各节点的功能需求,除引入大量的新技术外,还自主开发了设计了整套代码逻辑。本文以几项核心技术为代表,讲解持续集成流水线中几个具体功能的实现过程。

1.源代码管理系统

为满足用户的不同需求,持续集成流水线提供了从Gitlab、GitHub拉取代码,根据已有镜像部署应用,及直接上传应用包等方式,管理应用代码的来源。

我们知道,Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。它提供了协同修改、数据备份、版本管理、权限控制、分支管理等功能。目前国际大型的利用Git技术管理代码的网站有GitLab、GitHub等。

开发者中心的持续集成流水线,完美支持从GitLab和GitHub获取源代码,且同时支持HTTP和SSH两种获取代码的方式。

所谓基于HTTP方式,即使用克隆命令获取原码,如:

基于SSH秘钥方式,即通过上传用户公钥方法,从代码仓库拉取源码的方式。

对于用户而言,操作者可以直接在本地虚拟机中通过修改~/.ssh/config文件的方式来实现免输入密码的git访问,但对于系统来说,此种方式存在诸多弊端,因此需要考虑用其他更加灵活的方式实现所需要的功能。

开发者中心的持续集成流水线,使用了GIT_SSH技术,编写了git.sh脚本,将其与流水线的执行代码相结合,实现了使用SSH秘钥方式拉取源码功能。

在完成此脚本后,即可以利用类似以下命令来实现拉取源码的功能:

2.代码构建引擎

对于用户的应用而言,其不同的功能模块可能由不同的语言来实现,如Java Web、Node.js、Python、GoLang等。不同的语言内部也有不同版本的区别。通常,传统软件在构建这些应用时,需要分别建立对应环境的虚拟机,进而分别构建和编译。这增加了代码构建的成本,增加了编译时的不稳定因素,降低了代码的编译效率。

为解决这些问题,开发者中心持续集成流水线功能做了对应的优化处理,并完美支持多种类型应用的构建及部署,极大的促进了构建的效率。那么,持续集成流水线是如何实现的呢?又是如何解决多种编译环境的问题的呢?

考虑到目前的实际情况,大多数的应用通常采用Java语言编写。因此,持续集成流水线的编译模块即使用Java语言编写,在拉取用户的代码后,直接在本地环境中即可编译Java语言编写的应用。

在编译代码环境,我们的构建服务器预设了Maven的编译工具以及JDK,用户在此处可以根据需要,定制化输入编译命令,满足不同的代码编译方式。

在长期的线上运维实践中我们发现,当用户使用量的增加,构建更加频繁时,Java应用的构建速度会受到影响,这会导致一次应用构建并上线需要 消耗过长的时间。对于这一点,持续集成流水线做了相应的优化,显著提高了构建速度。

具体来说,持续集成流水线采用了Maven的本地缓存技术,在构建服务器的Maven的Settings文件里设置了本地缓存仓库。同时,流水线的构建服务器使用了Docker容器技术,启动了多个实例,同时编译应用。在各个构建服务容器中,我们加入了NAS存储目录,并将此目录映射至宿主机的NAS目录,这样就实现了缓存多实例共享,减少构建时间的功能。

对于其他语言编写的应用,持续集成流水线使用了Docker容器技术,构建出所需要的编译环境,并在此环境中编译对应类型应用的代码。

具体来说,持续集成流水线为每一个语言预设了一个Docker基础镜像。在编译代码时,通过Dockerfile将源码包拷贝进生成的编译镜像中,在镜像中进行编译和执行命令从而获得编译后的产物。使用Docker镜像编译的好处是不用每次编译都预装相关的编译环境,也排除了多种编译环境编译导致出不可预知的问题。

在用户使用过程中,我们发现使用npm命令编译Node.js类型应用的时间较长,具有较大的优化空间。提供npm缓存是一种可行的增加构建效率的方式。因此,我们在构建服务器中搭建了一个npm的缓存仓库-Sinopia。

在构建代码中获取到了构建服务器的IP后,在Node.js编译容器中,使用对应命令将编译镜像的registry地址指向了Sinopia的服务端口。这样,应用在编译过程中,npm会优先从Sinopia先查找相关依赖。若依赖不存在,则支持从外网下载并缓存到Sinopia中。

3.镜像管理系统

开发者中心流水线基于Docker容器预先准备了各个语言的运行环境。为满足客户定制化需求,持续集成流水线还开放了自定义镜像和自定义Dockerfile构建功能。

持续集成流水线的镜像管理系统直接与镜像仓库相连接,镜像仓库中保存着各个类型应用对应的基础镜像。用户构建时,可以直接从镜像管理系统中选择对应的基础镜像,完成应用的生成镜像操作。当应用的Docker镜像构建完毕后,会自动通过镜像管理系统,提交至镜像仓库中,为应用的部署做准备。

使用持续集成流水线提供的Dockerfile构建功能,能够更好的实现定制化需求,如使用自定义基础镜像,自定义构建步骤等。

在编写Dockerfile的过程中,持续集成流水线推荐使用Docker多阶段构建(Multi-Stage Build)技术。

Docker在构建镜像时,会严格按照Dockerfile执行,每执行一次构建则会生成一层新的镜像层,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际并不是真正的删除前一层的文件,而仅仅是在当前层标记为该文件为删除状态。在最终容器运行的时候,虽然在文件系统中不会查看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

使用多阶段构建技术,可实现减小Docker镜像大小的目标。例如在持续集成流水线中编写如下Dockerfile:

在本示例中,第一阶段对环境做了相应的适配,自定义了安装环境。同时,Docker在第二阶段构建过程中,直接使用了第一阶段执行mvn 编译后的构建产物生成镜像。最终镜像中不会再包含第一阶段构建过程中产生的临时文件。

综上,灵活的使用开发者中心持续集成流水线提供的功能,可以更好的满足客户定制化需求,并提升构建和部署效率。

小步快跑,带你体验一次流水线构建之旅

看了上面的技术详解,想必您已经迫不及待的想动手创建一个流水线了吧!下面我们就通过几个使用场景,带你体验一次流水线构建之旅。

小步快跑场景一:复杂应用轻松部署

用友集团U8C要全面云产品化,其领域模块涉及到应用数量繁多,相互调用依赖关系复杂。使用传统方法,人工手动分别创建这些应用,部署并维护整个系统,将会是一个费时费力又极易出错的工作。对此,开发者中心持续集成流水线是解决问题的不二之选。

使用持续集成流水线部署应用的流程如下:

首先根据创建流水线的基本流程,按照要求填写流水线名称、产品产品线、应用类型、选择资源池和环境以及应用的基础配置等信息,完成后点击 “创建应用”按钮,即可迅速生成一条可自动化执行的流水线。

点击页面右上角的【应用配置】,可以查看流水线的基本信息。

流水线创建并成功执行后,会自动创建出一个该环境下的应用。点击流水线页面的“应用管理”按钮可以查看应用的详情信息。开发者中心对部署的应用自动适配了负载均衡服务和泛域名解析服务。待应用健康之后,可以直接通过页面所示域名访问应用。

小步快跑场景二:适配多套环境,从开发、测试到生产,一键搞定

传统开发过程中,应用的各产品阶段是分离的。开发完成后,我们需要按照开发的配置重新搭建一套测试环境,测试通过后又需要按照测试环境的配置搭建生产环境,每次产品的发布都要经历很长的过程。

使用持续集成流水线,让你的应用跑起来。在流水线中选中测试环境,点击“复用”按钮,选择复用“开发环境流水线”,确定后即可得到一条和开发环境相同配置的测试环境流水线。修改相应的代码分支、资源池,点击执行即可得到对应的测试环境应用。生产阶段亦然。

同时,每次应用更新也不需要做一堆繁琐的操作,只需点击“执行流水线”按钮,系统自动拉取对应分支代码,构建并部署,实现应用的升级操作。

小步快跑场景三:配置文件,一次提取,随时编辑,立即可用

对于应用而言,一个应用自身的配置文件可能较多,同时各个环境下对应的配置也不尽相同。使用持续集成流水线的配置文件功能,可以更好的管理配置文件。

进入到流水线页面后,点击“应用配置”按钮,选中“配置文件”页签,可以一键提取工程中的所有配置文件。同时,这些配置文件与环境相对应,我们可以根据每个环境的需要编辑配置文件。系统同时还支持自定义添加配置文件功能。

如果多个应用具有相同的配置,则不需要重复创建配置文件,直接使用公共配置文件功能即可。

小步快跑场景四:安全把关,流水线审批责无旁贷

当生产环境的应用执行时,我们更加关注的是流水线的配置是否正确,是否按照需要执行等,以免影响线上应用。

为了提升上线操作的安全性,我们需要专门的管理人员对重要流水线把关。这时,流水线审批功能显得尤为重要。

在技术中台提供的持续集成流水线中,在编辑流水线的时候,只需要开启审批节点,添加对应的审批人,即可实现审批功能。之后,当再次执行流水线时,流水线将自动停留在审批节点,同时给相应的审批人员发送审批通知。当审批人审批通过之后,流水线才会继续执行后续上线步骤。

总结和未来展望

本文主要介绍了用友云技术中台(开发者中心)核心模块——持续集成流水线的起源及功能,描述了其提供的核心能力,介绍了其提供的技术细节及使用场景等。相信经过本文的介绍,您可对其有更深入的理解。

曾经,持续集成过程面临着诸多挑战,如多套环境间,环境及应用一致性问题等,在以Docker为代表的容器技术出现后得以解决。

现在,持续集成过程已然成为现代化应用开发中一个并不可少的元素,其发展绝不会停下脚步,并将继续处于高速的发展中。

未来,用友云技术中台的持续集成流水线将继续完善,丰富其功能以满足用户的更多需求。因此,我们也希望您在使用过程中积极地为我们提供相关建议。

开发者中心,将因你变得更加精彩!

往期精彩

· 【技术中台月干货第一篇】企业需要拥有自己特色的DevOps

· 【5月数据中台月第四弹】用友智能分析平台:自助式数据可视化,快速透视数据

· 【5月数据中台月第三弹】数据移动:数据流的高速通道

· 【5月数据中台月第二弹】数据成为一种企业资产还有多远?

· 【5月数据中台月第一弹】“智慧数据”助力企业与大数据融合

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章