博主介绍:Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。
🍅文末获取源码下载地址🍅
👇🏻 精彩专栏推荐订阅👇🏻 欢迎点赞收藏评论拍砖........
【Docker Swarm总结】《容器技术 Docker+K8S专栏》✅
【uniapp+uinicloud多用户社区博客实战项目】《完整开发文档-从零到完整项目》✅
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】《系列教程-更新完毕》✅
【SpringSecurity-从入门到精通】《学习完整笔记-附(完整demo源码)》✅
【从零开始Vue项目中使用MapboxGL开发三维地图教程】《系列教程-不定时更新》✅
感兴趣的可以先收藏起来相关问题都可以给我留言咨询,希望帮助更多的人。
一、前提
本地虚拟机上安装了centos7,在centos7上安装了docker、docker-compose、jenkins等镜像。安装过程可参考我以前写的文章:CSDN
二、jenkins自动部署vue前端项目
2.1 jenkins上安装nodejs插件
在jenkins具备Publish Over SSH的基础上,在jenkins上安装nodejs插件
安装成功后的效果:
2.2 全局工具配置实现nodejs配置
点击nodeJs安装--新增NodeJS
可实现配置多个。
nodejs配置完成,下边就可以去开始搭建vue前端项目一键部署了。
2.3 新建任务
2.4 任务配置
General配置
git参数构建:
源码管理配置
构建环境配置
构建步骤中提供2个配置
- 执行shell
- Send files or execute commands over SSH
#!/bin/bash echo $PATH # 查看版本信息 node -V npm -v rm -rf node modules rm -rf dist npm cache clear --force # jenkins 拉取代码存放地址在/var/jenkins home/workspace/j-vue3 echo“拉取代码存放地址” pwd # 将代码 # 将像源替换为淘宝的加速访问 npm install -g cnpm --registry=https://registry.npm.taobao.org # 查看配置: # npm config list # 安装项目依赖 cnpm install # 项目打包 echo "开始vue编译打包" cnpm run build:dev echo "结束vue编译打包" # 进入打包目录 # cd dist # rm -rf *,tar.gz # tar -zcvf dist,tar.gz * # cd ../ echo "构建结束"
2.5 打包完成
以上为本地实践配置,亲测有效。
三、jenkins自动部署springboot后端项目
docker中安装mysql、redis、jdk的详细教程请参考我的文章:
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)-CSDN博客
3.1 构建一个maven项目
3.2 General配置
实现参数化构建过程
3.3 源码管理
3. 4 Build构建
clean package -Dmaven.test.skip=true
3.5 Post Steps
只在构建成功时才运行。
3.6 构建后操作
本地的目录如下:
其中主要子目录:
backup:是在本次部署时,将原有的部署文件备份的位置
build:如上方截图,将从gitee上拉取的代码编译后的jar文件放置的位置
shell:放置.sh脚本的位置
nohup.out:运行日志文件
最后一个标红的jar文件:是本次部署运行的jar文件,是通过脚本从build中获取的
3.7 脚本参考
#!/bin/bash set -e # 基础 export JAVA_HOME=/home/java/jdk1.8.0_361 export PATH=PATH=$PATH:$JAVA_HOME/bin # export CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar DATE=$(date +%Y%m%d%H%M) # 基础路径 BASE_PATH=/home/work/projects/ydemo-server # 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下 SOURCE_PATH=$BASE_PATH/build # 服务名称。同时约定部署服务的 jar 包名字也为它。 SERVER_NAME=ydemo-server # 环境 PROFILES_ACTIVE=local # 健康检查 URL # HEALTH_CHECK_URL=http://127.0.0.1:8078/actuator/health/ # heapError 存放路径 HEAP_ERROR_PATH=$BASE_PATH/heapError # JVM 参数 JAVA_OPS="-Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH" # JavaAgent 参数。可用于配置 SkyWalking 等链路追踪 JAVA_AGENT= # 备份 function backup() { # 如果不存在,则无需备份 if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then echo "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份" # 如果存在,则备份到 backup 目录下,使用时间作为后缀 else echo "[backup] 开始备份 $SERVER_NAME ..." cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar echo "[backup] 备份 $SERVER_NAME 完成" fi } # 最新构建代码 移动到项目环境 function transfer() { echo "[transfer] 开始转移 $SERVER_NAME.jar" # 删除原 jar 包 if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then echo "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除" else echo "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成" rm $BASE_PATH/$SERVER_NAME.jar fi # 复制新 jar 包 echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...." cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATH echo "[transfer] 转移 $SERVER_NAME.jar 完成" } # 停止 function stop() { echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME" PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}') # 如果 Java 服务启动中,则进行关闭 if [ -n "$PID" ]; then # 正常关闭 echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]" kill -15 $PID # 等待最大 120 秒,直到关闭完成。 for ((i = 0; i < 120; i++)) do sleep 1 PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}') if [ -n "$PID" ]; then echo -e ".\c" else echo '[stop] 停止 $BASE_PATH/$SERVER_NAME 成功' break fi done # 如果正常关闭失败,那么进行强制 kill -9 进行关闭 if [ -n "$PID" ]; then echo "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID" kill -9 $PID fi # 如果 Java 服务未启动,则无需关闭 else echo "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止" fi } # 启动 function start() { # 开启启动前,打印启动参数 echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME" echo "[start] JAVA_OPS: $JAVA_OPS" echo "[start] JAVA_AGENT: $JAVA_AGENT" echo "[start] PROFILES: $PROFILES_ACTIVE" # 开始启动 BUILD_ID=dontKillMe nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE & echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成" } # 健康检查 function healthCheck() { # 如果配置健康检查,则进行健康检查 if [ -n "$HEALTH_CHECK_URL" ]; then # 健康检查最大 60 秒,直到健康检查通过 echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查"; for ((i = 0; i < 60; i++)) do # 请求健康检查地址,只获取状态码。 result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"` # 如果状态码为 200,则说明健康检查通过 if [ "$result" == "200" ]; then echo "[healthCheck] 健康检查通过"; break # 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试 else echo -e ".\c" sleep 1 fi done # 健康检查未通过,则异常退出 shell 脚本,不继续部署。 if [ ! "$result" == "200" ]; then echo "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功"; tail -n 10 nohup.out exit 1; # 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。 else tail -n 10 nohup.out fi # 如果未配置健康检查,则 slepp 60 秒,人工看日志是否部署成功。 else echo "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 60 秒"; sleep 60 echo "[healthCheck] sleep 60 秒完成,查看日志,自行判断是否启动成功"; tail -n 50 nohup.out fi } # 部署 function deploy() { cd $BASE_PATH # 备份原 jar backup # 停止 Java 服务 stop # 部署新 jar transfer # 启动 Java 服务 start # 健康检查 healthCheck } deploy
四、结论
本地已完成配置及实现一键部署,亲测有效!