在项目上线时,你是否还在手动打包上传服务器,执行命令进行部署项目呢?这种方式一旦操作失误,就会降低线上环境的可靠性。今天给大家分享一下如何基于 Jenkins + Docker 从 GIT 上自动获取代码进行自动化构建部署 SpringBoot 项目。
Jenkins是一个开源的自动化服务器,由Java编写,主要用于持续集成(CI)和持续交付/部署(CD)的自动化工作流。它通过插件生态系统扩展功能,支持与各种工具集成,如版本控制系统(Git、SVN)、构建工具(Maven、Gradle)、测试框架(JUnit、TestNG)和部署工具(Docker、Kubernetes)等。Jenkins旨在通过自动化构建、测试和部署流程,提高开发效率,减少人为错误,缩短交付周期。
这里采用 Docker 的形式来安装,拉取镜像的命令如下:
shdocker pull jenkins/jenkins:lts
镜像拉取完成后,创建容器运行,其默认端口是8080,容易与其他端口冲突,所以映射为 8880
shdocker run -p 8880:8080 -p 5000:5000 --name jenkins \ -u root \ -v /opt/docker/jenkins:/var/jenkins_home \ -d jenkins/jenkins:lts
到此 jenkins 容器已启动完成
接下来我们将访问 Jenkins 界面,访问地址是 http://IP:8880/ ,初次登录需要输入管理员密码才可以使用
通过 docker logs jenkins
查看启动日志,密码会在控制台输出
当密码验证成功后,跳转到插件安装的页面,这里选择 安装推荐的插件
创建第一个管理员账户
点击右上角的系统管理,选择插件管理,开始进行插件的安装
安装 Publish Over SSH
插件,用于访问远程主机并执行命令。
找到 系统管理 -> 系统配置
找到 SSH Servers 部分,填写要部署连接的服务器信息,需要注意的是必须装上 Publish Over SSH
插件才会有此功能项
点击高级,勾选上 Use password authentication, or use a different key
后,配置服务器的密码,配置完成后,点击下方 Test Configuration
测试连接是否成功
找到 系统管理 -> 全局工具配置
首先配置 Maven,滑动到最下方,找到 Maven 安装,新增 Maven,填写个名字,点击保存
到这 Jenkins 就算配置完成了,接下来我们看下如何自动化部署 SpringBoot 项目。
在项目的根目录下,创建 docker 文件夹,编写 Dockerfile,内容如下,根据实际服务配置编写即可
shFROM openjdk:17-jdk
RUN rm -rf /etc/localtime &&\
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
echo "Asia/Shanghai" > /etc/timezone
COPY *.jar /data/
EXPOSE 9527
WORKDIR /data
ENV JAVA_OPTS="-Xms128m -Xmx128m"
ENV JAR_PATH="/data"
ENV EXAM_ENV="prod"
ENV LOGGING_PATH="/data/logs"
ENTRYPOINT java ${JAVA_OPTS} \
-Dlogging.path=${LOGGING_PATH} \
-DSpring.profiles.active=${EXAM_ENV} \
-Dfile.encoding=UTF-8 \
-XX:NativeMemoryTracking=detail \
-jar ${JAR_PATH}/*.jar
接下来我们通过 Jenkins 来创建任务实现 SpringBoot 项目的自动化部署,回到首页,点击新建任务
填写任务的名称,一般就是服务名称,选择 构建一个自由风格的软件项目
,点击确定
通过选项参数,可以让脚本动态获取到选项参数的值,让脚本变得更加通用,此处配置2个选项参数
紧接着在源码管理中,配置 Git 仓库地址,注意仓库地址必须是公共的
点击 Build Steps
-> 增加构建步骤
-> 调用顶层 Maven 目标
选择之前配置的 Maven 3.9.11
,添加目标也就是构建命令 clean install
,点击高级,配置上 POM 文件目录 ${workspace}/pom.xml
再次添加构建步骤,目标 clean package
,POM 目录为 ${WORKSPACE}/pom.xml
,点击 Save 保存
注意
此处我得目录结构为
echo-im 即为根目录,是pom类型,当执行 clean install
时,其子模块会自动构建,需要根据实际目录地址选择 pom.xml 文件
此处选择之前插件中配置的服务器别名,点击高级,勾选 Verbose output in console
,构建开始后会在控制台输出详细的日志
接下来开始添加需要上传的文件
此处选择根目录下 docker/Dockerfile 文件进行上传,在 build 时会用到
注意
此处的项目路径是内置 Mavan 编译路径,实际为 /var/jenkins_home/workspace/echo-im
,可通过相对路径获取 echo-im 项目下的编译内容
配置要上传的jar包,同时也要去除下路径前缀,只保留jar包上传即可
动态的执行脚本如下,根据不同的项目路径会自动进行构建运行,还有一种方式可以将脚本放到 docker 目录下,例如是 run.sh ,与 Dockerfile 一起上传,当上传jar包后执行 sh run.sh
sh#!/bin/bash
echo "=================================================================="
echo " 开始部署流程"
echo "=================================================================="
echo "当前时间: $(date)"
echo "部署名称: ${var_project_name}"
#获得变量
var_images_id=`docker images|grep -i ${var_project_name}|awk '{print $3}'`
var_ps_id=`docker ps -a|grep -i ${var_project_name}|awk '{print $1}'`
echo "${var_project_name} docker images ID:${var_images_id}"
echo "${var_project_name} docker ps ID:${var_ps_id}"
#结束镜像任务
if [ -n "$var_ps_id" ]; then
docker rm -f ${var_ps_id}
echo "结束镜像:${var_project_name},ID:${var_images_id}"
fi
#删除历史镜像
if [ -n "$var_images_id" ]; then
docker rmi -f ${var_images_id}
echo "删除镜像:${var_project_name} ID:${var_images_id}"
fi
#切换工作目录
cd /${var_app_docker_path}/${var_project_name}
echo "当前目录:$(cd "$(dirname "$0")";pwd)"
# 添加权限
chmod 721 Dockerfile
echo "Dockerfile 添加权限"
#开始构件镜像
docker build -t ${var_project_name} .
echo "构建镜像:${var_project_name}"
#执行镜像
docker run -it -d -p 9527:9527 -p 8101:8101 --name ${var_project_name} --link redis:7.2.4 -e TZ="Asia/Shanghai" -v /opt/docker/${var_project_name}/logs:/data/logs -v /opt/docker/nginx/html:/data/upload ${var_project_name}
echo "${var_project_name} is running!"
echo "=================================================================="
echo " 部署流程结束"
echo "=================================================================="
到此,任务构建的准备工作就完成了,服务中的整体效果如下
开始构建,确认填写的选项参数,点击 build
查看控制台输出,如果运行的过程中存在问题根据控制台的输出信息进行调试即可
本文作者:柳始恭
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!