【JAVA WEB实用与优化技巧】如何使用本地.bat/.sh脚本快速将服务发布到测试环境?

文章目录

  • 普通方式的springboot 使用docker打包发布【手动构建镜像模式】
    • 1. maven 打包可运行jar包
    • 2.手动打包镜像
    • 3.运行容器
  • 全自动化本地命令发布到远程服务的方式
    • 配置ssh信任公钥
      • 获取公钥
        • git 获取公钥方式: 桌面右键 -> open git gui here -> help -> show SSH key
        • 命令生成公钥方式
      • 将公钥配置到服务器可信公钥中
    • 调用脚本实现
    • 服务器上自动更新代码并打包发布

专栏快速目录链接
【JAVA WEB实用与优化技巧】Maven自动化构建与Maven 打包技巧
【JAVA WEB实用与优化技巧】如何自己封装一个自定义UI的Swagger组件,包含Swagger如何处理JWT无状态鉴权自动TOKEN获取
【JAVA WEB实用与优化技巧】如何使用本地脚本调用远程服务使用docker快速发布java应用?

我们平时都是走jenkins或者是openshift这种k8s平台来打包java应用,但对于小项目来说部署jenkins和openshift消耗的精力很多,并且如果我们是小型项目的话,在测试环境根本用不到这种发布方式,特别是一个人开发后端的情况我们希望服务器能够快速响应发布,快速进行调试。那么如何通过本地命令直接将应用发布到服务器呢?比如:本地运行deploy.bat 直接就能发布项目到测试环境,且所有的流程都是自动化的。

普通方式的springboot 使用docker打包发布【手动构建镜像模式】

在这里插入图片描述

1. maven 打包可运行jar包

通过命令可以打包得到可运行的jar包,具体如何详细打包技巧可查看 【JAVA WEB实用与优化技巧】Maven自动化构建与Maven 打包技巧 来学习。这里只讲述如何使用命令快速打包发布。

mvn clean package -s /path/to/aliyun.setting.xml -DskipTests=true

打包之后可以在启动类并且配置了打包插件的module找到打包过后的jar包,这里不再过多赘述打包细节。下述是springboot打包得插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

项目的目录结构如下:
在这里插入图片描述
运行命令之后可以犯下target下会产生打包的jar包。
在这里插入图片描述

2.手动打包镜像

拿到jar包之后,将jar包放到 /docker/service/下面:
在这里插入图片描述
/docker/service/目录下新建Dockerfile文件

touch Dockerfile

Dockerfile 配置信息:

FROM openjdk:8-jre								# 原始镜像
MAINTAINER jag <xxx@163.com>					# 作者
ENV JAVA_OPTS="-Dspring.profiles.active=sit"    # 指定JVM参数
ADD xxx-boot-1.0-SNAPSHOT.jar app.jar           # 将jar包add到镜像文件夹中 -> app.jar 代表放到根目录下
RUN mkdir /logs && sh -c "chmod -R 777 /logs"   # 修改日志文件夹的权限
EXPOSE 8080										# 暴露端口
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar      # docker 容器启动的时候运行的命令
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone # 设置时区

然后运行docker build -t "notes:v1.0" 【dockerfile所在路径】即可将jar包打成镜像。

3.运行容器

docker run -v /docker/logs:/logs -d -p 9000:8080 --name=vnode-1.0 notes:v1.0

在这里插入图片描述
这样发布需要的步骤为:

  1. 将打包好的jar包拷贝到服务器上
  2. docker build 将jar包打成镜像
  3. 运行

明显是非常麻烦的,我们如何将这三步变成一步直接运行本地的一个脚本就能直接发布呢?并且如何做到可以自动清理过期的docker容器和镜像呢?

全自动化本地命令发布到远程服务的方式

在这里插入图片描述

配置ssh信任公钥

配置信任公钥之后我们在本地就可以直接调用测试服务器上的命令了。

获取公钥

git 获取公钥方式: 桌面右键 -> open git gui here -> help -> show SSH key

在这里插入图片描述
=> copy to clipboard 来拿到公钥
在这里插入图片描述
如果还没有公钥生成一下公钥再拷贝即可。

命令生成公钥方式

在这里插入图片描述
id_rsa.pub就是公钥串文件,编辑器打开复制即可。如果之前已经生成了,直接拷贝id_rsa.pub中的内容即可。
在这里插入图片描述

将公钥配置到服务器可信公钥中

在这里插入图片描述

vi ~/.ssh/know_hosts

将本地的公钥粘贴进去,wq退出保存即可。

调用脚本实现

jarpush.bat 调用打包脚本先服务打包,然后将打包得jar scp 到远程linux服务上

@echo off
setlocal

call .\package.bat

set FILE_PATH=\path\to\efficiency-note-boot-1.0-SNAPSHOT.jar
set USERNAME=root
set SERVER_IP=47.98.213.209
set REMOTE_DIR=/docker/service

echo Uploading file to Linux server...
echo %FILE_PATH% %USERNAME%@%SERVER_IP%:%REMOTE_DIR%
scp %FILE_PATH% %USERNAME%@%SERVER_IP%:%REMOTE_DIR%

echo File upload completed.

ssh root@47.98.213.209 "bash /docker/service/service_build.sh"

endlocal

package.bat

@echo off

JAVA_HOME=D:\java\jdk1.8.0_131
java -version
D:\maven\apache-maven-3.9.6\bin\mvn clean package -s D:\maven\aliyun.setting.xml -DskipTests=true

@echo off

service_build.sh

#!/bin/bash;

VERSION=`cat /docker/service/version`

echo "关闭容器"
docker stop NC_$VERSION

# 获取名称以"notes"开头的容器ID列表
container_ids=$(docker ps -aq --filter "name=NC_*")

echo 'rongqi'$container_ids

if [ -z "$container_ids" ]; then
    echo "No containers found with 'notes' in the name."
else
    # 删除容器
    docker rm $container_ids
fi

# 获取名称为"notes"的镜像ID列表
image_ids=$(docker images -q "notes*")

if [ -z "$image_ids" ]; then
    echo "No images found with 'notes' in the name."
else
    # 删除镜像
    docker rmi $image_ids
fi

echo $VERSION
((VERSION++))

docker build -t "notes:v$VERSION" /docker/service/
docker run -v /docker/logs:/logs -d -p 9000:8080 --name=NC_$VERSION notes:v$VERSION


echo $VERSION > /docker/service/version

/docker/service/ 目录下的Dockerfile:

FROM openjdk:8-jre								# 原始镜像
MAINTAINER jag <xxx@163.com>					# 作者
ENV JAVA_OPTS="-Dspring.profiles.active=sit"    # 指定JVM参数
ADD xxx-boot-1.0-SNAPSHOT.jar app.jar           # 将jar包add到镜像文件夹中 -> app.jar 代表放到根目录下
RUN mkdir /logs && sh -c "chmod -R 777 /logs"   # 修改日志文件夹的权限
EXPOSE 8080										# 暴露端口
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar      # docker 容器启动的时候运行的命令
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone # 设置时区

我们在本地点击jarpush.bat 运行即可发布到测试环境上了。

服务器上自动更新代码并打包发布

在这里插入图片描述

如果我们不想在本地打包推送到服务器上发布,可以使用git先拉去代码然后运行mvn命令打包然后再发布

publish.sh

#!/bin/bash

MAVEN_HOME=/docker/apache-maven-3.8.8/bin/
cd /docker/service/efficient-notes && git pull origin master
pwd
$MAVEN_HOME/mvn clean package -s /docker/service/setting.xml -Dmaven.test.skip=true 
cd /docker/service && cp /docker/service/projectName/xxx-main/xxx-boot/target/xxx-boot-1.0-SNAPSHOT.jar /docker/service
sh /docker/service/service_build.sh

git pull origin master => 可能会需要账号和密码,使用下述命令来保存账号密码第二次发布就不需要填写密码了,就可以自动拉取代码。

git config --global credential.helper store    	       // 保存账号密码

然后本地的.bat或者.sh通过ssh调用远程publish.sh脚本即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据库】MySQL表的操作

目录 一.创建表 二.查看表 三.修改表 四.删除表 一.创建表 基本语法&#xff1a; CREATE TABLE table_name(field1 datatype,field2 datatype,field3 datatype) character set 字符集 collate 校验规则 engine 储存引擎field表示列名 datatype表示列的类型 charatcer se…

初识C++ · 模拟实现stack和Queue

目录 前言&#xff1a; 1 Stack 1.1 双端队列 2 Queue 前言&#xff1a; 经历了list三个自定义类型的洗礼&#xff0c;来个简单的放松放松&#xff0c;即栈和队列&#xff1a; 文档记录的&#xff0c;栈和队列是一种容器适配器&#xff0c;它们不属于stl&#xff0c;但是它…

什么是云渲染?怎么使用呢?手把手教你

云渲染是一种利用云计算技术进行图形渲染的服务。它允许用户将渲染任务提交到云端服务器&#xff0c;由远程的计算机集群资源进行渲染操作&#xff0c;完成后再将渲染结果返回给用户。 云渲染技术的优势在于它可以提高渲染效率和质量&#xff0c;支持多任务同时加速渲染&#…

一个被无数人忽视的好项目

这个项目相信大家都在各大短视频平台见过&#xff0c;之前被我忽视了&#xff0c;当时的我自以为它是一时的热度&#xff0c;很快就会凉凉。但现在却生生被打脸了&#xff0c;这其实是非常好变现且流量也很大的一个好项目。 到底是什么好项目呢&#xff0c;没错&#xff0c;就…

[MYSQL]合作过至少三次的演员和导演

ActorDirector 表&#xff1a; ---------------------- | Column Name | Type | ---------------------- | actor_id | int | | director_id | int | | timestamp | int | ---------------------- timestamp 是这张表的主键(具有唯一值的列).编写解决方案…

黑马程序员——Spring框架——day04——SpringMVC基础

目录&#xff1a; SpringMVC简介 背景SpringMVC概述技术体系定位快速入门 目的需求步骤代码实操测试工具 PostMan简介PostMan安装PostMan使用知识点总结请求与参数处理 请求路径 环境准备问题分析解决方式请求方式 环境准备技术分析参数 基本数据类型POJO嵌套POJO数组集合&…

基于卷积神经网络(CNN)的深度迁移学习在声发射(AE)监测螺栓连接状况的应用

螺栓结构在工业中用于组装部件&#xff0c;它们在多种机械系统中扮演着关键角色。确保这些连接结构的健康状态对于航空航天、汽车和建筑等各个行业至关重要&#xff0c;因为螺栓连接的故障可能导致重大的安全风险、经济损失、性能下降和监管合规问题。 在早期阶段检测到螺栓松动…

四、利用启发式算法进行特定数据集的残差网络结构搜索【框架+源码】

背景&#xff1a;工作之后干的事情跟算法关联甚少&#xff0c;整理下读书期间的负责和参与的work&#xff0c;再熟悉学习下。 边熟悉边整理喽~ CV Tradictional workCV AI based work机械臂视觉抓取项目机器学习全流程 Pipeline训练平台OCR生产线喷码识别三维重建(SfM)ROS机器人…

springboot项目通过jar包部署到服务器

1. 将springboot项目打包成jar包 方式一&#xff1a;IDEA为例 出现 BUILD SUCCESS 证明打包成功&#xff0c;自动生成了 target 目录&#xff0c; jar 包就在目录里边 方式二&#xff1a;命令行&#xff08;得配置好maven环境变量&#xff09; 切换到项目目录下&#xff0c;…

springboot管理的各依赖版本查看

找一个springboot相关的依赖&#xff0c;比如这里我找mybatis 鼠标点击artifactId名称&#xff0c;图中蓝色字段&#xff0c;跳转到springboot依赖&#xff08;鼠标悬停在上面变成蓝色表示可点击跳转&#xff09;&#xff0c; 点击spring-boot-dependencites&#xff0c;跳转到…

基于FPGA的SystemVerilog练习

文章目录 一、认识SystemVerilogSystemVerilog的语言特性SystemVerilog的应用领域SystemVerilog的优势SystemVerilog的未来发展方向 二、流水灯代码流水灯部分testbench仿真文件 三、用systemVerilog实现超声波测距计时器测距部分led部分数码管部分采样部分顶层文件引脚绑定效果…

QT入门知识回顾

1 QT简介 1.1 Qt模块: Qt Core模块: 是QT类库的核心&#xff0c;所有其他模块都依赖这个模块 Qt Gui模块: 提供GUI程序的基本功能 Qt Network模块:提供跨平台的网络功能 Qt Widgets模块:提供创建用户界面的功能 1.2Qt的signal/slot机制 任何一个类只要类体前部书写 Q_OBJ…

TH方程学习 (6)

一、内容介绍 本节旨在使用优化算法的方法&#xff0c;旨在利用最小的燃耗实现目标的交会&#xff0c;变量为目标的转移时间。整个问题描述为&#xff1a; 本节拟采取粒子群优化的算法&#xff0c;matlab中自带的粒子群函数为particleswarm&#xff0c;其用法不详细介绍&#…

LeetCode:环形链表II

文章收录于LeetCode专栏 LeetCode地址 环形链表II 题目 给定一个链表&#xff0c;返回链表开始入环的第一个节点。如果链表无环&#xff0c;则返回null。   为了表示给定链表中的环&#xff0c;我们使用整数pos来表示链表尾连接到链表中的位置&#xff08;索引从0开始&#…

C++青少年简明教程:数组

C青少年简明教程&#xff1a;数组 C数组是一种存储固定大小连续元素的数据结构。数组中的每个元素都有一个索引&#xff0c;通过索引可以访问或修改数组中的元素。 在C中&#xff0c;数组中的元素数据类型必须一致。数组是一个连续的内存区域&#xff0c;用于存储相同类型的元…

std::shared_ptr,reset()函数

感慨&#xff1a;不深入阅读源代码&#xff0c;真的心虚&#xff0c;也用不好。 上代码&#xff1a; class A01 { public://std::weak_ptr<B0> b_ptr;int data{ 1234 };~A01() {std::cout << "A01 deleted\n";}void Print() { std::cout << &quo…

C++进阶:C++11

C11简介 在 2003 年 C 标准委员会曾经提交了一份技术勘误表 ( 简称 TC1) &#xff0c;使得 C03 这个名字已经取代了 C98 称为 C11 之前的最新 C 标准名称。不过由于 C03(TC1) 主要是对 C98 标准中的漏洞 进行修复&#xff0c;语言的核心部分则没有改动&#xff0c;因此人们习…

初始操作系统

概念&#xff1a; 1.系统资源的管理者&#xff1a;实质控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机地工作和资源的分配 2.向上层提供方便易用的服务&#xff1a;以提供给用户和其他软件方便接口和环境 封装思想&#xff1a;操作系统把一些丑…

小熊家务帮day10- 门户管理

门户管理 1 门户介绍1.1 介绍1.2 常用技术方案 2 缓存技术方案2.1 需求分析2.1.1 C端用户界面原型2.1.2 缓存需求2.1.3 使用的工具 2.2 项目基础使用2.2.1 项目集成SpringCache2.2.2 测试Cacheable需求Service测试 2.1.3 缓存管理器&#xff08;设置过期时间&#xff09;2.1.4 …

React@16.x(17)Portals

目录 1&#xff0c;使用2&#xff0c;事件冒泡 一句话总结&#xff1a;和 Vue3 的 Teleport 一个效果。 1&#xff0c;使用 import React, { PureComponent } from "react"; import ReactDOM from "react-dom";// 返回一个 React 元素&#xff08;ReactNo…