【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
setlocalcall .\package.batset 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/serviceecho 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 offJAVA_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_idsif [ -z "$container_ids" ]; thenecho "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" ]; thenecho "No images found with 'notes' in the name."
else# 删除镜像docker rmi $image_ids
fiecho $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$VERSIONecho $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/bashMAVEN_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脚本即可。

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

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

相关文章

Honor of Kings 2024.06.03 50star (S35) AFK

Honor of Kings 2024.06.03 50star (S35) AFK 来个赛季S35总结吧&#xff0c;这个赛季结束以后&#xff0c;可能要和【魔兽世界】一样AFK了&#xff0c;手游来说肯定没法子和WOW相比&#xff0c;干啥都是有队友才好玩。 我玩的基本都是肉&#xff0c;爆发强的英雄&#xff0c;最…

llama-factory微调大模型

一、背景 微调或者全量调大语言模型&#xff0c;还包括deepseek,想找个快速的微调教程&#xff0c;网上暂时没有 二、原理和步骤 原理&#xff1a;搭建环境太累了&#xff0c;还是docker环境镜像简单快捷 1、先下载模型 如果用本身的会自动从huggingface下载&#xff0c;这…

解决JSON.stringify 方法在序列化 BigInt 类型时的错误

今天学nest时&#xff0c;使用apifox发送请求获取数据&#xff0c;结果还一直报错&#xff0c;而且还是我从未见过的 Do not know how to serialize a BigInt at JSON.stringify (<anonymous>) at stringify&#xff0c; 我都是跟着人家敲的&#xff0c;我就纳闷了&…

vector的使用和实现

目录 一、vector的常用接口说明1.vector的介绍2.vector的使用2.1 vector的定义2.2 vector的遍历operator[ ]迭代器范围for 2.3 vector的空间增长问题size和capacityreserveresize 2.4 vector的增删查改push_back和pop_backinserterasefindsort vector的模拟实现1、基本成员变量…

Linux基础操作——文件系统+find+head+tail

Linux基础操作——文件系统findheadtail 本文主要涉及LINUX的一些基础操作&#xff0c;文件系统与find命令head和tail命令 文章目录 Linux基础操作——文件系统findheadtail一、Linux下的文件类型二、ls -l 后各列的解释三、 find 查找四、 head 与 tail 查看文件的头部尾部 一…

Nginx Rewrite

Nginx Rerite概述 Nginx Rerite基本操作 location与rewrite的区别 location 通过前缀或正则匹配用户的URL访问路径做页面跳转、访问控制和代理转发 rewrite 对用户的URL访问路径进行重写&#xff0c;再重定向跳转访问重写的路径 Nginx正则表达式 校验数字的表达式 数字&a…

家宽动态公网IP,使用docker+ddns 实现动态域名解析

官方地址&#xff1a;https://github.com/jeessy2/ddns-go 安装docker docker pull jeessy/ddns-godocker run -d --name ddns-go --restartalways --nethost -v /opt/ddns-go:/root jeessy/ddns-go然后访问ip端口 配置时注意如下

pytorch+YOLOv8-1

1.工具开发 2.idea配置pytorch环境 默认安装新版本torch pip install torch 3.pytorch验证 4. print(torch.cuda.is_available()) 输出结果为 False 说明我只能用cpu

有关RIPv2认证技术与网络安全综合实验

有关RIPv2认证技术与网络安全综合实验 实验拓扑如下&#xff1a; 理论知识&#xff1a; 比较 RIPv1&#xff1a;广播式通信&#xff0c;255.255.255.255&#xff1b;不支持认证&#xff0c;有类不带掩码&#xff1b;不支持VLSM和CIDR RIPV2&#xff1a;组播通信&#xff0c;22…

【Matplotlib作图-4.Distribution】50 Matplotlib Visualizations, Python实现,源码可复现

目录 04 Distribution 4.0 Prerequisite 4.1 连续变量的直方图(Histogram for Continuous Variable) 4.2 分类变量的直方图(Histogram for Categorical Variable) 4.3 Density Plot 4.4 Density Curves with Histogram 4.5 Joy Plot 4.6 Distributed Dot Plot 4.7 Box P…

详解和实现数据表格中的行数据合并功能

theme: smartblue 前言 需求场景&#xff1a; 在提供了数据查看和修改的表格视图中(如table、a-table等…)&#xff0c;允许用户自行选择多行数据&#xff0c;依据当前状态进行特定列数据的合并操作。选中的数据将统一显示为选中组的首条数据值。同时&#xff0c;页面会即时反…

插入排序(直接插入排序与希尔排序)----数据结构-排序①

1、插入排序 1.1 插入排序的基本思想 将待排序的元素按其数值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的元素插入完为止&#xff0c;就可以得到一个新的有序序列 。 实际上在我们的日常生活中&#xff0c;插入排序的应用是很广泛的&#xff0c;例如我…

二分查找算法介绍(边界值、循环条件、值的变化、二分查找的原理、异常处理)

一、二分查找法原理介绍 二分查找是经典的查找算法之一&#xff0c;其原理也非常简单。 对于已排序的数组&#xff08;假设是整型&#xff0c;如果非整型&#xff0c;如果有排序和大小比较的定义&#xff0c;也可以使用二分查找&#xff09;&#xff0c;我们每次判断中间值与目…

Golang TCP网络编程

文章目录 网络编程介绍TCP网络编程服务器监听客户端连接服务器服务端获取连接向连接中写入数据从连接中读取数据关闭连接/监听器 简易的TCP回声服务器效果展示服务端处理逻辑客户端处理逻辑 网络编程介绍 网络编程介绍 网络编程是指通过计算机网络实现程序间通信的一种编程技术…

三十五、openlayers官网示例Dynamic Data——在地图上加载动态数据形成动画效果

官网demo地址&#xff1a; Dynamic Data 初始化地图 const tileLayer new TileLayer({source: new OSM(),});const map new Map({layers: [tileLayer],target: "map",view: new View({center: [0, 0],zoom: 2,}),}); 创建了三个样式 const imageStyle new Style(…

黑马微服务实用篇知识梳理

1、微服务治理 1.1服务注册与发现Eureka和Nacos a、nacos和eureka&#xff0c;二者都支持服务注册与发现&#xff0c;但nacos还包括了动态配置管理、服务健康监测、动态路由等功能&#xff0c;是更全面的服务管理平台 b、eureka需要独立部署为服务并运行&#xff0c;需要自行搭…

师彼长技以助己(3)逻辑思维

师彼长技以助己&#xff08;3&#xff09;逻辑思维 前言 上一篇文章进行了工程思维和产品思维的测试&#xff0c;并介绍了几个比较重要的产品思维模型。接下来本篇介绍工程思维。&#xff08;注意产品思维并不代表产品经理思维&#xff0c;工程思维也并不代表工程师思维&…

【用户画像】用户偏好购物模型BP

一、前言 用户购物偏好模型BP&#xff08;Buyer Preferences Model&#xff09;旨在通过对用户购物行为的深入分析和建模&#xff0c;以量化用户对不同商品或服务的偏好程度。该模型对于电商平台、零售商以及其他涉及消费者决策的商业实体来说&#xff0c;具有重要的应用价值。…

linux,lseek,append用法

打开写的.c文件 内容为 代码 <sys/stat.h> #include <fcntl.h> #include<stdio.h> #include<unistd.h> #include<string.h>//off_t lseek(int fd, off_t offset, int whence); //int open(const char *pathname, int flags); //int open(const …

二类电商想做爆品还是得会选品

对于二类电商&#xff0c;尤其是电商新手而言&#xff0c;往往很多人都不知道自己该如何选品&#xff0c;在哪里选品&#xff0c;以及如何谈品等等的难题。想要挑选具有潜力的商品&#xff0c;首先我们需要梳理好商品选择的逻辑&#xff1a; 二类电商的特点&#xff1f;你要投…