基于jenkins实时任务动态创建docker容器节点执行任务的方法与流程

文档序号:22427882发布日期:2020-10-02 10:04阅读:451来源:国知局
基于jenkins实时任务动态创建docker容器节点执行任务的方法与流程

本发明涉及软件开发和软件测试技术领域,尤其涉及一种基于jenkins实时任务动态创建docker容器节点执行任务的方法。



背景技术:

jenkins是一种开源软件项目,是基于java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。docker是一种开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或windows机器上,也可以实现虚拟化。jenkinsslave节点:同jenkins主节点进行交互,接受jenkins主节点分发的jenkinsjob,在子节点上完成jenkinsjob设定的任务。

目前jenkins的slave节点都是预先准备好的长期保留的虚拟机或者物理机,然后该节点通过ssh或者jnlp方式,主动连接到jenkinsmaster节点,将自己注册成为jenkins的一个slave节点。

但是该模式意味着slave节点需要一直存在,有jenkinsjob的时候,才能立刻执行job。如果jenkins在某一个时候,有大批量的任务需要执行的时候,需要长期保持大批量的slave节点,才能满足及时响应需求。该种方式在没有jenkins任务的时候,大量的slave节点处于闲置状态,资源使用率不高。



技术实现要素:

为解决现有技术方案中资源使用率不高的问题,本发明提供一种基于jenkins实时任务动态创建docker容器节点执行任务的方法,动态创建jenkinsslave节点,不需要长期占用,在有大量并发任务的场景中,通过自动销毁容器节点,能够节约大量资源,并可以根据实际情况,动态调整最大jenkinsjob数量,满足业务要求。

本发明基于jenkins实时任务动态创建docker容器节点执行任务的方法,包括:

a.开发一种定制化生成dockerfile的脚本,针对dockerfile中包含的关键字进行预定义,根据传入的参数获取预定义值,动态生成dockerfile格式文件,生成容器镜像;

b.定制化开发jenkins插件,实时获取jenkinsjob排队队列信息,并进行动态启动容器镜像,注册为jenkinsslave节点,完成jenkinsjob任务;

c.jenkins插件实时统计正在运行中的jenkinsjob的数量,并且将该数量和设定的最大并行数进行比较,如果少于最大并行数,则从保存实时jenkinsjob排队队列信息的数据库中获取job信息,并根据job信息,启动容器作为jenkinsslave,执行jenkinsjob设定的任务。

本发明动态创建dockerfile,并生成容器镜像,只需创建一次,后续可以直接使用并且动态创建jenkinsslave节点,不需要长期占用,在有大量并发任务的场景中,通过自动销毁容器节点,能够节约大量资源,并可以根据实际情况,动态调整最大jenkinsjob数量,满足业务要求。

进一步的,步骤a包括:

a1.根据linux的版本不同,定制化脚本通过接收到的linxu的版本参数,对dockerfile的关键字from进行赋值,生成符合dockerfile格式的文本;

a2.根据程序语言编译版本不同,定制化脚本通过接收到的编译语言参数,对dockerfile的关键字copy、run和env进行组合赋值,生成符合dockerfile格式的文本;使dockerfile在经过编译过后,生成的镜像能够支持传入参数的语言编译环境。

a3.根据git和svn版本管理环境不同,定制化脚本通过接收到的版本控制软件参数,对dockerfile的关键字copy和run进行赋值,生成符合dockerfile格式的文本;使dockerfile在经过编译过后,生成的镜像能够支持传入参数的制定版本控制环境。

a4.根据a1、a2和a3步骤,生成由各种linxu版本参数、编译语言参数和版本控制软件参数组合成的dockerfile文件,并通过dockerbuild生成容器镜像,该容器镜像以linxu版本、编译语言版本和版本控制软件的信息组合命名,并且保存到镜像仓库中。

进一步的,步骤b包括:

b1.定制化开发jenkins插件,并设置jenkins的最大动态并行job数以及linux版本、编程语言和版本管理的参数;

b2.根据实时的jenkinsjob队列信息,将所有实时的jenkinsjob排队队列信息写入数据库;

b3.根据设置的jenkins的最大动态并行job数,从保存jenkinsjob排队队列信息的数据库中读取出指定数量的jenkinsjob;

b4.定制化的jenkins插件获取jenkinsjob包含的版本控制软件信息、语言编译版本信息和linux版本信息,并且根据linxu版本、语言编译版本和版本控制软件的信息组合命名的方法得到容器镜像名,在镜像仓库中查询是否有相同容器镜像名的镜像;

如果有相同容器镜像名的镜像则直接启动该镜像,并通过jnpl方式主动将该镜像注册为jenkinsslave节点,执行jenkinsjob设定的任务;

如果没有符合要求的镜像,则根据jenkinsjob的版本控制软件信息、语言编译版本信息和linux版本信息生成一个dockerfile文件,并通过dockerbuild生成容器镜像,并保存到镜像仓库中,再次启动该新建的容器镜像,并通过jnpl方式主动将该镜像注册为jenkinsslave节点,执行jenkinsjob设定的任务。动态创建dockerfile,并生成容器镜像,只需创建一次,后续可以直接使用。

进一步的,步骤c包括:

c1.获取设定的最大动态并行job数,和实时运行的jenkinsjob数进行比较,如果设定的最大动态并行job数大于实时运行的jenkinsjob数则从数据库中获取jenkinsjob信息,根据步骤b4执行jenkinsjob;

c2.循环执行c1步骤工作,直至保存jenkinsjob排队队列信息的数据库中的数据为空;

c3.完成jenkinsjob设定的任务后,自动注销运行该jenkinsjob的jenkinsslave节点从而释放资源。

本发明基于jenkins实时任务动态创建docker容器节点执行任务的方法,动态创建dockerfile,并生成容器镜像后动态创建jenkinsslave节点不需要长期占用,在有大量并发任务的场景中,通过自动销毁容器节点,能够节约大量资源,并可以根据实际情况,动态调整最大jenkinsjob数量,满足业务要求。

附图说明

图1为本发明基于jenkins实时任务动态创建docker容器节点执行任务的方法的流程图。

具体实施方式

以下结合实施例的具体实施方式,对本发明的上述内容再作进一步的详细说明。但不应将此理解为本发明上述主题的范围仅限于以下的实例。在不脱离本发明上述技术思想情况下,根据本领域普通技术知识和惯用手段做出的各种替换或变更,均应包括在本发明的范围内。

如图1所示本发明基于jenkins实时任务动态创建docker容器节点执行任务的方法,包括:

a.动态生成dockerfile格式文件。

开发一种定制化生成dockerfile的脚本,针对dockerfile中的关键字:from,run,copy,env的值进行预定义,然后根据传入的参数,获取预定义值,动态生成dockerfile格式文件。

a1.基于不同的linux版本,定制化脚本通过接收的linux版本参数,对dockerfile的from关键字进行赋值。例如传入的linux版本参数是centos7.6,则生成如下符合dockerfile格式要求的文本:fromcentos7.6

a2.针对程序语言编译环境,定制化脚本通过接收的编译语言参数,对dockerfile的copy和run、env等关键字进行组合赋值,使dockerfile在经过编译过后,生成的镜像能够支持传入参数的语言的编译环境。例如传入参数java1.8,则生成如下符合dockerfile格式要求的文本,如下文本描述了生成一个java运行环境的dockerfile格式文本描述:

copyjdk1.8

envjava_home=/opt/jdk1.8

envpath=$java_home/bin:$path

envclasspath=.:$java_home/lib/dt.jar:$java_home/lib/tools.jar;

a3.针对git、svn版本管理环境,定制化脚本通过接收的版本控制软件参数,对docker的copy和run关键字进行赋值,使dockerfile在经过编译过后,生成的镜像能够支持传入参数的制定的版本控制环境。例如传入参数git,则生成如下符合dockerfile格式要求的文本:

copygit

envgit_home=/opt/git

envpath=$git_home/bin:$path;

a4.通过前面3个步骤,可以生成各种程序语言、基础linux版本及版本控制软件动态组合而成的dockerfile文件,文本如下:

fromcentos:7

copyjdk1.8

envjava_home=/jdk1.8

envpath=$java_home/bin:$path

envclasspath=.:$java_home/lib/dt.jar:$java_home/lib/tools.jar

copygit

envpath=$java_home/bin:$path。

b.生成容器镜像。

dockerfile生成后,通过dockerbuild构建镜像,并以linux版本信息、语言编译版本信息和版本控制软件信息组合命名该镜像,并保存到镜像仓库中。

c.定制化jenkins插件。

定制化jenkins插件,设定jenkins的最大动态并行job数和linux版本、编程语言和版本管理参数选项。

d.获取jenkinsjob并查询容器镜像。

将所有实时的jenkinsjob排队队列信息写入数据库,根据设定的最大并行job数,从保存实时jenkinsjob排队队列信息的数据库中读取出指定数量的jenkinsjob,该指定数量小于或等于最大并行job数;

d1.jenkins插件获取jenkinsjob里包含的如下信息:版本控制软件信息、语言编译版本信息和linux版本信息;

d2.jenkins插件在获取到信息后,按照linux版本信息、版本控制软件信息和语言编译版本信息组合的方式得到容器镜像名,并且在镜像仓库中查询是否有相同容器镜像名的镜像;

e.启动容器镜像并创建jenkinsslave节点运行jenkinsjob。

e1.如果有相同容器镜像名的镜像则直接启动该镜像,并通过jnpl方式主动将该镜像注册为jenkinsslave节点,执行jenkinsjob设定的任务;

e2.如果没有符合要求的镜像,则根据版本控制软件信息、语言编译版本信息和linux版本信息生成一个dockerfile文件,并通过dockerbuild生成一个新的容器镜像,并保存到镜像仓库中,启动该新建的容器镜像,并通过jnpl方式主动将该镜像注册为jenkinsslave节点,执行jenkinsjob设定的任务。

e3.完成jenkinsjob设定的任务后,自动注销运行该jenkinsjob的jenkinsslave节点从而释放资源。

本发明动态创建dockerfile并生成容器镜像并且动态创建jenkinsslave节点,不需要长期占用,在有大量并发任务的场景中,通过自动销毁容器节点,能够节约大量资源,并可以根据实际情况,动态调整最大jenkinsjob数量,满足业务要求,提高资源使用率。

实施例1:

1.将100个被触发的job的信息写入数据库;

2.开发一种定制化生成dockerfile的脚本;dockerfile脚本根据传入的参数,生成dockerfile文件,例如:传入的linux版本参数是centos7.6生成一个java运行环境的dockerfile格式文本:

copyjdk1.8

envjava_home=/opt/jdk1.8

envpath=$java_home/bin:$path

envclasspath=.:$java_home/lib/dt.jar:$java_home/lib/tools.jar;

传入参数java1.8,生成一个java运行环境的dockerfile格式文本:

copyjdk1.8

envjava_home=/opt/jdk1.8

envpath=$java_home/bin:$path

envclasspath=.:$java_home/lib/dt.jar:$java_home/lib/tools.jar;

传入参数git,生成一个git运行环境的dockerfile格式文本:

copygit

envgit_home=/opt/git

envpath=$git_home/bin:$path;

最后组合而成的dockerfile文件,文本如下:

fromcentos:7

copyjdk1.8

envjava_home=/jdk1.8

envpath=$java_home/bin:$path

envclasspath=.:$java_home/lib/dt.jar:$java_home/lib/tools.jar

copygit

envpath=$java_home/bin:$path。

调用dockerbuild对dockerfile进行编译,生成docker镜像,

该docker镜像是以传入参数“操作系统版本,编译语言、版本控制软件”来命名,例如上述镜像名为:centos7.6-java1.8-git。镜像生成后,保存到容器镜像仓库。

3.定制化开发jenkins插件,设定jenkins的最大动态并行数为50,jenkins插件轮询所有写入数据库job的信息,读出50个job设定的操作系统版本,编译语言、版本控制软件信息作为参数;

以job信息:“操作系统版本,编译语言、版本控制软件”来命名拼接出容器镜像名,例如某个job信息为“操作系统信息redhat5.7;代码仓库信息:svn;编译语言及版本信息:java7.0;”则该容器镜像名应为:redhat5.7-java7.0-svn;

在容器镜像仓库中查询是否有镜像名为redhat5.7-java7.0-svn的容器镜像,如果有则直接启动该镜像,并通过jnpl方式将该镜像主动注册为jenkinsslave节点,并按照jenkinsjob设置的信息进行job任务执行;

如果没有该镜像,则以该job的“操作系统信息redhat5.7;代码仓库信息:svn;编译语言及版本信息:java7.0”生成一个dockerfile文件新创建一个容器镜像,并保存到容器镜像仓库中,再次启动该新建的容器镜像,并通过并通过jnpl方式将该镜像主动注册为jenkinsslave节点,并按照jenkinsjob设置的信息进行job任务执行。

4.jenkins插件实时监控运行中的50个job,若某个job执行完成,则从数据库将该job的信息删除,并读取出第51个job按照步骤3继续执行,重复该步骤直到数据库中的100个job执行完成,然后自动释放dockerslave节点占用的硬件资源。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1