本环境非常简单,主要实现如下流程功能
员工通过eclipse提交java代码———gitlab更新代码————jenkins通过maven编译打包————生成war包————制作docker镜像并上传到私有仓库————web服务器下载镜像————运行容器对外服务
部分说明:
- jenkins服务器上已经安装了maven,并已配置。
- jenkins服务器上安装docker服务。(打包镜像,并上传至私有仓库)
- 提前构建本地gitlab服务器,并上传项目代码,配置用户认证。
- 需要提前创建本地的私有仓库,走公网仓库会非常慢。
- 若jenkins任务不多,可以在jenkins本机上进行docker镜像的制作打包并上传,配置比较简单。若jenkins任务很多,建议单独配置一台docker镜像打包服务器。
- web服务器需要提前配置进jenkins里。
1.jenkins里MAVEN的配置(JDK及MAVEN路径配置,具体可以看我之前的文章)
2.jenkins里新增web服务器(SSH Servers)
3.docker私有仓库的配置(具体可以看我前面的文章)
4.在jenkins中新增maven任务
1)新建任务
2)指定git项目地址以及认证用户,指定分支
3)构建环境配置,maven的选项根据自己情况来填
4)增加post-step,本案例比较简单,通过shell脚本实现
建议在本地服务器上新建一个目录(/app/dockerfile),脚本里把war拷贝过去,并在目录下建DOCKERFILE文件,进行docker build。不要直接在jenkins的workspace里进行docker build,每次重新构建会被清空。当然也可以把dockerfile放在gitlab,build的时候用链接来调用。
shell脚本具体说明如下
cd /app/dockerfile #重新选择jenkins服务器上的某一个目录,DOCKERFILE放到此目录下 echo `目录已变更` rm -rf bbs-5.7.war #删除原有的war包 cp /var/lib/jenkins/workspace/maven_t3_docker_image_from_registry/target/bbs-5.7.war ./ #将jenkins workspace下生成的新war包,拷贝到/app/dockerfile下 echo "war包拷贝完成" docker rmi 192.168.1.145:5000/cuanon-tomcat:VW # 删除现有的docker镜像 echo "删除现有镜像" docker build -t 192.168.1.145:5000/cuanon-tomcat:VW . #docker build生成新的镜像 echo "编译完成" docker push 192.168.1.145:5000/cuanon-tomcat:VW #上传到本地私有仓库 echo "推送私有仓库完成"
DOCKERFILE也比较简单,利用现成的tomcat镜像,只是把war包拷贝进来。
[root@jenkins01 dockerfile]# pwd /app/dockerfile [root@jenkins01 dockerfile]# cat Dockerfile FROM 192.168.1.145:5000/cuanon-tomcat:V1.1 #现有的tomcat 镜像 copy bbs-5.7.war /usr/local/tomcat/webapps #将当前目录下war包拷贝到镜像内 [root@jenkins01 dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.1.145:5000/cuanon-tomcat VW cd5aa4030708 38 hours ago 314MB 192.168.1.145:5000/cuanon-tomcatb6b095f3fa24 38 hours ago 314MB 192.168.1.145:5000/cuanon-tomcat 818682237ede 38 hours ago 314MB 192.168.1.145:5000/cuanon-tomcat d9725673ec38 38 hours ago 314MB 192.168.1.145:5000/cuanon-tomcat V1.1 c4d75b3cb23c 2 weeks ago 223MB registry latest 2e200967d166 4 weeks ago 24.2MB
5.增加“构建后操作”
指定对应的web服务器,在脚本执行中增加如下脚本,删除容器及镜像,拉取最新的镜像并运行。
shell脚本说明如下
docker rm -f cuanon-bbs-vw && #删除服务器上正在运行的web容器 echo "删除容器完成" docker rmi 192.168.1.145:5000/cuanon-tomcat:VW && #删除原先的镜像,也可以不删除,拉取的时候会自动覆盖。 echo "删除image完成" docker pull 192.168.1.145:5000/cuanon-tomcat:VW && #从私有仓库拉取最新的镜像 echo "下载image完成" docker run -d -p 1111:8080 --name cuanon-bbs-vw 192.168.1.145:5000/cuanon-tomcat:VW #启动新的容器 echo "启动容器完成"
6.构建任务
运行成功会有如下输出
Waiting for Jenkins to finish collecting data [JENKINS] Archiving /var/lib/jenkins/workspace/maven_t3_docker_image_from_registry/pom.xml to bbs/bbs/5.7/bbs-5.7.pom [JENKINS] Archiving /var/lib/jenkins/workspace/maven_t3_docker_image_from_registry/target/bbs-5.7.war to bbs/bbs/5.7/bbs-5.7.war [maven_t3_docker_image_from_registry] $ /bin/sh -xe /tmp/jenkins8778853077367120664.sh + cd /app/dockerfile ++ 目录已变更 /tmp/jenkins8778853077367120664.sh: line 3: 目录已变更: command not found channel stopped + echo + rm -rf bbs-5.7.war + cp /var/lib/jenkins/workspace/maven_t3_docker_image_from_registry/target/bbs-5.7.war ./ + echo war包拷贝完成 war包拷贝完成 + docker rmi 192.168.1.145:5000/cuanon-tomcat:VW Untagged: 192.168.1.145:5000/cuanon-tomcat:VW Untagged: 192.168.1.145:5000/cuanon-tomcat@sha256:af67f949994f4d0f573401ae51e4c3ceb06ee94faa46de0b92f78e5c597f6d8b Deleted: sha256:cd5aa4030708d377615a9df8237573fd3ab73ee2172af35f7f737b833eb58fc7 Deleted: sha256:e8e141c364c979db3071ef82961051ec2a02a015d9610b88b7430843c0e29899 + echo 删除现有镜像 删除现有镜像 + docker build -t 192.168.1.145:5000/cuanon-tomcat:VW . Sending build context to Docker daemon 90.39MB Step 1/2 : FROM 192.168.1.145:5000/cuanon-tomcat:V1.1 ---> c4d75b3cb23c Step 2/2 : copy bbs-5.7.war /usr/local/tomcat/webapps ---> 594e976939f6 Successfully built 594e976939f6 Successfully tagged 192.168.1.145:5000/cuanon-tomcat:VW + echo 编译完成 编译完成 + docker push 192.168.1.145:5000/cuanon-tomcat:VW The push refers to repository [192.168.1.145:5000/cuanon-tomcat] e0eede822835: Preparing dff3d8fca213: Preparing adfe581a0f2f: Preparing 2d83a4506e1a: Preparing f8019f2af4d9: Preparing d5a59477c4bd: Preparing 0d17b0f92d87: Preparing b4cbb328f729: Preparing 366ad773e9a4: Preparing 963ed4f795e4: Preparing 55004fc58b84: Preparing 09634cbb6441: Preparing 8b15606a9e3e: Preparing b4cbb328f729: Waiting 366ad773e9a4: Waiting 963ed4f795e4: Waiting 55004fc58b84: Waiting 09634cbb6441: Waiting 8b15606a9e3e: Waiting d5a59477c4bd: Waiting 0d17b0f92d87: Waiting f8019f2af4d9: Layer already exists adfe581a0f2f: Layer already exists dff3d8fca213: Layer already exists 2d83a4506e1a: Layer already exists 0d17b0f92d87: Layer already exists d5a59477c4bd: Layer already exists 366ad773e9a4: Layer already exists 963ed4f795e4: Layer already exists b4cbb328f729: Layer already exists 09634cbb6441: Layer already exists 55004fc58b84: Layer already exists 8b15606a9e3e: Layer already exists e0eede822835: Pushed VW: digest: sha256:457271f6fb730a99e4dd2de846fef26dacbd0cd96dc23d1fea0d3b32eee86107 size: 3038 + echo 推送私有仓库完成 推送私有仓库完成 SSH: Connecting from host [jenkins01] SSH: Connecting with configuration [dockerserver01] ... SSH: EXEC: completed after 13,210 ms SSH: Disconnecting configuration [dockerserver01] ... SSH: Transferred 0 file(s) Finished: SUCCESS
7.查看服务器端的docker运行情况
会看到新的容器产生,验证下网页访问即可。
[root@dockerserver01 target]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5480f2a1ae88 192.168.1.145:5000/cuanon-tomcat:VW "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:1111->8080/tcp, :::1111->8080/tcp cuanon-bbs-vw bfd3e5ae3de8 cuanon-bbs:v1 "catalina.sh run" 40 hours ago Up 40 hours 0.0.0.0:7777->8080/tcp, :::7777->8080/tcp cuanon-bbs-web ba8d943788cc bingozhou/mysql5.7 "docker-entrypoint.s…" 2 weeks ago Up 5 days 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql-docker5.7 75b764fe892f tomcat:8.0.53-jre8-slim "catalina.sh run" 2 weeks ago Up 5 days 0.0.0.0:9999->8080/tcp, :::9999->8080/tcp tomcat-java8-bbs



