Jenkins插件之 Docker-Plugin 将slave运行在docker容器中 - Go语言中文社区

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


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配置完成,构建时启动容器,构建后销毁容器。

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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_31977125/article/details/82999872
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢