当前位置:首页 > 发现 > 其他 > 软件开发的关键流程即将发生巨变!

软件开发的关键流程即将发生巨变!

9个月前 (08-08)其他144


持续集成(CI)是指开发人员会定期将代码变更合并到一个中央存储库中,之后系统会自动运行构建和测试操作,通过频繁地集成,达到控制代码质量的目的。

经过几十年的发展,持续集成已经成为软件开发的标准配置,为开发人员所熟知,如今,不使用持续集成的软件公司是不可思议的。

在持续集成的工具链中,Jenkins 起步较早,积累深厚,凭借良好的生态,丰富的插件,被广泛使用。

但是进入云原生时代以后,应用程序的部署和基础设施都发生了重大的变化,Jenkins并没有跟上脚步,反而暴露出了一些问题,例如流水线编排引擎不够稳定,并发性能差,开发插件很麻烦等等。

那么在云原生时代,持续集成应该是什么样子呢?

上周末我参加了 TechoDay 腾讯技术开放日第二期活动,这一期主题是 云原生全栈开发与实践,其中有一场正好是云原生时代的持续集成,讲了腾讯云CODING CI 3.0 ,看完以后感觉到:这也许就是未来的发展方向吧,今天给大家分享一下。

1Pipline 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 操作,这样流水线就可以迅速启动了。

通过这种方式,可以让代码的准备时间降低到秒级,极大地提升了流水线的性能。

4CI 助力远程开发

疫情时期,如果出现了突发状况,而工作电脑不在身边,那程序员就悲催了,基本上是没法工作的。

因为现在的系统非常复杂,一个应用要依赖缓存、搜索、数据库、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、遨驰分布式云操作系统等热门产品,更有一众开发大佬推荐工具榜单,助力解放生产力,精彩多多,不容错过!


相关文章

盘点十款塑造软件开发的革命性IDE

盘点十款塑造软件开发的革命性IDE

回顾往昔,代码不过是白色屏幕上的黑色字母。编写代码需要高度集中精神。拼写错误往往无法立即凸显出来,语法错误需要等到编译时才能察觉。而如今编写代码的体验已然完全不同。图:Asymetrix ToolBo...

未来网站开发必备:14个让你惊艳的JavaScript Web API!

未来网站开发必备:14个让你惊艳的JavaScript Web API!

作者 | 前端小智 来源 | 大迁世界 文章首先介绍了JavaScript Web API的概念,解释了它们是如何扩展网站功能并提供丰富用户体验...

新手小白打算建个网站,该如何入手?

新手小白打算建个网站,该如何入手?

浏览了一下答案,感觉都没有对小白友好的答案,我来整理一下吧。 首先想要建立自己的网站,就需要一个可以连通外网的服务器。...

怎样建立一个网站?

怎样建立一个网站?

对于建站小白来说,如何创建网站肯定是有一定的难度的,但是看完下面的介绍以后,就会有了一些比较详细的了解。 接下来就把我的个人经验分享给大家:...

2021年最流行的网站开发技术

2021年最流行的网站开发技术

打开凤凰新闻,查看更...

考网站开发证是干嘛的 网站开发证如何考取

考网站开发证是干嘛的 网站开发证如何考取

原标题:考网站开发证是干嘛的 网站开发证如何考取 网站开发是制作一些专业性强的网站,比如说动态网页、ASP、PHP、JSP网页。而且网站开发一般是原创,网站制作可以用别人的模板。下...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。