一、项目描述
我们接下来要做的是在jenkins端写好代码,用Dockerfile文件直接构建镜像。此时整合的逻辑大致为:用户把代码通过git提交push到gitlab上,然后gitlab触发jenkins的webhook,通知jenkins做构建。
即整体流程为 :在server3 gitlab服务器上编写dockerfile,然后push到gitlab仓库,再经过gitlab触发jenkins,jenkins主机从server1 harbor仓库中拉取镜像,从而实现自动构建docker镜像,并将构建的镜像推送到harbor仓库。
主机名称 | IP地址 | 功能 |
server3 | 172.25.254.3 | 作为gitlab服务器 |
server4 | 172.25.254.4 | 作为jenkins服务器 |
server1 | 172.25.254.1 | harbor仓库 |
server5 | 172.25.254.5 | 完成拉取镜像并运行 |
二、自动化构建镜像并运行
2.1 项目构建----手动触发
现在我们要做的是让jenkins来做真正的构建镜像。
安装插件
首先我们先进入jenkins的插件管理:
安装此插件,此插件可以构建dockerfile项目,并且将其上传到docker仓库中。现在进入jenkins项目中的配置---> 构建:
由于我们要在jenkins主机上推送镜像到docker仓库,所以我们要在server4上安装docker-ce。
配置yum源
先将之前的阿里云的yum源copy给server4:
使用docker会有网桥问题,将之前server1上的网桥配置文件copy到server4上:
使之生效:
想要让server4连接server1上的harbor仓库:
添加解析
添加访问仓库的证书
给server4设置阿里云加速器:
至此,本机的docker引擎就到位了。
jenkins项目设置
接下来我们就在web上jenkins项目配置里操作了:
套接字文件更改权限
由于我们使用jenkins用户身份运行docker的,所以必须更改用户权限
更改完毕进行测试,由于之前Dockerfile已经创建好了:
手动构建
直接在jenkins中进行手动构建:
可以看到已经有了第四次构建,在控制台输出中也可以看见整个的拉取流程:
在server4 jenkins主机上也能看到我们创建的镜像:
数据存储在下面的位置:
同时,jenkins会把镜像推送到harbor仓库 library/jenkins-server(这是我们在刚刚插件中的设置完成的),这是我们刚刚自己设置的仓库位置:
2.2 项目构建----mytest项目构建成功时触发
现在我们再作一次jenkins+harbor 联动的、完整的来构建一次
新建项目
我们先新建一个docker项目:
构建触发器
执行shell脚本运行docker
构建此项目报错,是因为我们没有配置私有仓库,找不到镜像:
指定仓库拉取
运行成功:
可以看到容器已经在jenkins主机server4上运行起来了:
由于我们做了端口映射,可以直接在浏览器上访问:
以上我们完成了使用gitlab源码进行构建,构建完成之后推送到仓库,然后再次触发另外一个项目----从仓库里把之前推送到仓库的镜像拉下来,然后运行容器测试能不能跑。
以上虽然成功构建了,但是我们依然是先手动触发构建镜像的mytest项目,然后mytest项目构建完成后触发运行mytest构建镜像的项目docker_project。接下来我们完整的来一次从gitlab项目变更主动触发开始。
gitlab项目变更主动触发
此时我们在server3 gitlab主机上变更一下发布文件:
提交更改并推送:
在gitlab上已变更:
它会主动触发jenkins里mytest项目使其再次构建:
在server4上可以看到第五次构建推送过来的镜像:
在harbor仓库中也再次上传了镜像:
但是在jenkins中,负责运行刚刚上传的镜像的docker_project 报错了:
这是由于我们在server4上已经有之前的同名的容器在运行了,此时我们就要更改一下shell命令:
我们再来更改一下gitlab中的index文件:
现在我们直接看jenkins:
构建成功。然后我们再看web页面:
发布页面也已经更改成功。这样就可以实现开发人员更改文件后只需要往gitlab上推送新版本即可,后台jenkins+harbor自动保存镜像和运行容器。
具体的流程为:用户git push推送到gitlab,此时触发jenkins,jenkins开始构建和推送镜像到harbor仓库,此部分是mytest项目,jenkins等待mytest项目稳定构建之后,触发另外一个项目 docker-project,此项目功能是拉取刚刚推送的新镜像并docker run 运行容器。
三、分布式构建CI/CD系统----分离拉取镜像并运行容器任务
在生产环境环境中,我们肯定不可能将所有任务都放到一台jenkins主机上,比如构建推送镜像和拉取镜像并运行容器就应该是两台主机。所以我们再开一台虚拟机server5:
我们准备将交付发布测试即拉取运行容器任务分离出来放在server5上:
3.1 server5环境配置
安装docker引擎
配置私有仓库
DNS解析
3.2 jenkins设置
jenkins上安装插件
添加全局凭证
系统配置(别忘了保存)
进入docker_project 的配置中:
测试:
进入server3 gitlab主机更改推送:
jenkins 两个项目都推送成功:
以上我们就完成了 在jenkins主机上进行镜像构建,在另一台主机server5上进行镜像拉取和运行,降低了jenkins主机的压力。