掌桥专利:专业的专利平台
掌桥专利
首页

Jenkins高可用的系统及方法

文献发布时间:2023-06-19 10:24:22


Jenkins高可用的系统及方法

技术领域

本申请涉及软件开发技术领域,具体而言,涉及一种Jenkins高可用的系统及方法。

背景技术

随着互联网技术的发展,DevOps(Development和Operations的组合词,是一组过程、方法与系统的统称)的普及,越来越多的公司将CI/CD(软件的持续集成、持续交付和持续部署)引入公司的研发流程,而Jenkins(一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作)也成为了众多公司的首选,Jenkins的稳定性直接影响了CI/CD平台的构建交付效率。

Jenkins的存储模型是使用本地文件系统作为存储的,所有的任务数据配置都存储在JENKINS_HOME对应的文件目录下,即Jenkins master是有状态的,它依赖于本地文件。因此,目前Jenkins的高可用方案是基于Kubernetes(一个自动化部署,缩放,以及容器化管理应用程序的开源系统)和nfs(网络文件系统)的。具体为,在Kubernetes上部署一套Jenkins系统,并将nfs服务挂为JENKINS_HOME目录,以此来达到在Jenkins进行漂移时,数据文件不丢失,Jenkins高可用的目的。

本发明人在使用上述Jenkins的高可用方案时发现存在以下缺陷:

1)作为文件存储,nfs本身又是单点的,存在着nfs单点故障/数据丢失后,Jenkins完全不可用的问题;

2)由于使用nfs即网络文件系统作为文件存储,而在Jenkins任务执行过程中又存在着相当多的文件IO操作(拉取代码等),因此增加了网络IO的开销,任务的执行效率也依赖于网络状况;

3)现有的部署架构依然为单master结构,master无法动态扩容也无法集群化,当任务数和请求量增多时,Jenkins master将成为性能的瓶颈。

发明内容

本申请的主要目的在于提供一种Jenkins高可用的系统及方法,以提高现有的Jenkins的高可用方案的可用性、稳定性。

为了实现上述目的,根据本申请的第一方面,提供了一种Jenkins高可用的系统。

根据本申请的Jenkins高可用的系统包括:

任务管理模块,用于接收用户创建的任务数据,将所述任务数据持久化到本地数据库中;

任务调度模块,用于调用Jenkins的接口将所述任务数据作为输入同步创建jenkins任务到可用的Jenkins主节点上;将任务结果数据写入所述本地数据库中;

jenkins管理模块,用于对jenkins主节点进行异常检查;当检查到异常的jenkins主节点后,检查异常jenkins主节点中正在执行的jenkins任务。

进一步的,所述jenkins管理模块还包括:

发送单元,用于发送异常通知给所述任务调度模块;

所述任务调度模块还包括:

接收单元,用于接收jenkins管理模块发送的异常通知;

分配单元,用于为异常jenkins主节点中正在执行的jenkins任务进行可用jenkins主节点的重新分配。

进一步的,所述jenkins管理模块还包括:

计算单元,用于根据所述任务管理模块中的任务数据,计算每个jenkins主节点的任务负载;

扩缩容单元,用于根据任务负载的计算结果,通过Kubernetes的接口对jenkins集群进行动态扩缩容,动态扩缩容包括主从节点的扩缩,其中,jenkins集群中的主从节点都容器化部署在Kubernetes上。

进一步的,所述任务管理模块还包括:

删除单元,用于对所述任务数据进行删除;

查看单元,用于查看执行中的任务数据及执行完成的任务结果。

进一步的,所述任务调度模块还包括:

任务清理单元,用于对执行完成的jenkins任务的清理。

为了实现上述目的,根据本申请的第二方面,还提供了一种Jenkins高可用的方法。

所述方法包括:

接收到用户创建的任务数据后,将其持久化到本地数据库;并调用Jenkins的接口将所述任务数据作为输入同步创建jenkins任务到可用的Jenkins主节点上;

对jenkins主节点进行异常检查,并将异常的jenkins主节点上正在执行的jenkins任务重新创建到可用jenkins主节点;

在jenkins任务完成后将执行的结果存储到所述本地数据库。

进一步的,所述方法还包括:

根据用户创建的任务计算每个jenkins主节点的任务负载;

根据任务负载的计算结果,通过Kubernetes的接口对jenkins集群进行动态扩缩容,动态扩缩容包括主从节点的扩缩,其中,jenkins集群中的主从节点都容器化部署在Kubernetes上。

进一步的,所述在jenkins任务完成后将执行的结果存储到所述本地数据库包括:

jenkins任务完成后,接收到jenkins发送的任务完成通知;

根据任务完成通知,从jenkins主节点获取执行的结果存储到所述本地数据库。

进一步的,所述方法还包括:

接收查看请求,所述查看请求包括任务标识;

根据所述任务标识返回正在执行中的任务数据和/或执行完成的任务结果。

为了实现上述目的,根据本申请的第三方面,提供了一种Jenkins高可用的系统,包括安装上述第一方面中任一项所述系统的第一计算机,安装Jenkins的第二计算机:

所述第一计算机,用于执行上述第二方面中任一项所述的Jenkins高可用的方法;

所述第二计算机,用于接收所述第一计算机创建的jenkins任务,独立执行任务或者分配给jenkins从节点执行任务;任务执行完成后生成任务结果,并通知所述第一计算机。

为了实现上述目的,根据本申请的第四方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使所述计算机执行上述第二方面中任意一项所述的Jenkins高可用的方法。

在本申请实施例中,Jenkins高可用的系统及方法中,接收到用户创建的任务数据后,将其持久化到本地数据库;并调用Jenkins的接口将所述任务数据作为输入同步创建jenkins任务到可用的Jenkins主节点上;对jenkins主节点进行异常检查,并将异常的jenkins主节点上正在执行的jenkins任务重新创建到可用jenkins主节点;在jenkins任务完成后将执行的结果存储到所述本地数据库。其中,通过Kubernetes的接口可以增加jenkins主节点,jenkins主节点容器化部署在Kubernetes中。可以看出,本申请中通过将任务数据持久化到本地数据库中,相比于现有的基于Kubernetes和nfs的方案,将jenkins简化成一个无状态的应用,在jenkins主节点有异常时可以将其上正在执行的jenkins任务重新创建到正常的jenkins主节点上,从而达成jenkins任务数据不丢失,提高了jenkins的可用性稳定性,并使得CI/CD环节是稳定且高效。另外,利用kubernetes对jenkins节点进行容器化部署,实现了jenkins集群化部署高可用的目的,可以通过kubernetes增加jenkins主节点,有效避免了现有方案中单master结构影响性能的问题。

附图说明

构成本申请的一部分的附图用来提供对本申请的进一步理解,使得本申请的其它特征、目的和优点变得更明显。本申请的示意性实施例附图及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1是根据本申请实施例提供的一种Jenkins高可用的系统结构图;

图2是根据本申请实施例提供的另一种Jenkins高可用的系统结构图;

图3是根据本申请实施例提供的一种Jenkins高可用的方法流程图;

图4是根据本申请实施例提供的一种Jenkins高可用的系统的结构框图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。

根据本申请实施例,提供了一种Jenkins高可用的系统,该系统安装在与Jenkins不同的计算机中,具体的如图1所示,该系统包括:

首先需要说明的是,该系统相当于在Jenkins上包了一层的设计,通常与Jenkins位于不同的计算机中。

任务管理模块11,用于接收用户创建的任务数据,将所述任务数据持久化到本地数据库中;

其中,本地数据库为系统所在的计算机本地的数据库。数据库可以为MySQL,也可以为其他类型的数据库。由于本系统主要是针对Jenkins的高可用系统,因此任务数据是用于代码持续集成相关的任务对应的数据。

将任务数据持久化到本地数据库中可以解决现有的jenkins中文件存储模型带来的nfs本身又是单点的,存在着nfs单点故障/数据丢失后,Jenkins完全不可用等种种问题以及jenkins主节点有状态的问题,将jenkins简化成一个无状态的应用。

任务调度模块12,用于调用Jenkins的接口将所述任务数据作为输入同步创建jenkins任务到可用的Jenkins主节点上;将任务结果数据写入所述本地数据库中;

任务管理模块11在完成任务数据入库的同时,会将任务数据作为任务调度模块12的输入,使任务调度模块12调用Jenkins的接口将所述任务数据作为输入同步创建jenkins任务到可用的Jenkins主节点上。具体的在将创建jenkins任务到可用的Jenkins主节点上时,若可用的Jenkins主节点为多个,会根据Jenkins主节点的负载,优先选择低负载的可用Jenkins主节点。

之后,Jenkins主节点为根据自身的任务执行机制,选择独立执行任务或者将任务中的部分分配给对应的Jenkins从节点进行执行,执行完成后,得到任务结果。对于在Jenkins从节点上执行的任务,可以将对应的任务结果返回给Jenkins主节点。在jenkins任务完成之后,Jenkins主节点会向系统发送完成的通知,使任务调度模块12到Jenkins主节点上获取任务结果,并将任务结果存储到本地数据库中,以供后续的查看。

jenkins管理模块13,用于对jenkins主节点进行异常检查;当检查到异常的jenkins主节点后,检查异常jenkins主节点中正在执行的jenkins任务。

从以上的描述中,可以看出,本申请实施例的Jenkins高可用的系统中,任务管理模块接收到用户创建的任务数据后,将其持久化到本地数据库;相比于现有的基于Kubernetes和nfs的方案,将jenkins简化成一个无状态的应用。通过任务调度模块调用Jenkins的接口将所述任务数据作为输入同步创建jenkins任务到可用的Jenkins主节点上;并在jenkins任务完成后将执行的结果存储到所述本地数据库。通过jenkins管理模块,对jenkins主节点进行异常检查;当检查到异常的jenkins主节点后,检查异常jenkins主节点中正在执行的jenkins任务,可以实现对节点的健康检查。

进一步的,作为上述实施例的进一步的补充和细化,如图2所示,jenkins管理模块13还包括:

发送单元131,用于当检查到异常的jenkins主节点后,发送异常通知给任务调度模块12,其中异常通知中包括异常的主节点的标识以及其上正在执行的jenkins任务的标识,发送异常通知给任务调度模块12,使任务调度模块12根据异常通知实现异常主节点上正在执行任务的重新执行。具体的,可以通过hook功能发送异常通知。

如图2所示,任务调度模块12还包括:

接收单元121,用于接收jenkins管理模块发送的异常通知;

分配单元122,用于为异常jenkins主节点中正在执行的jenkins任务进行可用jenkins主节点的重新分配。

接收单元121和分配单元122是为了将重新在目前正常的jenkins主节点中创建在异常jenkins主节点中正在执行的jenkins任务,以重新执行。具体的,创建过程可以为,根据本地数据库中任务数据在正常的jenkins主节点上重新创建对应的jenkins任务。上述方式可以有效的避免主节点异常后,在其上正在执行的任务的无法执行。另外,对于执行超时的jenkins任务,任务管理模块11也会进行重新的执行。

从上述描述,可以看出,本申请实施例可以在jenkins主节点有异常时可以将其上正在执行的jenkins任务重新创建到正常的jenkins主节点上,从而达成jenkins任务数据不丢失,提高了jenkins的可用性稳定性,并使得CI/CD环节是稳定且高效。

进一步的,如图2所示,jenkins管理模块13还包括:

计算单元132,用于根据所述任务管理模块11中的任务数据,计算每个jenkins主节点的任务负载;

扩缩容单元133,用于根据任务负载的计算结果,通过Kubernetes的接口对jenkins集群进行动态扩缩容,动态扩缩容包括主从节点的扩缩,其中,jenkins集群中的主从节点都容器化部署在Kubernetes上。

具体的,根据任务管理模块11中产生的任务数据jenkins管理模块13可以计算出每个jenkins主节点的任务负载。然后根据任务负载的计算结果,通过Kubernetes的接口对jenkins集群进行动态扩缩容。具体的可以预先设置扩缩容的条件,比如当所有的主节点的负载都超过预设百分比时,则扩容;当所有的主节点的负载都低于预设百分比时,则缩容。在实际应用中,扩缩容的条件可以根据实际需求自适应的调整。本申请中不作限制。

jenkins集群中的主从节点都容器化部署在Kubernetes上,对jenkins的主从节点进行容器化部署,以此来保证jenkins的所有节点都是可以系统自愈的。扩缩容可以减少任务执行的排队时间。

另外,需要说明的是,jenkins管理模块13可以通过Kubernetes的接口加jenkins主节点,jenkins主节点以及从节点都容器化部署在Kubernetes中。本系统只关心jenkins主节点的增加,从节点可以由jenkins主节点根据自身应用的机制增加从节点。

从上述的描述可以看出,本申请实施例中利用kubernetes对jenkins节点进行容器化部署,实现了jenkins集群化部署高可用的目的,可以通过kubernetes增加jenkins主节点,有效避免了现有方案中单master结构影响性能的问题。

进一步的,如图2所示,所述任务管理模块11还包括:

删除单元111,用于对所述任务数据进行删除;

查看单元112,用于查看执行中的任务数据及执行完成的任务结果。

当任务完成后,任务管理模块11还负责任务数据的删除。在任务执行的过程中,任务管理模块11可以提供任务过程中数据的查看。在任务完成后还可以提供任务结果的查看功能。

进一步的,所述任务调度模块12还包括:

任务清理单元123,用于对执行完成的jenkins任务的清理。

jenkins任务完成时删除则可以减少磁盘空间的使用。

进一步的,jenkins管理模块13还可以负责对异常jenkins主节点的剔除。

根据本申请实施例,提供了一种Jenkins高可用的方法,如图3所示,该方法包括如下的步骤:

S201.接收到用户创建的任务数据后,将其持久化到本地数据库;并调用Jenkins的接口将任务数据作为输入同步创建jenkins任务到可用的Jenkins主节点上。

本步骤的实现方式可以参见图1中任务管理模块11和任务调度模块12中相关的描述,此处不再赘述。

S202.对jenkins主节点进行异常检查,并将异常的jenkins主节点上正在执行的jenkins任务重新创建到可用jenkins主节点。

本步骤的实现方式可以参见图1-2中任务调度模块12和jenkins管理模块13中相关的描述,此处不再赘述。

S203.在jenkins任务完成后将执行的结果存储到本地数据库。

本步骤的实现方式可以参见图1中任务调度模块12中相关的描述,此处不再赘述。

进一步的,所述方法还包括:

根据用户创建的任务计算每个jenkins主节点的任务负载;

根据任务负载的计算结果,通过Kubernetes的接口对jenkins集群进行动态扩缩容,动态扩缩容包括主从节点的扩缩,其中,jenkins集群中的主从节点都容器化部署在Kubernetes上。

进一步的,在jenkins任务完成后将执行的结果存储到所述本地数据库还包括:

jenkins任务完成后,接收到jenkins发送的任务完成通知;

根据任务完成通知,从jenkins主节点获取执行的结果存储到所述本地数据库。

进一步的,所述方法还包括:

接收查看请求,所述查看请求包括任务标识;

根据所述任务标识返回正在执行中的任务数据和/或执行完成的任务结果。

从以上的描述中,可以看出,本申请实施例的Jenkins高可用的方法中,接收到用户创建的任务数据后,将其持久化到本地数据库;并调用Jenkins的接口将所述任务数据作为输入同步创建jenkins任务到可用的Jenkins主节点上;对jenkins主节点进行异常检查,并将异常的jenkins主节点上正在执行的jenkins任务重新创建到可用jenkins主节点;在jenkins任务完成后将执行的结果存储到所述本地数据库。其中,通过Kubernetes的接口可以增加jenkins主节点,jenkins主节点容器化部署在Kubernetes中。可以看出,本申请中通过将任务数据持久化到本地数据库中,相比于现有的基于Kubernetes和nfs的方案,将jenkins简化成一个无状态的应用,在jenkins主节点有异常时可以将其上正在执行的jenkins任务重新创建到正常的jenkins主节点上,从而达成jenkins任务数据不丢失,提高了jenkins的可用性稳定性,并使得CI/CD环节是稳定且高效。另外,利用kubernetes对jenkins节点进行容器化部署,实现了jenkins集群化部署高可用的目的,可以通过kubernetes增加jenkins主节点,有效避免了现有方案中单master结构影响性能的问题。

最后,对本申请中的Jenkins高可用方案的有益效果进行总结如下:

通过对任务数据的Mysql持久化存储并利用kubernetes对jenkins主从节点进行容器化部署,并且引入负载均衡动态扩缩容等功能,将jenkins简化成一个无状态的应用,从而达成jenkins任务数据不丢失,集群化部署高可用的目的并使得CI/CD环节是稳定且高效的。

需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。另外,本申请各实施例中的相关的描述都可以互相参考。

根据本申请实施例,还提供了一种Jenkins高可用的系统,如图4所示,该所述系统包括:安装图1实施例中系统的第一计算机31,安装Jenkins的第二计算机32:

所述第一计算机31,用于执行上述图3中任一项所述的Jenkins高可用的方法;第一计算机31中包括上述图1-2中所述的Jenkins高可用的系统中的所有的模块单元以及本地数据库。

所述第二计算机32,用于接收所述第一计算机创建的jenkins任务,独立执行任务或者分配给jenkins从节点执行任务;任务执行完成后生成任务结果,并通知所述第一计算机。

本系统中,第一计算机31以及第二计算机32功能的实现,可以参见前述实施例中的相关说明。

另外,还需要说明的是,在实际应用中,Jenkins高可用的系统和Jenkins也可以位于同一计算机中。

从以上的描述中,可以看出,本申请实施例的Jenkins高可用的系统中,通过将任务数据持久化到本地数据库中,相比于现有的基于Kubernetes和nfs的方案,将jenkins简化成一个无状态的应用,在jenkins主节点有异常时可以将其上正在执行的jenkins任务重新创建到正常的jenkins主节点上,从而达成jenkins任务数据不丢失,提高了jenkins的可用性稳定性,并使得CI/CD环节是稳定且高效。另外,利用kubernetes对jenkins节点进行容器化部署,实现了jenkins集群化部署高可用的目的,可以通过kubernetes增加jenkins主节点,有效避免了现有方案中单master结构影响性能的问题。

根据本申请实施例,还提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使所述计算机执行上述方法实施例中的Jenkins高可用的方法。

根据本申请实施例,还提供了一种电子设备,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的计算机程序,所述计算机程序被所述至少一个处理器执行,以使所述至少一个处理器执行上述方法实施例中的Jenkins高可用的方法。

显然,本领域的技术人员应该明白,上述的本申请的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请不限制于任何特定的硬件和软件结合。

以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

相关技术
  • Jenkins高可用的系统及方法
  • 基于共享存储的MySQL数据库高可用系统及其高可用方法
技术分类

06120112533803