基于jenkins的弹性持续集成

2019-09-06  测试领域专家 

jenkins作为当前市面上使用率最广泛的持续集成工具,功能强大、操作简单,大家都比较熟悉了。在使用jenkins的过程中,极少的情况下安装单机jenkins作为slave直接进行构建;比较常见的情形,是安装一台jenkins作为master,其他windows或者linux的机子作为slave连接到该master上,由master下发任务构建到不同的slave节点上,如此既可以降低master节点的负载,又似的slave的无限扩展成为可能,从而增强jenkins的执行能力。但是这个方法有个不足之处,就是当构建的任务很多的时候,现有的slave节点可能无法满足构建需求;而当构建任务不多的时候,slave节点的资源又存在浪费。而且,节点的管理都需要在master节点进行注册,也是一项不小的工作。那么,有没有办法既能减少slave节点的维护又能提高jenkins的弹性持续集成能力呢?答案是docker。此处,我们介绍一下单机docker的设置方法,其他基于k8s或者swarm的原理,大同小异。

配置docker服务开启远程访问

  • 首先我们在已经安装好docker的服务器上开启远程管理docker的功能:
vim /etc/docker/daemon.json

然后修改文件内容,添加:

 "hosts": ["tcp://192.168.10.34:2375","unix:///var/run/docker.sock"]

注意把ip换成本机ip。然后重启docker服务

service docker restart

如果上述方法无效,我们换用修改systemd方法:

vim /lib/systemd/system/docker.service

然后修改



把这一行改为:

ExecStart=/usr/bin/dockerd -H fd:// -H unix://var/run/docker.sock -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock

然后保存修改:

systemctl daemon-reload

重启服务:

service docker restart
  • 然后我们拉取ssh-slave这个jenkins的slave镜像:https://hub.docker.com/r/jenkinsci/ssh-slave
docker pull jenkinsci/ssh-slave

配置jenkins

  • 首先在jenkins上安装插件docker:


  • 然后在 系统管理 - 系统设置 - 云 - 新增一个云 - docker, 设置docker相关信息:
  • 点击Docker cloud details:


主要填入dockerhost的地址和enable这个docker host。如果我们在开启docker http远程访问的时候启用身份验证的话,就用Server credentials那个地方管理链接的用户名和密码。container cap那个地方,设置jenkins可以同时最大创建的容器个数。

  • 接着我们添加agent template:


重点说明几个配置:

labels这个字段:用于我们在配置构建任务时选择运行节点时使用

enabled:启用本agent template

name: jenkins创建container的时候其的名字的前缀,后面会跟一个创建时构造的唯一标识

docker image:就是我们上面pull的默认的jenkinsci/ssh-slave,如果大家自己封装了image,写上自己的即可

credentials:访问docker镜像仓库的用户名和密码

instance capacity和remote file system root,一般用不上

用法: 我们选择 只允许运行绑定到这台机器的job,这个配置就是和一般的slave配置一样了

connect method: 我们选择 attach docker container

remove volumes: 我们勾选上,不然删除container后依旧可能占用硬盘空间

pull strategy: 拉取镜像的策略,我们这里选never pull

另外一些构建时用的工具位置、环境变量等,我们在node properties里面配置。有一种方法,就是我们在宿主机上安装公用的工具,比如ant、maven这些,然后通过volume的方式挂载到container里面,这样我们的镜像就不需要安装这些工具了,如此,我们点击CONTAINER SETTINGS展开容器的配置信息,包括CPU、内存、volume等配置,大家根据需要自行设置。

验证

  • 我们创建一个自由风格的job
  • 限制项目的运行节点,填入内容与上文的labels相同:


  • 构建,我们这里做一个演示,简单点好了:


  • 然后保存,立即构建
  • 稍等会,我们就看到有container创建并执行成功:


控制台输出里面也能看到相应的执行结果:



而在任务执行完成之后,该container也被jenkins删除,节点当中也看不到该容器。从而实现了有任务时创建容器并执行,任务完成之后删除容器的jenkins弹性持续集成。


关注:测试领域专家(头条&微信)获取第一时间文章更新。

52°|528 人阅读|0 条评论
登录 后发表评论
访客 22
2
0
0/0
0
博客
讨论
问答
找茬
测试领域专家 的其他博文 更多