基于docker部署的jenkins+maven自动化构建部署springboot项目实践

自动化构建部署思路

如下图

  1. 本地代码git提交到github
  2. jenkins程序(192.168.1.93) 检查到代码更新,自动构建编译spingboot项目生成war,并将war包通过ssh传到服务器(这里没多余的机器,还是用192.168.1.93)进行部署
  3. 利用写好的Docker和构建脚本,生成新的docker镜像并push到dockerhub官方镜像仓库(大家也可以自己搭建本地镜像仓库或者使用过阿里云镜像仓库)
  4. 生成镜像后,构建脚本里会直接run这个新的docker容器,项目部署成功,可通过127.0.0.1:8181进行访问。
    基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第1张图片

一、环境说明

  • 本地电脑

    • eclipse Version: Mars.1 Release (4.5.1)
    • maven3.5.0
    • JDK 1.8.0_65
    • git(eclipse自带)
  • 虚拟机centos7

    • docker 1.12.6 (docke 1.13之后才能用docker system prune命令)
    • jenkins (jenkins插件Maven Integration plugin,Publish Over SSH,工具安装JDK,Maven)
  • 代码仓库

    • github(去官网注册用户,建一个私有private repository仓库)
  • 镜像仓库

    • dockerhub(去官网注册用户,建一个私有private repository 仓库,只能创建一个免费仓库)

二、安装jenkins

centos之前已经安装了docker,不再赘述。
本次使用docker安装jenkins,安装jenkins有多种,yum,war包部署,自己选择,如果是docker部署jenkins,建议jenkins需要的插件如在jenkins安装即可。

1.配置docker加速

加快docker镜像下载速度

[root@localhost ~]# vi /etc/docker/daemon.json 
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker 
[root@localhost ~]# more /etc/docker/daemon.json 
{"registry-mirrors":["https://dockerhub.azk8s.cn",
    	"https://reg-mirror.qiniu.com",
	"https://registry.docker-cn.com"]}

2.安装jenkins(失败例子)

一条命令安装并运行jenkins

[root@localhost ~]# docker run -d --name myjenkins -p 8080:8080 -p 50000:50000 -v /root/jenkins:/var/jenkins_home -v /etc/localtime:/etc/localtime -u 0 Jenkins

-u 0 是以root帐号覆盖容器的jenkins用户帐号,要不然-v映射卷的时候会报权限不足
docker 启动后就可以访问jenkins了 ,http://127.0.0.1:8080
管理用户密码容器启动的时候也有提示用命令docker logs -f myjenkins 查看启动日志,
或者到容器里面more /var/jenkins_home/secrets/initialAdminPassword
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第2张图片
安装默认插件
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第3张图片
总是失败,docker logs -f myjenkins 看日志有很多报错

aused by: java.io.IOException: Failed to install token-macro plugin
	at hudson.PluginManager.dynamicLoad(PluginManager.java:874)
	at hudson.PluginManager.dynamicLoad(PluginManager.java:813)
	at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:1889)
	... 5 more
Caused by: java.io.IOException: Token Macro Plugin v2.12 failed to load.
 - You must update Jenkins from v2.60.3 to v2.121.3 or later to run this plugin.
 - Pipeline: Step API v2.22 failed to load. Fix this plugin first.
	at hudson.PluginWrapper.resolvePluginDependencies(PluginWrapper.java:626)
	at hudson.PluginManager.dynamicLoad(PluginManager.java:864)
	... 7 more
Mar 16, 2020 6:49:13 AM hudson.model.UpdateCenter$DownloadJob run
INFO: Starting the installation of bouncycastle API on behalf of admin
Mar 16, 2020 6:49:16 AM hudson.model.UpdateCenter$UpdateCenterConfiguration download
INFO: Downloading bouncycastle API

日志有很多报错,是因为镜像版本不对,jenkins镜像已经被丢弃,有用的是jenkins:Jenkins:lts

3 安装jenkins(成功例子)

[root@localhost ~]# docker run -d --name myjenkins -p 8080:8080 -p 50000:50000 -v /root/jenkins:/var/jenkins_home -v /etc/localtime:/etc/localtime -u 0 jenkins/Jenkins:lts

配置安装插件加速,要不太慢了。
这时候容器起来,本地磁盘挂载的目录/root/jenkins/updates就有数据了

[root@localhost updates]# pwd
/root/jenkins/updates
[root@localhost updates]# ls
default.json      hudson.tasks.Maven.MavenInstaller
default.json.bak  hudson.tools.JDKInstaller

vim default.json文件,在命令模式下使用下面2个地址改成清华大学插件加速网址和百度地址,执行后:wq退出

[root@localhost updates]# vim default.json
:1,$s/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g
:1,$s/http:\/\/www.google.com/https:\/\/www.baidu.com/g

改成百度地址的原因是jenkins会去探测这个地址,国内谷歌目前不可访问,会出现下面离线的提示
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第4张图片
再看容器日志有超时报错

2020-03-16 07:30:21.230+0000 [id=25]	WARNING	hudson.model.UpdateCenter#updateDefaultSite: Upgrading Jenkins. Failed to update the default Update Site 'default'. Plugin upgrades may fail.
java.net.SocketTimeoutException: connect timed out

打开http://localhost:8080/pluginManager/advanced
将https改成http,
http://updates.jenkins.io/update-center.json

基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第5张图片
/etc/resolv.conf加入nameserver 8.8.8.8
再重启下jenkins

[root@localhost jenkins]# docker restart myjenkins
myjenkins

再访问http://127.0.0.1:8080
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第6张图片
快了N多。之前几次几个小时没下载完的,十几分钟就下载完了
有失败的,刷新下再重试

基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第7张图片
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第8张图片
我这里没创建其他用户了,用默认admin,密码到容器里面more /var/jenkins_home/secrets/initialAdminPassword
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第9张图片
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第10张图片
插件有可能未完全生效,再重启下jenkins

[root@localhost secrets]# docker restart myjenkins
Myjenkins

4.安装jenkins插件

  1. Maven Integration plugin (新建job的时候,有“构建一个maven项目”可以选择)
  2. Publish Over SSH (远程ssh到服务器并执行shell命令)
  3. 全局工具配置jdk,maven

4.1 安装Maven Integration plugin

在系统管理->插件管理搜索不到Maven Integration plugin
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第11张图片

直接到
http://updates.jenkins-ci.org/download/plugins/maven-plugin/下载
然后在插件管理->高级里上传安装.基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第12张图片
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第13张图片
这时候新建Job任务就有"构建一个maven项目"选项了
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第14张图片

4.2 安装Publish Over SSH

可选插件搜索下载安装即可
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第15张图片
然后到系统管理-》系统设置,配置ssh远程登录信息
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第16张图片

4.3 全局工具配置jdk,maven

基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第17张图片
选择自己的JDK版本,需要oracle官网帐号密码才能下载安装
ps:如果不小心输错了,那么在jenkins可视化界面中无法修改账号和密码,需要在jenkins的根目录下将对应的hudson.tools.JDKInstaller.xml配置文件删除。里面有orcale的账号和密码,删除这个配置文件之后,再次在页面上配置,文件会重新生成。我就遇这坑了

[root@localhost jenkins]# cd /root/jenkins
[root@localhost jenkins]# rm -rf hudson.tools.JDKInstaller.xml
hudson.tools.JDKInstaller.xml
[root@localhost jenkins]# docker restart myjenkins

基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第18张图片

往下maven。我使用maven3.5.0 版本
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第19张图片

三. jenkins构建自动化

基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第20张图片
插件有可能未完全生效,再重启下jenkins

[root@localhost secrets]# docker restart myjenkins
Myjenkins

基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第21张图片
接着填写描述,
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第22张图片
git地址,用户密码
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第23张图片
选择需要构建的分支
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第24张图片
构建触发器,选了2种,一种是让git使用hook的方式访问一个jenkins的url进行触发。这里url后缀是自己写,生成新的url,另一种轮训SCM是定时检查代码是否有变化,有变化则触发构建,值为5个*,分别表示分钟(0-59),小时(0-23),天(1-31),月份(1-12),周(0-7),其中H表示随机,H/5表示每5分钟检查一次
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第25张图片
Pre Steps:构建前的操作,可以增加执行shell,配置脚本echo “Pre Steps脚本启动成功”,此内容会在构建控制台中打印出来
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第26张图片

Build:Root POM配置pom.xml(要构建的工程必须是maven,有pom文件),Goals and options配置clean package(也就是mvn的构建命令)

基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第27张图片
Post Steps:构建完成后的操作,可以增加执行shell,配置脚本echo “Post Steps脚本启动成功${WORKSPACE}”,${WORKSPACE}为jenkins的环境变量。上方的3个单选项分别代表构建成功后执行、构建成功或不稳定执行、总是执行
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第28张图片
构建设置可以设置构建完成后email通知,我就不设置了
构建后操作->增加构建后操作步骤,选择Set Build artifacts over SSH

基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第29张图片
选择好ssh登录的centos服务器,指定进去后的目录,和要执行的shell命令
shell命令:

/root/docker-servermanager.sh "`pwd`/docker/servermanager" $BUILD_NUMBER

shell里的docker-servermanager.sh和Dockerfile我已经放在服务器/root目录上了
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第30张图片
Dockerfile

[root@localhost ~]# more /root/Dockerfile 
#基础镜像,请选择符合自己项目的镜像,我之前用的tomcat:7.0.86镜像一直不成功,因为Tomcat:7.0.86镜像里面的JDK版本不是1.8
FROM tomcat:jdk8-openjdk

#作者
LABEL maintainer="test"

#TOMCAT环境变量
ENV CATALINA_BASE:   /usr/local/tomcat \
    CATALINA_HOME:   /usr/local/tomcat \
    CATALINA_TMPDIR: /usr/local/tomcat/temp \
    JRE_HOME:        /usr
#删除原来的默认模板tomcat页面
RUN rm -rf ${CATALINA_HOME}/webapps/*
#将服务器当前目录也就是ssh的默认目录/root/docker/servermanager下的target/servermanager-0.0.1-SNAPSHOT.war 复制到容器tomcat程序webapps下并改名ROOT.war,这样服务起来后访问就可以直接http://127.0.0.1:端口号/listServer,而不是还要加servermanager-0.0.1-SNAPSHOT路径http://127.0.0.1:端口号/servermanager-0.0.1-SNAPSHOT/listServer
COPY target/servermanager-0.0.1-SNAPSHOT.war ${CATALINA_HOME}/webapps/ROOT.war
#暴露端口,此镜像tomcat里server.xml默认配置是8080,所以暴露端口也用8080,镜像端口没事,docker run的时候-p 8181:8080映射到外面是自己定
EXPOSE 8080
#启动命令,CMD命令和ENTRYPONT都可以执行命令,且多条也只执行最后一条,区别是CMD命令是默认执行的命令,因此可以被docker run或者ENTRYPOINT覆盖,具体区别可以看https://blog.csdn.net/shunfa888/article/details/79373840
CMD ["catalina.sh","run"]

docker-servermanager.sh 此脚本作用是用Dockfile构建镜像,push镜像到镜像仓库,并启动容器

[root@localhost ~]# pwd
/root
[root@localhost ~]# more docker-servermanager.sh 

#!/bin/bash
echo "当前位置:"`pwd`
echo "当前用户:"`whoami`
# 定义变量
WORKHOME=$1
BUILD_NUMBER=$2
API_NAME="servermanager"
API_VERSION="1.0"
API_PORT=8181
DOCKER_REGISTRY="docker.io/你自己的镜像仓库名/"
#镜像名由servermanager:jenkins的构建号组成
IMAGE_NAME="$API_NAME:$BUILD_NUMBER"
#容器名由servermanager:1.0组成
CONTAINER_NAME=$API_NAME-$API_VERSION
# 还记得上面jenkins配置/root/docker-servermanager.sh "`pwd`/docker/servermanager" $BUILD_NUMBER,$WORKHOME就是当前目录/root/docker/servermanager,复制Dockerfile 文件到此目录
echo $WORKHOME
cd $WORKHOME
cp /root/Dockerfile .
#构建docker 镜像
docker build -t $IMAGE_NAME .
#打标签以便上传到对应的镜像仓库
docker tag $IMAGE_NAME docker.io/你自己的镜像仓库名/$IMAGE_NAME
#因为我是用private仓库,需要登录docker镜像仓库
docker login -u 用户 -p 密码 docker.io
#推送镜像到镜像仓库
docker push $DOCKER_REGISTRY$IMAGE_NAME
#删除同名docker容器,避免之前启动的旧容器冲突
cid=$(docker ps -a| grep "$CONTAINER_NAME" | awk '{print $1}')
if [ "$cid" != "" ]; then
   docker rm -f $cid
fi

#启动docker 容器
docker run -d -p $API_PORT:8080 --name $CONTAINER_NAME $IMAGE_NAME


给两个文件执行权限

[root@localhost ~]# chmod +x docker-servermanager.sh
[root@localhost ~]# chmod +x Dockerfile

五.jenkins自动构建并验证

如果在jenkins构建有遇到报错Error fetching remote repo ‘origin’,因为我之前有尝试构建,有旧的文件在,清除工作空间即可

基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第31张图片
目前是第21次构建,第21次是成功的,容器服务也起来了
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第32张图片

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                              NAMES
a9034b5837ba        servermanager:22      "catalina.sh run"        41 hours ago        Up 41 hours         0.0.0.0:8181->8080/tcp                             servermanager-1.0

访问成功,此时准备代码修改下列名“业务程序目录”,加上test,验证jenkins是否会按设置的每5分钟hook到git代码更新触发自动构建。
ps:如果页面没有load到数据,请查看下防火墙或者mysql有无开启远程登录,mysql是本机部署192.168.1.195,虚拟机192.168.1.93上的docker tomcat服务要访问

UPDATE `user` set host='192.168.1.93' where `user`='root';
flush PRIVILEGES;

基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第33张图片
本地电脑代码提交git
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第34张图片

可以看到已经自动在构建了
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第35张图片
等jenkins构建成功后,稍等一两分钟等容器服务起来,再访问http://127.0.0.1:8181看下效果,实践成功。
基于docker部署的jenkins+maven自动化构建部署springboot项目实践_第36张图片
参考资料:
特别感谢CSDN博主「天生我才毕有用」的原创文章https://blog.csdn.net/njzcx/article/details/80979157

你可能感兴趣的:(devops)