CN110471648A - 一种基于异步机制的分布式的ci/cd的实现方法 - Google Patents
一种基于异步机制的分布式的ci/cd的实现方法 Download PDFInfo
- Publication number
- CN110471648A CN110471648A CN201910764024.7A CN201910764024A CN110471648A CN 110471648 A CN110471648 A CN 110471648A CN 201910764024 A CN201910764024 A CN 201910764024A CN 110471648 A CN110471648 A CN 110471648A
- Authority
- CN
- China
- Prior art keywords
- building
- worker
- task
- master
- state
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 90
- 230000007246 mechanism Effects 0.000 title claims abstract description 18
- 230000008569 process Effects 0.000 claims abstract description 62
- 230000004044 response Effects 0.000 claims abstract description 10
- 238000012360 testing method Methods 0.000 claims description 41
- 238000004519 manufacturing process Methods 0.000 claims description 13
- 238000011161 development Methods 0.000 claims description 10
- 238000003860 storage Methods 0.000 claims description 10
- 230000008859 change Effects 0.000 claims description 5
- 238000012217 deletion Methods 0.000 claims description 4
- 230000037430 deletion Effects 0.000 claims description 4
- 238000013507 mapping Methods 0.000 claims description 4
- 230000002159 abnormal effect Effects 0.000 claims description 3
- 230000005856 abnormality Effects 0.000 claims description 3
- 238000012545 processing Methods 0.000 claims description 3
- 238000009877 rendering Methods 0.000 claims description 3
- 238000004088 simulation Methods 0.000 claims description 3
- 230000008676 import Effects 0.000 claims 1
- 238000004891 communication Methods 0.000 abstract description 5
- 230000006872 improvement Effects 0.000 abstract description 4
- 230000000903 blocking effect Effects 0.000 abstract description 3
- 230000002045 lasting effect Effects 0.000 abstract description 2
- 238000010586 diagram Methods 0.000 description 5
- 230000000717 retained effect Effects 0.000 description 3
- 238000009826 distribution Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000010354 integration Effects 0.000 description 2
- 230000014759 maintenance of location Effects 0.000 description 2
- 230000002688 persistence Effects 0.000 description 2
- 238000011160 research Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 230000002708 enhancing effect Effects 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 238000002955 isolation Methods 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 239000000178 monomer Substances 0.000 description 1
- 238000005498 polishing Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/38—Creation or generation of source code for implementing user interfaces
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Human Computer Interaction (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明提供了一种基于异步机制的分布式的CI/CD的实现方法,属于计算机软件分布式架构、异步通信机制、持续集成(CI)、持续部署(CD)、容器化等技术领域,本发明通过CI/CD流程可以有效降低软件开发快速迭代、频繁发布过程中的人为介入及决策,提高代码质量及产品交付效率;提供标准化环境和流程,降低改造成本、提高扩展性;分布式的部署架构和异步的通信机制,可以进一步提升CI/CD的执行效率、降低资源占用、避免进程阻塞,提高用户请求响应效率,增强系统健壮性并改善用户体验。
Description
技术领域
本发明涉及计算机软件分布式架构、异步通信机制、持续集成(CI)、持续部署(CD)、容器化等技术,尤其涉及一种基于异步机制的分布式的CI/CD的实现方法。
背景技术
随着计算机软件技术的发展及快速更新换代,CI/CD已被广泛用于快速迭代、频繁发布的软件研发过程中。许多公司或团队都将其用于自己产品的研发过程中单元测试、集成测试、部署发布等环节,其中大部分都是使用Gitlab、Jenkins等集成工具实现的单体部署架构,master和worker在同一个(服务器)节点上,集成、部署效率低下,有严重的阻塞,只能适应于单团队或少量团队的CI/CD;进一步,也有许多公司或团队对这些集成工具进行了分布式部署,可以有效提高构建效率,但是对于很多公司或团队无疑是提高了运维成本,所以很多团队开始选择将其集成、部署的过程转移到PaaS(平台及服务)平台;对于PaaS平台,很难将Gitlab、Jenkins等工具直接集成到自己的UI中并实现一系列与之关联的功能,实现规模化管理、调度并对外提供服务更是难上加难。
因此,需要需要一个分布式、异步通信的CI/CD实现方案,以规模化对外提供CI/CD服务、提高用户请求响应效率,进一步改善用户体验。
发明内容
为了解决以上技术问题,本发明提出了一种基于异步机制的分布式的CI/CD的实现方法,能够在规模化应用于PaaS平台提供CI/CD服务的同时,保证其有很好的执行效率和健壮性,进而改善用户体验。
本发明的技术方案是:
一种基于异步机制的分布式的CI/CD的实现方法,包括如下步骤:
S1:与Github、Gitlab集成,建立webhook,在代码变更时或直接触发重新构建时,master创建构建任务;
S2:master直接根据代码分支所处的阶段及服务器负载情况,选择对应的worker发送构建任务;
S3:worker接收到任务,根据代码分支选择镜像、创建容器、更新代码,进行代码编译、单元测试的持续集成操作,并直接返回任务创建状态以响应master的构建请求;
S4:持续集成依赖容器化技术,每个构建创建一个容器,并将构建过程按规则输出到日志文件中,然后对日志文件进行读取和更新,并更新构建状态及状态信息到数据库;
S5:通过定时任务,将构建的状态及状态信息返回到master并进行存储,借助即时提醒更新功能,实时、动态更新界面UI的构建状态及状态信息;
S6:构建成功后,根据代码分支所处阶段,借助容器化技术,直接在不同的环境进行部署并发布为可用服务;
进一步的,在S1之前包含:创建或选择Github、Gitlab代码仓库,并与PaaS平台项目之间创建webhook,确保在Github、Gitlab代码仓库变化时及时、自动更新PaaS平台项目分支的状态,进而自动触发构建流程;另外,在S1中,用户可以根据自身需求,手动触发构建流程;
所述构建流程,包含master选择worker、发送构建任务,worker选择镜像、创建容器、更新代码、单元测试的流程。
进一步的,触发构建流程后,master根据任务类型创建构建任务,与其他的待构建或构建中的任务形成任务队列,构建过程中会根据任务的编号(job_id)进行异步回调,更新任务的状态,直至构建结束后删除构建任务;
所述任务类型,是指对代码分支对应的容器的不同操作,包含:新建、更新、数据导入、数据回滚、停止、删除;
所述任务状态,包含:新建、构建中、异常三种状态,任务出现异常状态时,任务异常信息亦会同时更新。
进一步的,master根据分支所处阶段、负载情况等计算、选择合适的worker进行任务分流,并向选定的worker发送构建任务请求:
master根据所选worker的不同url地址,对发送请求进行抽象化处理,发送到对应的worker,由对应worker的统一接口进行接收,并根据不同的任务类型进行不同的操作;
worker接收到任务后,会根据PaaS平台项目选择对应的镜像开始构建,并将任务创建结果立即返回响应给master,结束master的请求,此时master开始更新构建状态;
进一步的,worker上开始构建,拉取镜像、创建数据库及数据库用户,创建容器时根据构建信息更新环境配置,并将更新后的代码映射到容器中,容器与其对应的数据库之间建立连接,编译、运行代码,并根据不同的任务类型生成对应的日志文件,将构建过程中产生的日志输出到日志文件中;
所述构建,是指:代码更新之后对其进行编译,并进行单元测试;对于用户的线上环境,平台会自动忽略单元测试,只对测试环境和开发环境进行单元测试,且单元测试的覆盖程度与容器内代码有关;
所述日志文件会在根据每个容器构建信息生成的文件目录中统一进行管理,及每个容器都会有一个单独的文件存放日志文件,构建过程中,用户可以直接在master web UI中根据需要查看全部的日志并根据条件过滤日志.
进一步的,worker服务会通过线程机制,对每个容器的日志进行读取、解析,并将构建状态及状态信息更新到worker服务对应的数据库中,直到构建结束或构建时间超时,停止更新状态及状态信息;
对于全部构建,会存储在一张数据库表(build)中,在构建过程中,更新build表中的状态及状态信息,还会在另外一张数据库表(build_sync)中创建一行数据,关联新建的build,代表此build处于正在构建过程中;
worker服务中实现了一个定时任务,定时触发获取当前数据库全部正在构建中的容器,查看容器的状态及状态信息,并向master发送请求,更新将全部正在构建的容器状态及状态信息;
进一步地,master接收到worker的更新状态的请求时,按顺序对对应的构建的状态和状态信息进行更新,并返回给worker更新的结果,当worker收到响应之后会对已经更新成功的build_sync中的数据进行删除,直至构建结束;
所述直至构建结束,并非worker中定时任务结束,worker提供服务过程中,定时任务会一直运行,构建结束是指当容器构建完成后,将不再更新build表中对应数据的状态及状态信息,也不再在build_sync表中创建新数据,即为构建结束。
进一步的,每次master在响应worker更新状态及状态信息的请求之后,会通过即时提醒更新功能,对web UI中的状态及状态信息不断的更新,直到构建结束时状态不再变更;构建结束后会在web UI中展示构建结果;
所述即时提醒更新功能,是指基于某一个模型及该模型中的唯一标识(id),更新所需在web UI中展示的字段的值并渲染更新后的值;
所述构建结果,包含:构建成功、构建失败,是指单元测试过程中产生的测试结果,是否为测试通过;对于warning级别的错误,亦视为成功,但会在web UI中显示:Testwarning;对于error或exception级别的错误,则视为构建失败,在web UI中会显示对应的错误信息。
进一步的,构建成功后,会立即停止并删除构建过程所用容器,根据代码及相关配置构建新的容器镜像,并将镜像保存、发布到镜像仓库;镜像发布后,立即拉取新镜像并部署;
平台会对部署后的容器及数据库进行管理,对于production阶段仅保留最新的容器及唯一一个数据库,对于development、staging阶段最多保留最近四次成功部署的容器及其对应的数据库。
进一步的,本发明采用分布式部署架构,包括:
一台master服务器、一台以上的worker服务器,
worker服务器分为development、staging、production三类,分别为对应分支阶段提供服务,其中,staging阶段依赖于production,复制线上数据模拟测试环境,提供UAT测试服务;
在有新的构建任务时,master会根据PaaS平台项目中触发构建的分支所处的阶段,选择符合分支阶段的worker,并根据服务器的负载情况,选择负载最小的一台worker,发送构建任务请求;
所述负载最小,首先,是指每个worker有最大的容器同时构建数限制:为保证worker服务器上已部署成功的容器正常提供服务的能力,当每个符合分支阶段的worker正在构建中的数量皆达到对其设置的最大值时,会产生任务等待,master上的同样通过任务队列对等待的任务进行管理,当符合条件的worker出现空闲时,重新发送构建任务请求;其次,当有一台以上符合条件的worker出现空闲时,会根据worker的硬件指标,选择空闲率高的服务器进行分配;
所述worker空闲,是指一台worker当前处于正在构建中的任务的数量小于该worker的最大的容器构建数。
进一步的,本发明基于异步机制进行通信,包括:
master创建构建任务后,请求worker执行构建任务,无需等到构建结束即可获得相应:worker收到请求后,同样会执行任务创建,会立即返回任务创建的结果给master,master CI界面开始动态展示构建状态及状态信息;
worker上构建开始,会将构建过程中产生的日志进行读取并解析,获取构建状态及状态信息,并不断的回调worker中的方法地址,将数据更新到数据库表中进行存储;
worker上有一个定时任务,定期检查数据库表,获取正在构建中的任务的状态及状态信息,并发送给master,master接到请求后会将数据存储到数据库表中,并更新job的状态,master通过即时提醒更新功能对web UI状态、状态信息数值进行渲染更新。
本发明的有益效果是:
本发明可以解决当前软件开发快速迭代、频繁发布而面临的难以立即自动集成、测试验证、快速部署的问题,最大化减少人为介入和决策,使研发人员专注于产品打磨,提高代码质量及交付效率,节约人力成本在机器可以做的很好的情况下的浪费。同时环境标准化,可以避免硬编码的脚本带来后续升级改造成本或者绑架技术栈;流程标准化有助于扩展性提升,连接研发流程的设施可以相对轻松的进行升级维护。另外,通过分布式的CI/CD部署架构,可以有效降低模块间耦合度,方便其扩展、部署;划分清晰每台服务器的责任,master根据不同的阶段及负载情况选择不同worker,减少每台服务器的负载、提高CI/CD的效率,并提高实现代码的复用性。进一步,通过异步通信机制,减少每次请求通信时长和资源占用、避免阻塞,立即返回初步结果,提高响应效率并可以动态的展示当前CI/CD任务的状态,增强系统健壮性、改善用户体验。同时,可以解决Gitlab、Jenkins等不能规模化为PaaS平台用户提供对外服务的问题。
附图说明
图1是分布式部署架构示意图;
图2是CI/CD异步实现示意图;
图3是master根据阶段及负载情况选择worker并发送任务示意图;
图4是worker构建流程示意图;
图5是master构建状态更新示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明是通过如下技术方案实现的:
第一方面,本发明提供了一种CI/CD的实现方法,包括:
S1:与Github、Gitlab等集成,建立webhook,在代码变更时(push、merge等)或直接触发重新构建时,master创建构建任务
S2:master直接根据代码分支所处的阶段(development、staging或production)及服务器负载情况,选择对应的worker发送构建任务;
S3:worker接收到任务,根据代码分支选择镜像、创建容器、更新代码,进行代码编译、单元测试等持续集成操作,并直接返回任务创建状态以响应master的构建请求;
S4:持续集成依赖容器化技术,每个构建创建一个容器,并将构建过程按规则输出到日志文件中,然后对日志文件进行读取和更新,并更新构建状态及状态信息到数据库;
S5:通过定时任务,将构建的状态及状态信息返回到master并进行存储,借助即时提醒更新功能,实时、动态更新界面UI的构建状态及状态信息;
S6:构建成功后,根据代码分支所处阶段,借助容器化技术,直接在不同的环境进行部署并发布为可用服务;
进一步地,在S1之前包含:创建或选择Github、Gitlab等代码仓库,并与PaaS平台项目之间创建webhook,确保在Github、Gitlab等代码仓库变化(代码提交、分支合并、分支创建等)时可以及时、自动更新PaaS平台项目分支的状态,进而自动触发构建等流程,同时,在平台上对项目分支、代码的改动也会直接影响远程Github、Gitlab等仓库;另外,在S1中,用户也可以根据自身需求,手动触发构建流程;
所述构建流程,是一个广义上的构建流程,包含但不限于master选择worker、发送构建任务,worker选择镜像、创建容器、更新代码、单元测试等一系列流程;
进一步地,触发构建流程后,master根据任务类型创建构建任务,与其他的待构建或构建中的任务形成任务队列,构建过程中会根据任务的编号(job_id)进行异步回调,更新任务的状态,直至构建结束后删除构建任务;
所述任务类型,是指对代码分支对应的容器的不同操作,包含:新建、更新、数据导入、数据回滚、停止、删除等;
所述任务状态,包含:新建(待构建)、构建中、异常三种状态,任务出现异常状态时,任务异常信息亦会同时更新;
进一步地,master根据分支所处阶段、负载情况等计算、选择合适的worker进行任务分流,并向选定的worker发送构建任务请求:master根据所选worker的不同url地址,对发送请求进行抽象化处理,发送到对应的worker,由对应worker的统一接口进行接收,并根据不同的任务类型进行不同的操作;
进一步地,worker接收到任务后,会根据PaaS平台项目的类型、版本等选择对应的镜像开始构建,并将任务创建结果立即返回响应给master,结束master的请求,此时master开始更新构建状态;
进一步地,worker上开始构建,拉取镜像、创建数据库及数据库用户,创建容器时根据构建信息更新环境配置,并将更新后的代码映射到容器中,容器与其对应的数据库之间建立连接,编译、运行代码,并根据不同的任务类型生成对应的日志文件,将构建过程中产生的日志输出到日志文件中;
所述构建,是指:代码更新之后对其进行编译,并进行单元测试;为了避免脏数据的插入,对于用户的线上环境,平台会自动忽略单元测试,只对测试环境和开发环境进行单元测试,且单元测试的覆盖程度与容器内代码有关;
所述日志文件会在根据每个容器构建信息生成的文件目录中统一进行管理,及每个容器都会有一个单独的文件存放日志文件,构建过程中,用户可以直接在master web UI中根据需要查看全部的日志并根据条件过滤日志;
进一步地,不同项目、不同分支对应的不同容器能同时构建或运行是因为:对于worker服务,对应了多个线程,分别对构建日志进行读取、解析;对于worker服务器,每个容器都是一个单独的进程,且容器内进程隔离、透明;
进一步地,worker服务会通过线程机制,对每个容器的日志进行读取、解析,并将构建状态及状态信息更新到worker服务对应的数据库中,直到构建结束(成功或失败)或构建时间超时,停止更新状态及状态信息;
进一步地,对于全部构建,会存储在一张数据库表(build)中,在构建过程中,更新build表中的状态及状态信息,还会在另外一张数据库表(build_sync)中创建一行数据,关联新建的build,代表此build处于正在构建过程中;
进一步地,worker服务中实现了一个定时任务,定时触发获取当前数据库全部正在构建中的容器,查看容器的状态及状态信息,并向master发送请求,更新将全部正在构建的容器状态及状态信息;
进一步地,master接收到worker的更新状态的请求时,按顺序对对应的构建的状态和状态信息进行更新,并返回给worker更新的结果,当worker收到响应之后会对已经更新成功的build_sync中的数据进行删除,直至构建结束;
所述直至构建结束,并非worker中定时任务结束,worker提供服务过程中,定时任务会一直运行,构建结束是指当容器构建完成后,将不再更新build表中对应数据的状态及状态信息,也不再在build_sync表中创建新数据,即为构建结束;
进一步地,每次master在响应worker更新状态及状态信息的请求之后,会通过即时提醒更新功能,对web UI中的状态及状态信息不断的更新,直到构建结束时状态不再变更;构建结束后会在web UI中展示构建结果;
所述即时提醒更新功能,是指基于某一个模型(数据库表)及该模型中的唯一标识(id),更新所需在web UI中展示的字段的值并渲染更新后的值;
所述构建结果,包含:构建成功、构建失败,是指单元测试过程中产生的测试结果,是否为测试通过;对于warning级别的错误,亦视为成功,但会在web UI中显示:Testwarning;对于error或exception级别的错误,则视为构建失败,在web UI中会显示对应的错误信息;
进一步,构建成功后,会立即停止并删除构建过程所用容器,根据代码及相关配置构建新的容器镜像,并将镜像保存、发布到镜像仓库;镜像发布后,立即拉取新镜像并部署;
所述删除构建过程所用容器,是因为系统已根据配置将需要保留的文件目录进行了持久化,并且不会删除数据库,且一个数据库只会对应一个容器服务,另外,对于production阶段,只会更新容器,数据库及持久化的数据不会因为更新丢失;
所述部署,并非只部署production阶段,development、staging阶段也会进行部署,这些容器会在不同服务器上、自动生成不同域名、提供不同服务,域名生成与项目名、分支名、构建顺序等信息相关,用户也可以根据需求设置自己的域名,其中,对于production阶段的容器服务不会根据构建(更新)而改变域名的映射;
进一步,平台会对部署后的容器及数据库进行管理,对于production阶段仅保留最新的容器及唯一一个数据库,对于development、staging阶段最多可以保留最近四次成功部署的容器及其对应的数据库;
第二方面,本发明是采用分布式部署架构,包括:
一台master服务器、多台worker服务器,worker服务器分为development、staging、production三类,分别为对应分支阶段提供服务,其中,staging阶段依赖于production,复制线上数据模拟测试环境,提供UAT测试服务;
进一步地,在有新的构建任务时,master会根据PaaS平台项目中触发构建的分支所处的阶段,选择符合分支阶段的worker,并根据服务器的负载情况,选择负载最小的一台worker,发送构建任务请求;
所述负载最小,首先,是指每个worker有最大的容器同时构建数限制:为保证worker服务器上已部署成功的容器正常提供服务的能力,当每个符合分支阶段的worker正在构建中的数量皆达到对其设置的最大值时,会产生任务等待,master上的同样通过任务队列对等待(即待构建)的任务进行管理,当符合条件的worker出现空闲时,重新发送构建任务请求;其次,当有多台符合条件的worker出现空闲时,会根据worker的CPU、RAM等硬件指标,选择空闲率高的服务器进行分配;
所述worker空闲,是指一台worker当前处于正在构建中的任务的数量小于该worker的最大的容器构建数;
第三方面,本发明基于异步机制进行通信,包括:
master创建构建任务后,请求worker执行构建任务,无需等到构建结束即可获得相应:worker收到请求后,同样会执行任务创建,会立即返回任务创建的结果给master,master CI界面开始动态展示构建状态及状态信息;
进一步,worker上构建开始,会将构建过程中产生的日志进行读取并解析,获取构建状态及状态信息,并不断的回调worker中的方法地址,将数据更新到数据库表(build、build_sync)中进行存储;
进一步,worker上有一个定时任务,定期检查build_sync,获取正在构建中的任务的状态及状态信息,并发送给master,master接到请求后会将数据(包含构建状态、状态信息等)存储到数据库表(build)中,并更新job的状态,master通过即时提醒更新功能对webUI状态、状态信息等数值进行渲染更新。
本发明实现了一种CI/CD的方法,可以规模化应用到PaaS平台中,其次,通过分布式的部署架构对其性能进行了改善,保证了系统的健壮性,提高了CI/CD的效率,并且,通过异步的通信机制,动态刷新CI/CD的状态及状态信息,进一步提高了CI/CD效率,具有更好地用户体验效果。
本发明通过CI/CD流程可以有效降低软件开发快速迭代、频繁发布过程中的人为介入及决策,提高代码质量及产品交付效率;提供标准化环境和流程,降低改造成本、提高扩展性,进一步有效节约人力、服务器及其运维成本;分布式的部署架构和异步的通信机制,可以进一步提升CI/CD的执行效率、降低资源占用、避免进程阻塞,提高用户请求响应效率,增强系统健壮性并改善用户体验。
以上所述仅为本发明的较佳实施例,仅用于说明本发明的技术方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所做的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
Claims (10)
1.一种基于异步机制的分布式的CI/CD的实现方法,其特征在于,
包括如下步骤:
S1:与Github、Gitlab集成,建立webhook,在代码变更时或直接触发重新构建时,master创建构建任务;
S2:master直接根据代码分支所处的阶段及服务器负载情况,选择对应的worker发送构建任务;
S3:worker接收到任务,根据代码分支选择镜像、创建容器、更新代码,进行代码编译、单元测试的持续集成操作,并直接返回任务创建状态以响应master的构建请求;
S4:持续集成依赖容器化技术,每个构建创建一个容器,并将构建过程按规则输出到日志文件中,然后对日志文件进行读取和更新,并更新构建状态及状态信息到数据库;
S5:通过定时任务,将构建的状态及状态信息返回到master并进行存储,借助即时提醒更新功能,实时、动态更新界面UI的构建状态及状态信息;
S6:构建成功后,根据代码分支所处阶段,借助容器化技术,直接在不同的环境进行部署并发布为可用服务。
2.根据权利要求1所述的方法,其特征在于,
在S1之前包含:创建或选择Github、Gitlab代码仓库,并与PaaS平台项目之间创建webhook,确保在Github、Gitlab代码仓库变化时及时、自动更新PaaS平台项目分支的状态,进而自动触发构建流程;另外,在S1中,用户可以根据自身需求,手动触发构建流程;
所述构建流程,包含master选择worker、发送构建任务,worker选择镜像、创建容器、更新代码、单元测试的流程。
3.根据权利要求2所述的方法,其特征在于,
触发构建流程后,master根据任务类型创建构建任务,与其他的待构建或构建中的任务形成任务队列,构建过程中会根据任务的编号(job_id)进行异步回调,更新任务的状态,直至构建结束后删除构建任务;
所述任务类型,是指对代码分支对应的容器的不同操作,包含:新建、更新、数据导入、数据回滚、停止、删除;
所述任务状态,包含:新建、构建中、异常三种状态,任务出现异常状态时,任务异常信息亦会同时更新。
4.根据权利要求1所述的方法,其特征在于,
master根据分支所处阶段、负载情况等计算、选择合适的worker进行任务分流,并向选定的worker发送构建任务请求:
master根据所选worker的不同url地址,对发送请求进行抽象化处理,发送到对应的worker,由对应worker的统一接口进行接收,并根据不同的任务类型进行不同的操作;
worker接收到任务后,会根据PaaS平台项目选择对应的镜像开始构建,并将任务创建结果立即返回响应给master,结束master的请求,此时master开始更新构建状态。
5.根据权利要求4所述的方法,其特征在于,
worker上开始构建,拉取镜像、创建数据库及数据库用户,创建容器时根据构建信息更新环境配置,并将更新后的代码映射到容器中,容器与其对应的数据库之间建立连接,编译、运行代码,并根据不同的任务类型生成对应的日志文件,将构建过程中产生的日志输出到日志文件中;
所述构建,是指:代码更新之后对其进行编译,并进行单元测试;对于用户的线上环境,平台会自动忽略单元测试,只对测试环境和开发环境进行单元测试,且单元测试的覆盖程度与容器内代码有关;
所述日志文件会在根据每个容器构建信息生成的文件目录中统一进行管理,及每个容器都会有一个单独的文件存放日志文件,构建过程中,用户可以直接在master web UI中根据需要查看全部的日志并根据条件过滤日志。
6.根据权利要求5所述的方法,其特征在于,
worker服务会通过线程机制,对每个容器的日志进行读取、解析,并将构建状态及状态信息更新到worker服务对应的数据库中,直到构建结束或构建时间超时,停止更新状态及状态信息;
对于全部构建,会存储在一张数据库表(build)中,在构建过程中,更新build表中的状态及状态信息,还会在另外一张数据库表(build_sync)中创建一行数据,关联新建的build,代表此build处于正在构建过程中;
worker服务中实现了一个定时任务,定时触发获取当前数据库全部正在构建中的容器,查看容器的状态及状态信息,并向master发送请求,更新将全部正在构建的容器状态及状态信息;
进一步地,master接收到worker的更新状态的请求时,按顺序对对应的构建的状态和状态信息进行更新,并返回给worker更新的结果,当worker收到响应之后会对已经更新成功的build_sync中的数据进行删除,直至构建结束;
所述直至构建结束,并非worker中定时任务结束,worker提供服务过程中,定时任务会一直运行,构建结束是指当容器构建完成后,将不再更新build表中对应数据的状态及状态信息,也不再在build_sync表中创建新数据,即为构建结束。
7.根据权利要求6所述的方法,其特征在于,
每次master在响应worker更新状态及状态信息的请求之后,会通过即时提醒更新功能,对web UI中的状态及状态信息不断的更新,直到构建结束时状态不再变更;构建结束后会在web UI中展示构建结果;
所述即时提醒更新功能,是指基于某一个模型及该模型中的唯一标识(id),更新所需在web UI中展示的字段的值并渲染更新后的值;
所述构建结果,包含:构建成功、构建失败,是指单元测试过程中产生的测试结果,是否为测试通过;对于warning级别的错误,亦视为成功,但会在web UI中显示:Test warning;对于error或exception级别的错误,则视为构建失败,在web UI中会显示对应的错误信息。
8.根据权利要求7所述的方法,其特征在于,
构建成功后,会立即停止并删除构建过程所用容器,根据代码及相关配置构建新的容器镜像,并将镜像保存、发布到镜像仓库;镜像发布后,立即拉取新镜像并部署;
平台会对部署后的容器及数据库进行管理,对于production阶段仅保留最新的容器及唯一一个数据库,对于development、staging阶段最多保留最近四次成功部署的容器及其对应的数据库。
9.根据权利要求1所述的方法,其特征在于,其特征在于,
采用分布式部署架构,包括:
一台master服务器、一台以上的worker服务器,
worker服务器分为development、staging、production三类,分别为对应分支阶段提供服务,其中,staging阶段依赖于production,复制线上数据模拟测试环境,提供UAT测试服务;
在有新的构建任务时,master会根据PaaS平台项目中触发构建的分支所处的阶段,选择符合分支阶段的worker,并根据服务器的负载情况,选择负载最小的一台worker,发送构建任务请求;
所述负载最小,首先,是指每个worker有最大的容器同时构建数限制:为保证worker服务器上已部署成功的容器正常提供服务的能力,当每个符合分支阶段的worker正在构建中的数量皆达到对其设置的最大值时,会产生任务等待,master上的同样通过任务队列对等待的任务进行管理,当符合条件的worker出现空闲时,重新发送构建任务请求;其次,当有一台以上符合条件的worker出现空闲时,会根据worker的硬件指标,选择空闲率高的服务器进行分配;
所述worker空闲,是指一台worker当前处于正在构建中的任务的数量小于该worker的最大的容器构建数。
10.根据权利要求9所述的方法,其特征在于,
基于异步机制进行通信,包括:
master创建构建任务后,请求worker执行构建任务,无需等到构建结束即可获得相应:worker收到请求后,同样会执行任务创建,会立即返回任务创建的结果给master,masterCI界面开始动态展示构建状态及状态信息;
worker上构建开始,会将构建过程中产生的日志进行读取并解析,获取构建状态及状态信息,并不断的回调worker中的方法地址,将数据更新到数据库表中进行存储;
worker上有一个定时任务,定期检查数据库表,获取正在构建中的任务的状态及状态信息,并发送给master,master接到请求后会将数据存储到数据库表中,并更新job的状态,master通过即时提醒更新功能对web UI状态、状态信息数值进行渲染更新。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910764024.7A CN110471648A (zh) | 2019-08-19 | 2019-08-19 | 一种基于异步机制的分布式的ci/cd的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910764024.7A CN110471648A (zh) | 2019-08-19 | 2019-08-19 | 一种基于异步机制的分布式的ci/cd的实现方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110471648A true CN110471648A (zh) | 2019-11-19 |
Family
ID=68511139
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910764024.7A Pending CN110471648A (zh) | 2019-08-19 | 2019-08-19 | 一种基于异步机制的分布式的ci/cd的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110471648A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111142879A (zh) * | 2019-12-05 | 2020-05-12 | 深圳融卡智能科技有限公司 | 软件集成发布方法及自动运维平台 |
CN111447252A (zh) * | 2020-02-19 | 2020-07-24 | 深圳点猫科技有限公司 | 一种基于websocket实现交互式输入的方法及系统 |
CN111459535A (zh) * | 2020-03-19 | 2020-07-28 | 深圳木成林科技有限公司 | 一种分支合并的方法、装置、设备及计算机存储介质 |
CN111538525A (zh) * | 2020-03-20 | 2020-08-14 | 成都药王科技股份有限公司 | 一种用于程序发布的快速迭代与回滚方法 |
CN111651196A (zh) * | 2020-06-24 | 2020-09-11 | 腾讯科技(深圳)有限公司 | 文档发布方法、装置及服务器 |
CN112068934A (zh) * | 2020-09-08 | 2020-12-11 | 广州汇智通信技术有限公司 | 一种容器云服务实例收缩的控制系统和方法 |
CN115905272A (zh) * | 2023-01-09 | 2023-04-04 | 深圳市明源云采购科技有限公司 | 索引自动更新方法、索引自动更新装置、设备及介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106649044A (zh) * | 2016-12-28 | 2017-05-10 | 深圳市深信服电子科技有限公司 | 一种基于容器云系统的日志处理方法、装置及其系统 |
JP2018502391A (ja) * | 2014-12-22 | 2018-01-25 | イートン インダストリーズ (ネザーランズ) ベスローテン フェノーツハップEaton Industries (Netherlands) B.V. | ユーザインタフェースを表示するためのコンピュータ実装方法 |
CN108196915A (zh) * | 2018-02-06 | 2018-06-22 | 杭州朗和科技有限公司 | 基于应用容器引擎的代码处理方法、设备及存储介质 |
CN109408069A (zh) * | 2018-07-19 | 2019-03-01 | 中国矿业大学 | 一种面向云件PaaS平台的云件镜像制作方法与系统 |
CN109814879A (zh) * | 2019-01-16 | 2019-05-28 | 福建省天奕网络科技有限公司 | 自动化ci/cd项目部署方法、存储介质 |
-
2019
- 2019-08-19 CN CN201910764024.7A patent/CN110471648A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2018502391A (ja) * | 2014-12-22 | 2018-01-25 | イートン インダストリーズ (ネザーランズ) ベスローテン フェノーツハップEaton Industries (Netherlands) B.V. | ユーザインタフェースを表示するためのコンピュータ実装方法 |
CN106649044A (zh) * | 2016-12-28 | 2017-05-10 | 深圳市深信服电子科技有限公司 | 一种基于容器云系统的日志处理方法、装置及其系统 |
CN108196915A (zh) * | 2018-02-06 | 2018-06-22 | 杭州朗和科技有限公司 | 基于应用容器引擎的代码处理方法、设备及存储介质 |
CN109408069A (zh) * | 2018-07-19 | 2019-03-01 | 中国矿业大学 | 一种面向云件PaaS平台的云件镜像制作方法与系统 |
CN109814879A (zh) * | 2019-01-16 | 2019-05-28 | 福建省天奕网络科技有限公司 | 自动化ci/cd项目部署方法、存储介质 |
Non-Patent Citations (6)
Title |
---|
CARROT: "k8s一SegmentFault思否", 《HTTPS://SEGMENTFAULT.COM/A/1190000017408454》 * |
不灭的焱: "PHP Web环境:development (dev),testing (test),staging (pre),production", 《HTTPS://PHP-NOTE.COM/ARTICLE/653.HTML》 * |
时速云: "干货分享 | PaaS云平台在企业落地的 8 大关键点", 《HTTPS://WWW.KUBERNETES.ORG.CN/4071.HTML》 * |
李佐军: "《大数据的架构技术与应用实践的探究》", 30 April 2019 * |
汪有刚等: "《互联网+精益管理理论研究与实践》", 31 May 2017 * |
让编程成为一种习惯: "什么是staging server", 《HTTPS://WWW.CNBLOGS.COM/BEAUTIFUL-CODE/P/6265277.HTML》 * |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111142879A (zh) * | 2019-12-05 | 2020-05-12 | 深圳融卡智能科技有限公司 | 软件集成发布方法及自动运维平台 |
CN111142879B (zh) * | 2019-12-05 | 2023-12-26 | 无锡融卡科技有限公司 | 软件集成发布方法及自动运维平台 |
CN111447252A (zh) * | 2020-02-19 | 2020-07-24 | 深圳点猫科技有限公司 | 一种基于websocket实现交互式输入的方法及系统 |
CN111447252B (zh) * | 2020-02-19 | 2023-09-26 | 深圳点猫科技有限公司 | 一种基于websocket实现交互式输入的方法及系统 |
CN111459535A (zh) * | 2020-03-19 | 2020-07-28 | 深圳木成林科技有限公司 | 一种分支合并的方法、装置、设备及计算机存储介质 |
CN111538525A (zh) * | 2020-03-20 | 2020-08-14 | 成都药王科技股份有限公司 | 一种用于程序发布的快速迭代与回滚方法 |
CN111538525B (zh) * | 2020-03-20 | 2022-09-02 | 成都药王科技股份有限公司 | 一种用于程序发布的快速迭代与回滚方法 |
CN111651196A (zh) * | 2020-06-24 | 2020-09-11 | 腾讯科技(深圳)有限公司 | 文档发布方法、装置及服务器 |
CN112068934A (zh) * | 2020-09-08 | 2020-12-11 | 广州汇智通信技术有限公司 | 一种容器云服务实例收缩的控制系统和方法 |
CN112068934B (zh) * | 2020-09-08 | 2023-02-10 | 广州汇智通信技术有限公司 | 一种容器云服务实例收缩的控制系统和方法 |
CN115905272A (zh) * | 2023-01-09 | 2023-04-04 | 深圳市明源云采购科技有限公司 | 索引自动更新方法、索引自动更新装置、设备及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110471648A (zh) | 一种基于异步机制的分布式的ci/cd的实现方法 | |
CN103229143B (zh) | 具有可扩展和可定制的计算引擎的面向网络服务的架构内的服务提供者 | |
CN103051710B (zh) | 一种虚拟云平台管理系统 | |
CN110989983A (zh) | 一种零编码的应用软件快速构建系统 | |
CN110321152A (zh) | 一种软件开发平台 | |
CN111381983B (zh) | 虚拟试验靶场验证系统的轻量级消息中间件系统及方法 | |
US20120185877A1 (en) | Systems and/or methods for end-to-end business process management, business event management, and/or business activity monitoring | |
CN101101550B (zh) | 将新用户界面映射到已有的整合界面的方法和系统 | |
CN108762900A (zh) | 高频任务调度方法、系统、计算机设备和存储介质 | |
CN105378696A (zh) | 跨各设备提供未看见消息计数 | |
US20080250392A1 (en) | Content management system for computer software with dynamic traceability between code and design documents | |
CN101277212B (zh) | 资源管理平台及资源管理方法 | |
CN112417051A (zh) | 容器编排引擎资源管理方法及装置、可读介质及电子设备 | |
CN113778500A (zh) | 一种基于DevOps的软件开发生命周期管理平台 | |
CN109978392B (zh) | 敏捷软件开发管理方法、装置、电子设备、存储介质 | |
CN101867490A (zh) | 运维操作系统和方法 | |
US20070168975A1 (en) | Debugger and test tool | |
CN112256406B (zh) | 作业流程平台化调度方法 | |
CN111694612A (zh) | 配置检查方法、装置、计算机系统及存储介质 | |
US8856155B2 (en) | Management of configuration data structures in multi-layer data models | |
CN109902919A (zh) | 服务器资产管理方法、装置、设备及可读存储介质 | |
CN110310100A (zh) | 项目管理方法、装置、电子设备及存储介质 | |
CN105404530B (zh) | 一种实现简易部署和使用私有云的系统及方法 | |
CN108446326A (zh) | 一种基于容器的异构数据管理方法及系统 | |
US10185307B2 (en) | Method of and system for controlling manufacturing processes in discrete production lines |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20191119 |
|
RJ01 | Rejection of invention patent application after publication |