咨询热线

0371-86158370

软件开发的关键流程是什么?

如果您正在寻找相关产品或有其他疑问,可随时拨打服务热线,或点击下方按钮与我们在线交流!

2022-11-28 11:21:33 发布者:超级管理员

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


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


图片


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


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


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


图片


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 容器,这是什么意思呢?举个简单的例子就明白了。


假设你的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流水线,建立一个新的开发环境,程序员不管在哪儿,随便打开一台电脑的浏览器,就可以开始编程了。


图片


如今我们已经进入云原生时代,持续集成也需要拥抱变化,与时俱进。


相关产品
更多推荐
科技·质量·服务·创新

科技·质量·服务·创新

提交需求

如果您对我们的产品感兴趣,或者我们有什么可以帮助到您的,您可以随时在线与我们沟通。 当然您也可以在下面给我们留言,我们将热忱为您服务!

快速响应给予技术咨询答复

专业优质软件服务

成熟领先产品解决方案

专业可靠合作伙伴

免费咨询 0371-86158370
免费获取报价

获取报价

销售热线销售热线:0371-86158370

返回顶部

首页 在线咨询在线咨询 一键拨打一键拨打