1、jenkins配置:https://blog.ahamu.cn/blog/detail.html?id=275
2、swarm基础知识:https://blog.ahamu.cn/blog/detail.html?id=328
3、swarm准备
在几台服务器安装Docker,安装方式参考Centos7上安装docker
所有节点防火墙开放端口2377,主节点与备选主节点防火墙额外开放端口9999
开启主节点与备选主节点上docker的远程调用端口
查看配置文件路径systemctl show --property=FragmentPath docker // FragmentPath=/usr/lib/systemd/system/docker.service 编辑配置文件内容vi /usr/lib/systemd/system/docker.service 修改对应项ExecStart=/usr/bin/dockerd => ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:9999 重新加载配置文件,重启docker systemctl daemon-reloadsystemctl restart docker
4、设置Jenkins
【系统管理】-【插件管理】-【可选插件】安装 Docker Swarm Plugin 插件
【系统管理】-【全局安全配置】-【代理】
防火墙没有开放所有端口,这里只能指定端口8081,否者jenkins master节点与运行在 Swarm 上的slave节点无法通信
【系统管理】-【系统设置】-【云】
其中Docker swarm api url 为master1的网络地址和之前设置的docker的远程调用端口
由于没有配置调用校验,所以不能使用默认的2375端口,改用不常用的端口9999,否则会被恶意调用,将其用来运行挖矿等恶意程序
Docker Agent template 为jenkins slave节点的模板
模板可以配置多个,其中Label为标签
在进行构建的时候指定运行节点为 SWARM-NODE-NODEJS 即可通过 Image 指定的镜像启动slave节点
Env 为环境变量
格式为 "key1=value1 key2=value2"
Host Binds 为文件映射配置
配置 /var/run/docker.sock:/var/run/docker.sock 使容器中的docker client 与 宿主机上的 docker server正确通信
5、使用示例
新建一个自由风格的任务,取名test,勾选 限制项目运行的节点,输入上面的Label SWARM-NODE-NODEJS:DOCKER
在下面构建步骤中勾选执行shell,输入 "node -v" "docker version" 方便查看运行效果
最后点击【应用】【保存】
回到首页运行该构建任务
镜像最小的至少800M,这是最大的缺点,但是除了第一次启动耗费时间很长,其他还是很快的
除去下载镜像的时间,大概一到两分钟之后,slave节点启动
在master1上查看Swarm中的任务状态,可以看见一个jenkins slave运行
同样jenkin也开始显示构建状态
查看控制台输出
6、总结
这里所介绍的只是整个持续集成中的弹性伸缩,如果需要完成完整的持续集成流程,需要继续配置webhook与构建后操作,实现自动测试编译发布,这里不作详述。
没有构建任务时,只需要保存主节点在线。一旦构建的webhook被触发,主节点会去Swarm里面启动子节点,构建任务完成后,子节点被删掉,只保持最少的节点在线,灵活使用资源。