软件开发的关键流程即将发生巨变!
Posted 码农翻身
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件开发的关键流程即将发生巨变!相关的知识,希望对你有一定的参考价值。
持续集成(CI)是指开发人员会定期将代码变更合并到一个中央存储库中,之后系统会自动运行构建和测试操作,通过频繁地集成,达到控制代码质量的目的。
经过几十年的发展,持续集成已经成为软件开发的标准配置,为开发人员所熟知,如今,不使用持续集成的软件公司是不可思议的。
在持续集成的工具链中,Jenkins 起步较早,积累深厚,凭借良好的生态,丰富的插件,被广泛使用。
但是进入云原生时代以后,应用程序的部署和基础设施都发生了重大的变化,Jenkins并没有跟上脚步,反而暴露出了一些问题,例如流水线编排引擎不够稳定,并发性能差,开发插件很麻烦等等。
那么在云原生时代,持续集成应该是什么样子呢?
上周末我参加了 TechoDay 腾讯技术开放日第二期活动,这一期主题是 云原生全栈开发与实践,其中有一场正好是云原生时代的持续集成,讲了腾讯云CODING CI 3.0 ,看完以后感觉到:这也许就是未来的发展方向吧,今天给大家分享一下。
1
Pipline as Code
云原生提倡“基础设施即代码 (Infrastructure as Code)”,即通过代码来定义基础设施,并且被版本管理系统所管理,对应到持续集成中,即 Pipline as Code。
大家都知道,持续集成中的 Pipline 是一系列任务的编排,例如:
图形化的背后是配置文件(以Jenkins为例):
pipeline
agent any
stages
stage('检出')
steps
checkout([$class: 'GitSCM',
branches: [[name: GIT_BUILD_REF]],
userRemoteConfigs: [[
url: GIT_REPO_URL,
credentialsId: CREDENTIALS_ID
]]])
stage('单元测试')
post
always
junit 'build/test-results/**/*.xml'
steps
sh './gradlew test'
......
这种方式有两个缺点:
1. 它偏向命令式,需要精确告知 Jenkins 操作的每个步骤,编写、维护并不方便。
2. 它被Jenkins管理,不方便配置复用
腾讯云CODING CI 3.0 则通过简单的 YAML 文件解决了这两个问题。
这段示例的意思一看就明白:当 master 分支有 push 的时候,触发一次构建,构建在 centos:8 这个 Docker 容器中进行,只输出一个文本:hello world。
纯文本的、声明式的配置文件,无论是在可读性/可维护性,都要比命令式的代码清爽得多。
并且这种文件可以保存到代码仓库中,不但方便版本管理,也容易让不同项目和团队之间进行复用。
2
基于容器的CI设计
在上面的示例中已经提到了在 Docker 容器,实际上,腾讯云CODING CI 3.0 是完全基于容器设计的。
这是什么意思呢?举个简单的例子就明白了。
假设你的CI Pipeline有两个任务,一个做编译,一个做测试,那在Pipeline执行过程中会把代码从代码仓库下载到某个目录,然后把这个目录挂载在一个docker容器来做编译,再挂载到另外一个docker容器做测试。
相对于虚拟机(VM),Docker镜像启动速度飞快,使用方便,而且对环境的依赖全部都声明在YAML文件中,可以跟着仓库走。
master:
push:
stages:
- name : compile
image : docker-image-1
script: xxxx # 做编译的脚本
- name : test
image : docker-image-2
script : xxxx # 做测试的脚本
实际上,在CODING CI 3.0 中,任务编排有三个层次:Pipline,Stage,Job。
一个Pinpline可以有多Stage,一个Stage可以有多个Job。
Docker 容器在三个层次都可以使用:
可以看出,系统会默认使用最顶层声明的 image,下层如果声明了新的 image,就覆盖上层的。
一个系统要想繁荣有长久的生命力,生态系统必不可少,Jenkins能够被广泛接受,大量的插件起了重要的作用。
但是Jenkins插件开发对程序员来说并不十分友好,必须要掌握Java语言,熟悉Jenkins的插件约定,找到相关扩展类,实现自己想要的业务逻辑。
但是基于容器的CI设计,开发插件一下子变得简单了,因为插件本质是容器,在容器中可以任意折腾,想用什么语言就用什么语言,完全不受限制。CODING CI 3.0同时支持直接使用Docker Hub上已有的容器插件,目前支持的生态有Drone Plugins等。
更厉害的是CODING CI 3.0还支持在Pipeline中直接执行docker 命令,甚至可以在流水线中直接使用 docker-compose 编排服务!
比如你在运行自动化测试的时候需要依赖mysql,Redis等服务,那可以直接 docker 命令启动,然后再后续 job里面使用,非常方便。
3
高性能的CI
深入了解过CI背后工作机制的同学可能有这样的体验,每次CI运行起来以后,磁盘上都会产生大量的项目文件:源代码、依赖的库(比如: node_modules)、编译生成的中间物等等。
这对于有些情况是非常不利的,例如一个项目有两个分支,对于两个流水线,其实在运行起来以后,产生的很多文件都是相同的,存在着很大的浪费。
那能不能对相同的文件进行复用呢?比如把它们缓存起来?
有难度,因为不同的流水线可能会对同一个文件进行读写操作,会出现冲突。
这就变成了经典的并发读写操作的问题,解决的方案无非是:
1. 给缓存加锁
一个流水线访问执行完了,释放锁,再让另一个流水线访问,那并行的流水线就成了串行的了。
2. 给每个流水线复制一份缓存
随着缓存数据变大,复制本身就变成了巨大的负担。
3. 保留多份缓存,超出并发数时排队
相当于建立了一个池子,先满足部分流水线的需求,其他的流水线排队。但是随着单个流水线时长增加,排队的流水线会越来越多。
CODING CI 3.0的解决办法,是使用 OverlayFS 对缓存进行 Copy-on-Write 复制,可在瞬间完成。
这里简单介绍一下OverlayFS,它是一种堆叠文件系统,并不会直接参与磁盘结构的划分,而是依赖并建立在其它的文件系统之上(例如ext4,xfs),它的目标是将原来底层文件系统中不同的目录进行“合并”,然后向用户呈现。
如下图:mergeDir 中的文件就是从 upperDir 和 lowerDir1,lowDir2合并而来。
来自upperDir中的FileA,FileB是可以修改的,来自“底层目录”的FileC和FileD是只读的。
如果想修改这些文件,OverlyFS会复制一份到upperDir,在这里修改,当然,修改过的文件就会“覆盖”底层目录的文件了。
大家可能立刻想到了,把这个特性用到持续集成上,不就解决缓存读写冲突的问题了吗?
每个流水线使用一个mergeDir,下面对应一个upperDir,最下层是只读的lowerDir,保存着缓存数据。
如果某个流水线要修改缓存数据,就把它在upperDir中复制一份,只有该流水线可见,其他的流水线看到的还是最底层的只读缓存。
腾讯云的CODING CI 3.0就是用这种瞬时复制的技术,极大地提升了多个流水线并发运行的效率。
目前越来越多公司和团队使用monorepo的方式管理代码,就是说多个项目的代码存储在同一存储库中,可以想象,这样的代码仓库高达几十个G,甚至上百G。
对于这样的代码库如果流水线都做一次 git clone,把代码从仓库下载到工作目录,所花费的时间可想而知!
利用OverlayFS技术,CODING CI 3.0针对这种大仓库的场景做了优化:
当流水线完成第一次git clone 以后,代码已经下载到了本地,后续的流水线只要发现有这个仓库的代码,就可以建立自己的mergeDir,通过OverlayFS复制一份当缓存,然后在缓存基础上进行git fetch 操作,这样流水线就可以迅速启动了。
通过这种方式,可以让代码的准备时间降低到秒级,极大地提升了流水线的性能。
4
CI 助力远程开发
疫情时期,如果出现了突发状况,而工作电脑不在身边,那程序员就悲催了,基本上是没法工作的。
因为现在的系统非常复杂,一个应用要依赖缓存、搜索、数据库、Hadoop等一大堆服务,重新搭建起来很难,代码量也越来越大,即使是把它下载到本地都是一件极为耗时的事情。
我们自然会想到:代码库就在服务器端存放着,能不能在服务器端快速地搭建一套开发环境,让程序员可以用浏览器或者VSCode连过去,做远程开发呢?
而CODING CI 3.0 已经是基于容器的设计了,可以轻松地创建容器出来,正好可以用来搭建环境。
这里是一个简单的例子:
每当创建分支时,就可以自动触发CI流水线,建立一个新的开发环境,程序员不管在哪儿,随便打开一台电脑的浏览器,就可以开始编程了。
5
总结
如今我们已经进入云原生时代,持续集成也需要拥抱变化,与时俱进。
腾讯云CODING CI 3.0 基于容器设计,实现了Pipline as Code,方便程序员开发插件,通过利用OverlayFS极大地提升了CI Pipline的性能,还创新性地帮助程序员创建远程的开发环境。这些特性帮助公司提升CI的效率,更好更快地交付有价值的软件,强烈建议大家去尝试一下。
这篇文章只是说了冰山一角,上周末举办的Techo Day腾讯技术开放日活动里对CODING CI 3.0有更深入的技术原理解析,相关资料和课件梳理整合成了一份《腾讯云云原生工具指南》,除了CODING CI以外,还涵盖了Crane、遨驰分布式云操作系统等热门产品,更有一众开发大佬推荐工具榜单,助力解放生产力,精彩多多,不容错过!
点击“阅读原文”或者长按下方二维码,即可下载相关资料。
以上是关于软件开发的关键流程即将发生巨变!的主要内容,如果未能解决你的问题,请参考以下文章
数商云SCM系统供应商全生命周期管理,助力建筑材料企业快速定位合适供应商