Jenkins插件之 Docker-Plugin 将slave运行在docker容器中

xiaoxiao2021-07-27  79

Jenkins插件名称 Docker plugin This plugin integrates Jenkins with Docker This plugin allows slaves to be dynamically provisioned using Docker. 插件文档地址:https://wiki.jenkins.io/display/JENKINS/Docker+Plugin

这个插件有个不足,不支持多个Docker 宿主机负载均衡。插件文档中说如果需要运行在多个Docker宿主机需要配合Docker swarm使用。那就不如直接用K8S了。 但是注意,可以配置多个Docker宿主机,然后设置Slave Label相同,这样,如果A主机Down了,可以自动在B主机上运行Docker Slave,这种方式能起到灾备的作用,但并不能实现负载均衡。

要在Jenkins Slave中运行docker 命令,请参考这篇博文Jenkins Slave in Docker

Docker宿主机配置

1 安装docker

第一步. 添加docker yum源

vi /etc/yum.repos.d/docker.repo

[docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://download.docker.com/linux/centos/7/$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://download.docker.com/linux/centos/gpg [docker-ce-stable-debuginfo] name=Docker CE Stable - Debuginfo $basearch baseurl=https://download.docker.com/linux/centos/7/debug-$basearch/stable enabled=0 gpgcheck=1 gpgkey=https://download.docker.com/linux/centos/gpg [docker-ce-stable-source] name=Docker CE Stable - Sources baseurl=https://download.docker.com/linux/centos/7/source/stable enabled=0 gpgcheck=1 gpgkey=https://download.docker.com/linux/centos/gpg

第二步. 安装docker

yum install -y docker

第三步. 配置docker开启远程访问

vi /etc/sysconfig/docker 根据操作系统不同和docker版本不同可能文件名不同,所有系统和版本也可以修改这个文件:docker.service

在OPTIONS=中加入 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock 如: OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock'

第四步. 配置docker加速站点

vi /etc/docker/daemon.json

{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}

启动docker

systemctl start docker && systemctl enable docker

2 配置Jenkins

安装docker插件

jenkins插件名称

Docker plugin This plugin integrates Jenkins with Docker

插件文档地址:https://wiki.jenkins.io/display/JENKINS/Docker+Plugin

配置插件

“Manage Jenkins”–>“Configure system”->“cloud” 添加一个docker 修改配置 这里的docker image不能随便用,jenkins/ssh-slave被证明是有效的 这一步有 这一步有给坑,就是JavaPath的配置,这是配置jenkins slave image里的java路径,如果不配置也会到几个默认的目录去找,但是如果java不在默认目录,那就找不到,就会启动失败。所以这里最好还是根据实际情况指定,以免出错

3 使用Docker slave

测试:

1 自由风格项目:在Master Jenkins中新建一个自由风格的项目

尝试构建,一开始等待拉起docker-slave,稍等几秒钟,开始正常构建。

2 pipeline风格的项目

在agent部分增加label属性

pipeline { agent { label 'Docker-slave' } stages { stage ('Exec Test Command') { steps{ echo 'begin+++++++++++++++++++++' sh 'sleep 300s' sh 'whereis java' echo 'end+++++++++++++++++++++++' } } } }

3. 使用pipeline 构建maven项目

先配置jenkins docker插件

将maven的本地依赖包保存目录映射到物理服务器,以避免每次在slave上执行maven构建都要到远程仓库下载依赖包(这时很费时的)。如果使用多台服务器执行容器化的jenkins-slave,那最好使用一个共享存储(如NFS等)保存依赖。 挂载还遇到一个权限问题参见另外一个博文【容器挂载volume出现“Permission denied”的问题定位解决】

进到容器执行 root@8f0c5c759424:/home/jenkins# ls -Z 结果:(可见maven_repository目录与其它不同) unconfined_u:object_r:home_root_t:s0 maven_repository system_u:object_r:container_file_t:s0:c324,c498 opt system_u:object_r:container_file_t:s0:c324,c498 bin system_u:object_r:proc_t:s0 proc system_u:object_r:container_file_t:s0:c324,c498 boot system_u:object_r:container_file_t:s0:c324,c498 root system_u:object_r:container_file_t:s0:c324,c498 dev system_u:object_r:container_file_t:s0 run 解决办法:宿主机要挂载到容器的目录执行 chcon -Rt container_file_t /home/jenkins/maven_repository

生成docker镜像

默认的jenkins/ssh-slave 不包含maven,另外如果你需要特定的jdk版本也需要自己重构镜像。 我的镜像加入了我需要的jdk版本,maven版本和sonarscanner。注意:所有这些的目录要与master节点的目录配置相同。如master节点的maven在这个目录:/var/jenkins_home/maven,那镜像里也将maven放在这个目录。

我在镜像中使用sonarscanner时遇到一个权限问题,没有权限执行命令。分析原因应该是,运行使用jenkins用户所以没有执行权限。尝试过将sonarscanner的用户设置为jenkins不行,也尝试使用sudo,但是jenkins-slave的官方镜像使用的应该是debain系,默认没有sudo命令。所以我在确认安全的情况下将执行jenkins-slave的用户修改为了root用户,sonarscanner运行没才问题了。这里需要修改两个地方:

一是使用jenkins/ssh-slave官方Dockerfile重构镜像时修改PermitRootLogin 为yes(官方是no)。

RUN sed -i /etc/ssh/sshd_config \ -e 's/#PermitRootLogin.*/PermitRootLogin yes/' \ -e 's/#RSAAuthentication.*/RSAAuthentication yes/' \

另外就是在jenkins-docker设置中将User 设置为root

同时运行多个构建任务 (agent label 都是 ‘Docker-slave’)

至此以docker 容器运行的slave配置完成,构建时启动容器,构建后销毁容器。

如果本文对您有所帮助,请帮忙点赞,谢谢!

转载请注明原文地址: https://www.6miu.com/read-4823379.html

最新回复(0)