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

news/2024/5/17 16:54:59 标签: docker, jenkins, gitee

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

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

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

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

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

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

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

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

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

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

目录

一、前提

jenkins%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2vue%E5%89%8D%E7%AB%AF%E9%A1%B9%E7%9B%AE-toc" style="margin-left:0px;">二、jenkins自动部署vue前端项目

jenkins%E4%B8%8A%E5%AE%89%E8%A3%85nodejs%E6%8F%92%E4%BB%B6-toc" style="margin-left:40px;">2.1 jenkins上安装nodejs插件

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

2.3 新建任务

2.4 任务配置

2.5 打包完成

jenkins%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2springboot%E5%90%8E%E7%AB%AF%E9%A1%B9%E7%9B%AE-toc" style="margin-left:0px;">三、jenkins自动部署springboot后端项目

3.1 构建一个maven项目

3.2 General配置

3.3 源码管理

3. 4 Build构建

3.5 Post Steps

3.6 构建后操作

3.7 脚本参考

四、结论


一、前提

本地虚拟机上安装了centos7,在centos7上安装了dockerdocker-compose、jenkins等镜像。安装过程可参考我以前写的文章:CSDN

jenkins%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2vue%E5%89%8D%E7%AB%AF%E9%A1%B9%E7%9B%AE" style="background-color:transparent;">二、jenkins自动部署vue前端项目

jenkins%E4%B8%8A%E5%AE%89%E8%A3%85nodejs%E6%8F%92%E4%BB%B6">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%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2springboot%E5%90%8E%E7%AB%AF%E9%A1%B9%E7%9B%AE" style="background-color:transparent;">三、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.niftyadmin.cn/n/5249680.html

相关文章

【教学类-35-05】17号的学号字帖(A4竖版1份)

作品展示&#xff1a; 背景需求&#xff1a; 大四班17号男孩目前无法自主数学数字。他表示自己能够认识数字&#xff0c;但不会写。 保育老师说&#xff1a;我曾经教过他&#xff0c;抓着手示范的。但是他记不住。家里估计也不练习的。年龄还没到&#xff0c;下学期再看看能不…

Java第十二章(合集类)

概述 集合可以看作一个容器&#xff1b;集合中的每个对象&#xff0c;可以很容易取出存放&#xff0c;还可以按照一定的顺序摆放 提到容器&#xff0c;不难想到数组&#xff0c;集合类和数组的不同之处是&#xff0c;数组的长度是固定的&#xff0c;集合的长度是可变 的&…

探秘MSSQL存储过程:功能、用法及实战案例

在现代软件开发中&#xff0c;高效地操作数据库是至关重要的。而MSSQL&#xff08;Microsoft SQL Server&#xff09;作为一款强大的关系型数据库管理系统&#xff0c;为我们提供了丰富的功能和工具来处理数据。其中&#xff0c;MSSQL存储过程是一项强大而又常用的功能&#xf…

管理类联考——英语二——真题篇——按题型分类——小作文

文章目录 2023-建议信2022-邀请信2021-邀请信2020-建议信2019-建议信2018-道歉信2017-接受邀请信2016-建议信2015-通知2014-介绍信2013-邀请信 2023-建议信 Part A 47. Directions:   An art exhibition and a robot show are to be held on Sunday, and your friend David …

rk3568 Android12音频问题

rk3568 Android12音频问题 前言 在调试客户的项目的时候&#xff0c;发现外置的音频功放在打开和关闭音频的时候会出现pop音&#xff0c;严重影响使用体验&#xff0c;好在最后解决了这个问题&#xff0c;遂记录一下解决过程。 tiny-alsa命令的使用 在调试ubuntu等一些纯li…

Linux基础——进程初识(一)

1. 硬件 ①冯诺依曼体系 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。其详细结构如下图所示 在这里有几点要说明 1. 这里的储存器实际上指的是内存 2. 输入设备与输出设备都属于外设 常见的输入设备…

DevOps搭建(五)-JDK安装详细步骤

1、官网下载 官方网站下载JDK&#xff0c;这里我们安装JDK8 https://docs.oracle.com/javase/8/docs/technotes/guides/install/install_overview.html 点击上图中的Java SE Downloads项目&#xff0c;也可直接点击下面链接进入&#xff1a; Java Downloads | Oracle 往下滚…

prometheus服务发现之consul

文章目录 前言一、Consul 在这里的作用二、原理三、实现过程安装 consul节点信息&#xff08;exporter&#xff09;注册进去consul节点信息&#xff08;exporter&#xff09;从consul解除注册&#xff1a;prometheus配置consul地址 总结 前言 我们平时使用 prometheus 收集监控…