背景

在CI/CD工作中我们主要使用单节点Jenkins(Master)来完成构建任务,随着项目不断增多,单节点无论在效率及稳定性上已经不满足我们的需求,而Jenkins天然支持Master-Slave架构,因此我们可以通过部署Slave节点的方式来给Master减负。但是Slave节点只有在分配了任务时才执行构建,在完成分配的构建任务后处于空闲状态,在后台一直运行而不会自动销毁释放资源。

那有什么方案可以避免这种情况呢?

方案

我们借助Jenkins插件Docker plugin可以实现动态创建Jenkins Slave,执行完构建任务后自行销毁。

架构

Jenkins是Master-Slave架构,Master节点提供Web GUI 和API来管理、分配、运行构建任务;Slave节点只是用来运行Master节点分配的构建任务;因此Slave可以有效减轻Master的工作负载,这也意味着Slave节点可以分布在不同平台并且无需安装jenkins的完整包。

Master和Slave通信方式:

  • Master->Slave,最常用的方式,在网络联通情况下,Master通过ssh主动与agent进行通信;

  • Slave->Master,在Slave不可访问的情况下,通过Java Web Start(JNLP)由Slave访问Master;

当Slave建立好后,只需在Master上根据”node label”将任务分配到指定的节点上运行。

实现

  1. 安装docker plugin 配置图
  2. Slave节点宿主机配置
    • 在宿主机上安装docker环境,参考:docker 安装
    • 开放docker服务端口 配置截图
  3. Jenkins配置docker
    jenkins_add_cloud.png
    configure_part1.png
    configure_part2.png
    configure_part3.png
    可以明确JavaPath路径,jenkins/ssh-agent该镜像运行后java路径为:/opt/java/openjdk/bin/java,这样执行Jenkins job时就不用再去检测java。
  4. 创建Jenkins job并指定slave节点
    jenkins_job.png
    构建:
    docker_created.png
    可以看到Slave节点上创建了docker容器
    Jenkins Console Output 也可以看到具体的日志信息

注意:docker slave节点最好部署在Jenkins master同一内网,Jenkins job执行时在指定Slave启动docker并随机暴露可用的端口,对于防火墙的设定较为不便。

参考

https://www.jenkins.io/doc/book/managing/nodes/
https://plugins.jenkins.io/docker-plugin/#documentation