springboot+jenkins+docker自动化部署

零、构建过程: 本文的自动化构建实现的流程是:
springboot+jenkins+docker自动化部署
文章图片

其中红色部分是本地操作的内容,剩下的都是自动执行的部分。当我们编写完代码、测试、Commit、Push到Github后,会触发Github Hook。Github会给我们设定好的Jenkins地址发一个信号,Jenkins收到信号后会执行Pipeline。本文介绍的内容比较简单,Pipeline不涉及复杂操作,绿色部分是本文中Pipeline执行的内容。首先会从Github仓库获取最新代码,之后编译、测试。测试没有问题就会将编译生成的jar文件和java环境及一些命令打包成一个Docker镜像。最后再运行Docker容器,刷新我们的网站就可以看到网站发生了变化。
本文方法需要服务器有公网IP。可以使用frp将内网IP映射到云主机上得到公网IP。Ubuntu下使用FRP
一、使用docker安装jenkins:

我一开始使用docker安装后面无法使用宿主机的docker构建项目镜像,后面没时间折腾干脆直接装了。跳往 二、Ubuntu安装jenkins:
1. 拉取jenkins镜像
docker pull jenkins/jenkins

2. 为Jenkins建立挂载目录并未目录授权,我这里的目录为 /home/nc/software/jenkins/
mkdir /home/nc/software/jenkins/ sudo chown -R 1000:1000 /home/nc/software/jenkins/

3. 运行镜像
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true -v /home/nc/software/jenkins:/var/jenkins_home jenkins/jenkins

  • -d 表示已守护线程运行,即为后台运行
  • -p 表示docker容器和端口的映射,后面的是容器的端口,前面的是宿主机的端口,
  • -v 表示数据卷的映射,后面是容器内的文件夹地址,前面为宿主机的
    springboot+jenkins+docker自动化部署
    文章图片
4. 浏览器打开http://ip:8080进行初始化 springboot+jenkins+docker自动化部署
文章图片

5. 进入容器的终端,查看初始密码
sudo docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

6. 安装推荐的插件 springboot+jenkins+docker自动化部署
文章图片

安装完成后创建管理员,填写完成提交即可
至此, jenkins已经安装完毕啦
二、Ubuntu安装jenkins:
参考:https://blog.csdn.net/weixin_44623010/article/details/114659049
1. 安装java JDK环境
# 更新软件包列表 sudo apt-get update# 安装openjdk-8-jdk sudo apt-get install openjdk-8-jdk# 查看java版本,看看是否安装成功 java -version

2. 安装jenkins
# 将存储库密钥添加到系统 wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -# 将Debian包存储库地址附加到服务器的sources.list sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/> /etc/apt/sources.list.d/jenkins.list'apt-get update sudo apt-get update# 安装Jenkins sudo apt-get install jenkins

3. 配置并启动Jenkins
# 查看端口是否占用 lsof -i:8080# 启动Jenkins systemctl start jenkins# 稍等一会查看状态 systemctl status jenkins

三、配置项目 编写项目的Dockerfile 在项目的根目录中新建一个文件,名称为Dockerfile ,填入以下内容:
FROM openjdk:8-jdk-alpine MAINTAINER nicahead@gmail.com ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && mkdir -p /event WORKDIR /event EXPOSE 9001 ADD ./target/event-api-0.0.1-SNAPSHOT.jar ./ CMD java -Djava.security.egd=file:/dev/./urandom -jar event-api-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

我这里的项目名称叫做event-api,Dockerfile 需要根据自己情况编写
四、上传项目到远程仓库
  • 可以选择上传到GitHub或gitee,最近GitHub老是打不开,所以我选择gitee。
  • 注意需要去插件管理里安装gitee插件,否则下面步骤中的某些选项会不存在。
五、创建任务 1. 创建一个自由风格的项目 springboot+jenkins+docker自动化部署
文章图片

springboot+jenkins+docker自动化部署
文章图片

2. 在源码管理中选择git配置好远程仓库地址和密码
  • 【springboot+jenkins+docker自动化部署】我们本地是会从远程仓库拉取代码进行构建的,所以需要告诉Jenkins远程仓库在哪。如果是public的仓库好像不用写用户名密码。
    springboot+jenkins+docker自动化部署
    文章图片

  • 这里的Repository URL可以使用http的,也可以使用ssh的,我这里使用的HTTP协议的。
    springboot+jenkins+docker自动化部署
    文章图片

  • HTTP协议的话,需要输入账号密码来验证,点击Add,输入的账号密码并保存,记得kind选择“Username with password”。ssh的要配置ssh公钥。
    springboot+jenkins+docker自动化部署
    文章图片

  • 然后在Credentials选中刚刚新增的账号密码,红色提示消失;
3. 构建触发器
  • 选择使用gitee webhook触发构建。我们前面将Jenkins与远程仓库建立了单向连接,Jenkins可以访问远程仓库。但是什么时候构建项目呢?触发器的作用是,当我们提交代码到远程仓库,触发了钩子函数,远程仓库则通知Jenkins,代码有更新,你需要拉取代码,重新构建。这样才实现自动部署。
URL:
springboot+jenkins+docker自动化部署
文章图片

生成密码:
springboot+jenkins+docker自动化部署
文章图片

  • 然后到gitee的设置里配置一下:
    URL和密码和上面对应
    springboot+jenkins+docker自动化部署
    文章图片
  • 可以测试一下:
    springboot+jenkins+docker自动化部署
    文章图片
4. 回到Jenkins的配置,增加构建步骤。
  • 这一步是告诉Jenkins,代码拉取下来之后如何构建。打包?docker容器?tomcat容器?
  • 本文使用maven打成jar包部署。首先增加一个maven打包的步骤:
  • 这里的maven需要在管理Jenkins->global tool configuration里新增,不要选默认。应该也可以使用本机安装的maven。
    springboot+jenkins+docker自动化部署
    文章图片
  • clean以及package:
    springboot+jenkins+docker自动化部署
    文章图片
  • 打包完成后需要构建镜像,运行容器,可以通过shell脚本运行:根据我们三中的dockerfile文件构建镜像,并运行容器。具体流程是 判断容器是否存在,存在先停止容器-> 删除容器 -> 删除镜像 -> 构建镜像 -> 启动容器
参考:https://blog.csdn.net/keizhige/article/details/105819856
#源jar路径即jenkins构建后存放的路径 SOURCE_PATH=/var/lib/jenkins/workspace/EventKG #docker 镜像/容器名字或者jar名字 这里都命名为这个 SERVER_NAME=event-api TAG=1.0 #宿主机端口 SERVER_PORT=9004 # 容器端口 CONTAINER_PORT=9001 #容器id CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}') #镜像id IID=$(docker images | grep "$SERVER_NAME:$TAG" | awk '{print $3}') if [ -n "$CID" ]; then echo "存在容器$SERVER_NAME, CID-$CID" docker stop $SERVER_NAME docker rm $SERVER_NAME fi # 构建docker镜像 if [ -n "$IID" ]; then echo "存在$SERVER_NAME:$TAG镜像,IID=$IID" docker rmi $SERVER_NAME:$TAG else echo "不存在$SERVER_NAME:$TAG镜像,开始构建镜像" cd $SOURCE_PATH docker build -t $SERVER_NAME:$TAG . fi # 运行docker容器 docker run --name $SERVER_NAME -d -p $SERVER_PORT:$CONTAINER_PORT $SERVER_NAME:$TAG echo "$SERVER_NAME容器创建完成"

  • 这个时候执行宿主机的docker时会出现permission denied的情况。需要将jenkins加入docker用户组。
usermod -a -G docker jenkinssystemctl restart jenkins

  • 仅仅将jenkins用户加入docker组还不够,必须要重启Jenkins才可以生效!
  • 保存一下,再点击立即构建。没有问题的话应该可以成功构建并且访问http:///可以看到项目页面。
    springboot+jenkins+docker自动化部署
    文章图片

    推荐阅读