Jenkins+maven+docker 解决项目持续集成

容器的管理可以选择rancher,jenkins可以在rancher上进行安装,本文先不介绍rancher,安装jenkins我选用的是docker安装。以后再介绍rancher的整体管理。

1:拉取jenkins镜像。 从dockerhub上拉取jenkins镜像,我拉取的是latest版本

docker pull jenkins

Jenkins+maven+docker 解决项目持续集成

2:建立jenkins_home文件夹,启动jenkins时挂载这个文件夹后续配置方便

mkdir -p /docker/jenkins_home

Jenkins+maven+docker 解决项目持续集成

3:因为 jenkins user - uid 1000,所以这里我们更改目录用户组及用户(更详细的可见:https://github.com/jenkinsci/docker/blob/master/README.md#usage

chown -R 1000:1000 /docker/jenkins_home

4:需要在jenkins里用docker命令,把jar包打成镜像文件,可因为jenkins我们是用docker启动的,这里权限会有问题,docker.sock不让访问,网上有一些处理办法,我把我使用的写下来供大家参考

新写一个Dockerfile文件

FROM jenkins

LABEL maintainer="[email protected]"

USER root

ARG dockerGid=999

RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group

USER jenkins

在Dockerfile文件目录下,运行docker生成镜像命令:

docker build -t "myjenkins" .

Jenkins+maven+docker 解决项目持续集成

查看生成的镜像

docker images

Jenkins+maven+docker 解决项目持续集成

5:给docker.sock赋读写权限

chmod 777 /var/run/docker.sock

Jenkins+maven+docker 解决项目持续集成

6:运行jenkins容器

docker run -d --restart unless-stopped --name jenkins -p 30000:8080 -p 30001:50000 -v /docker/jenkins_home:/var/jenkins_home -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 myjenkins

-v /usr/bin/docker:/usr/bin/docke

-v /var/run/docker.sock:/var/run/docker.sock

-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7

这三个挂载是解决在jenkins上可以使用docker命令

Jenkins+maven+docker 解决项目持续集成

查看启动日志:

docker logs -f jenkins

Jenkins+maven+docker 解决项目持续集成

7:启动成功后可以登陆jenkins的前台管理页面

http://192.168.155.44:30000

Jenkins+maven+docker 解决项目持续集成

第一次登陆需要注册下,按照页面提示正常注册就可以。

页面提示的路径,因为我的本机挂载的,所以在本机的路径是/docker/jenkins_home/secrets/initialAdminPassword

注册完成的页面是:

Jenkins+maven+docker 解决项目持续集成

8:安装maven

因为jenkins本身不带maven插件,所以需要自己安装下,由于我们的虚拟机中是没有直接安装maven软件的,我们可以在全局工具配置中安装maven, 选择一个合适的版本,勾选自动安装,之后直接保存,需注意的是,现在jenkins并不会立即给你安装maven软件

Jenkins+maven+docker 解决项目持续集成

接下来我们在插件管理中查找maven插件,我们选择好maven integration插件,然后点击直接安装

Jenkins+maven+docker 解决项目持续集成

Maven插件我已经安装上了

9:配置maven

大家都知道我们要从maven库下载代码需要配置setting.xml,用jenkins时也需要把setting.xml配置好。

在目录/docker/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/jenkins-in-maven/conf下修改setting.xml文件。

Jenkins+maven+docker 解决项目持续集成

10:创建一个新任务

在首页点击新建任务

Jenkins+maven+docker 解决项目持续集成

然后选择构建一个maven项目,任务名称我一般都写入项目名称

Jenkins+maven+docker 解决项目持续集成

点击构建一个maven项目,进入到项目配置页面。

Jenkins+maven+docker 解决项目持续集成

在源码管理中输入项目git仓库地址

Jenkins+maven+docker 解决项目持续集成

Jenkins+maven+docker 解决项目持续集成

配置5分钟检查一次,当git发生变化时,会自动启动构建

Jenkins+maven+docker 解决项目持续集成

Goals and options 填写mvn命令(clean package -DskipTests=true)

全部配置好后点击保存按钮

Jenkins+maven+docker 解决项目持续集成

点击立即构建按钮,这时就会先从git上下载项目源代码,然后进行代码编译。点击控制台输出可以看到输入日志。

Jenkins+maven+docker 解决项目持续集成

Jenkins+maven+docker 解决项目持续集成

这时maven部份就全部完成了,可以把git私有仓库上的源代码打成jar包。

打包好的文件在虚拟机上的路径:

Jenkins+maven+docker 解决项目持续集成

11:配置docker

下载docker插件,在jenkins中安装docker插件,在系统管理->插件管理里找到并安装如下插件(Docker plugin):

Jenkins+maven+docker 解决项目持续集成

如果成功安装插件,你会在你的系统管理菜单里看见Docker菜单:

Jenkins+maven+docker 解决项目持续集成

然后在系统管理->系统设置中的最下面你会看到新增一个Docker云:

Jenkins+maven+docker 解决项目持续集成

把前面挂载的docker.sock 文件写入Docker Host URI 中:unix:///var/run/docker.sock,可以点击TestConnection按钮进行测试是否连接成功。

连接成功后,可以在系统管理菜单里进入Docker菜单,看到如下界面,点击docker进入后,里面会向你展示你宿主机上的所有镜像以及容器:

Jenkins+maven+docker 解决项目持续集成

然后返回任务页面,选择配置,在Post Steps里把docker建立镜像的命令输入进去:

Jenkins+maven+docker 解决项目持续集成

在Post Steps里添加一个Build/Publish Docker Image选项,Directory for Dockerfile填写. (就一个点),Cloud选择先前添加docker云配置的名称,然后输入镜像名192.168.155.100/restful-api-demo

点击保存,然后再构建工程,会发现docker构建镜像的命令已经执行了。

Jenkins+maven+docker 解决项目持续集成

Dockerfile文件是放在项目的根目录下

在虚拟机上执行docker images命令可以看到新创建好的镜像

Jenkins+maven+docker 解决项目持续集成

12:docker镜像放到私有docker仓库

在Post Steps这部中,需要给Push image打条,然后配置Registry Credentials(登陆私有docker仓库的用户名、密码),点击保存。

 

Jenkins+maven+docker 解决项目持续集成

配置好后,再次构建任务,最后就能看到项目成功的上传到了docker私服中。

(我这里是用docker启动的jenkins,当在虚拟器上用docker login命令登陆过一次私有库后,会在根目录下生成一个.docker/config.json文件,我不清楚是否需要把这个文件放到jenkins容器中的/var/jenkins_home目录下,让容器中的环境可以找到docker上传地址。这块的测试,我用的是yum安装的jenkins,push镜像的时候没有出现这类问题)