如何利用CentOS7+docker+jenkins+gitee部署springboot+vue前后端项目(保姆教程)

news2024/11/23 20:23:49

  博主介绍:Java领域优质创作者,博客之星城市赛道TOP20专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。

🍅文末获取源码下载地址🍅

👇🏻 精彩专栏推荐订阅👇🏻 欢迎点赞收藏评论拍砖........

【Docker Swarm总结】《容器技术 Docker+K8S专栏》✅

【uniapp+uinicloud多用户社区博客实战项目】《完整开发文档-从零到完整项目》✅

【Springcloud Alibaba微服务分布式架构 | Spring Cloud】《系列教程-更新完毕》✅

【SpringSecurity-从入门到精通】《学习完整笔记-附(完整demo源码)》✅

【从零开始Vue项目中使用MapboxGL开发三维地图教程】《系列教程-不定时更新》✅

【Vue.js学习详细课程系列】《共32节专栏收录内容》✅

感兴趣的可以先收藏起来相关问题都可以给我留言咨询,希望帮助更多的人。

目录

一、前提

二、jenkins自动部署vue前端项目

2.1 jenkins上安装nodejs插件

2.2 全局工具配置实现nodejs配置

2.3 新建任务

2.4 任务配置

2.5 打包完成

三、jenkins自动部署springboot后端项目

3.1 构建一个maven项目

3.2 General配置

3.3 源码管理

3. 4 Build构建

3.5 Post Steps

3.6 构建后操作

3.7 脚本参考

四、结论


一、前提

本地虚拟机上安装了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个配置

  1. 执行shell
  2. 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

四、结论

本地已完成配置及实现一键部署,亲测有效!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1288298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小航助学题库白名单竞赛考级蓝桥杯等考scratch(12级)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;

Java面试题(每天10题)-------连载(44)

目录 Dubbo篇 1、Dubbo支持哪些协议&#xff0c;每种协议的应用场景&#xff0c;优缺点 2、Dubbo超时时间怎么设置&#xff1f; 3、Dubbo有哪些注册中心&#xff1f; 4、Dubbo集群的负载均衡有哪些策略 5、Dubbo是什么&#xff1f; 6、Dubbo的主要应用场景&#xff1f;…

豪华股东背书:欧洲AI新星Mistral估值飙升至20亿美元

在人工智能领域&#xff0c;一家名为Mistral的初创公司近期引起了广泛关注。这家仅成立不到一年的公司&#xff0c;凭借其强大的技术实力和豪华的股东背景&#xff0c;已经成功吸引了包括A16z、英伟达、Salesforce等在内的多家全球顶级投资机构的关注。据知情人士透露&#xff…

基于阿里云服务网格流量泳道的全链路流量管理(一):严格模式流量泳道

作者&#xff1a;尹航 概述 灰度发布是一种常见的对新版本应用服务的发布手段&#xff0c;其特点在于能够将流量在服务的稳定版本和灰度版本之间时刻切换&#xff0c;以帮助我们用更加可靠的方式实现服务的升级。在流量比例切换的过程中&#xff0c;我们可以逐步验证新版本服…

TCP显式编码报文长度发送与接收

报文格式最重要的是如何确定报文的边界。常见的报文格式有两种方法&#xff0c;一种是发送端把要发送的报文长度预先通过报文告知给接收端&#xff1b;另一种是通过一些特殊的字符来进行边界的划分。 这篇文章中讲的是发送报文长度的方法。报文类型如下&#xff1a; 第一部分…

MySQL主从复制(一主一从、双主双从)

一、概述 1. 数据库主从概念、优点、用途 主从数据库是什么意思呢&#xff0c;主是主库的意思&#xff0c;从是从库的意思。数据库主库对外提供读写的操作&#xff0c;从库对外提供读的操作。   数据库为什么需要主从架构呢&#xff1f; 高可用&#xff0c;实时灾备&#x…

QT 中 多线程(备查)

基础 一个线程处理窗口事件&#xff0c;其他线程进行逻辑运算 在QT中使用多线程&#xff0c;需要额外注意的&#xff1a; 1&#xff09;默认的线程在Qt中称之为窗口线程&#xff0c;也叫主线程&#xff0c;负责窗口事件处理或者窗口控件数据的更新 2&#xff09;子线程负责后台…

TA-Lib学习研究笔记(九)——Pattern Recognition (1)

TA-Lib学习研究笔记&#xff08;九&#xff09;——Pattern Recognition &#xff08;1&#xff09; 0.程序代码 形态识别的函数的应用&#xff0c;通过使用A股实际的数据&#xff0c;验证形态识别函数&#xff0c;用K线显示出现标志的形态走势&#xff0c;由于入口参数基本上…

面试 Redis 八股文十问十答第一期

面试 Redis 八股文十问十答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.Redis数据类型有哪些? String&#xff08;字符串&#xff09;&#xff1a;是…

安装npm,配置国内源

下载地址 https://nodejs.cn/download/ 设置国内源 npm config set registry https://registry.npm.taobao.org --global npm config get registry

初学Python基础后,如何制定学习计划?

如果你是Python小白&#xff0c;学完基础语法是个了不起的成就&#xff0c;但是接下来应该干嘛呢&#xff1f;你应该学习哪些内容&#xff1f;你应该如何规划你的Python学习路线&#xff1f; 其实这些问题的答案都取决于你的个人目标和兴趣。你想要用Python做什么&#xff1f;…

微服务实战系列之J2Cache

前言 经过近几天陆续发布Cache系列博文&#xff0c;博主已对业界主流的缓存工具进行了基本介绍&#xff0c;当然也提到了一些基本技巧。相信各位盆友看见这么多Cache工具后&#xff0c;在选型上一定存在某些偏爱: A同学说&#xff1a;不管业务千变万化&#xff0c;我对Redis的…

HarmonyOS学习--TypeScript语言学习(一)

本章目录如下&#xff1a; 一、TypeScript语言介绍 二、TypeScript使用工具 三、TypeScript基础知识 四、TypeScript 与面向对象 五、TypeScript 保留关键字 为什么要学习TypeScript语言呢&#xff1f; 因为ArkTS语言是围绕应用开发在TypeScript&#xff08;简称TS&#xff…

STM32(PWM、ADC)

1、PWM 定义 PWM&#xff0c;全称为脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;&#xff0c;它通过改变信号的高电平和低电平的持续时间比例来控制输出信号的平均功率或电压。 PWM&#xff0c;全称为脉冲宽度调制&#xff08;Pulse Width Modulation&#xff…

STM32(DMA、DHT11)

1、DMA&#xff08;数据的搬运工&#xff09; DMA&#xff0c;全称为&#xff1a;Direct Memory Access&#xff0c;即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为 RAM 与 I/O 设备开…

基于Python+OpenCV的车道线和车辆检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 本文将介绍如何使用Python编程语言结合OpenCV库进行车道线和车辆检测。这种技术常用于计算机视觉领域&#xff0c;特…

优秀编程习惯一: Git提交如何写注释

feat feat - A new feature : 一个新功能 fix fix - A bug fix : bug修复 docs docs - Documentation only changes : 仅更改文档 style style - Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) : 不影响代…

arduino - L7805CV三端稳压器

一、 介绍&#xff08;摘抄&#xff09; L7805CV是三端稳压器&#xff0c;78是正电压稳压&#xff0c;和它对应的79就是负电压&#xff0c;稳压05是传输电压的数值&#xff0c;所以它的意思就是正5伏的三端稳压器&#xff0c;通常可以直接代换&#xff0c;就是说它的输出电压在…

Pycharm的字体缩放设置

法1 法2 放大操作 increase 缩小操作 decrease 保存操作&#xff0c;点击OK结束

Spring Cloud + Vue前后端分离-第3章 SpringBoot项目技术整合

Spring Cloud Vue前后端分离-第3章 SpringBoot项目技术整合 3-1 集成持久层框架Mybatis ORM:对象关系映射&#xff0c;Hibernate是全自动ORM&#xff0c;Mybatis是半自动ORM&#xff0c;Mybatis可以操作的花样更多&#xff0c;是首选的持久层框架 System模块集成Mybatis框架…