当前位置: 首页 > news >正文

【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脚本即可。

相关文章:

  • NVIDIA发布重磅AI创新,黄仁勋在COMPUTEX大会预示计算未来
  • 面向对象程序设计之从C到C++的初步了解
  • 奶茶店、女装店、餐饮店是高危创业方向,原因如下:
  • 一个知识问答系统,用户的选择决定接下来出现的问题,且下一个问题的呈现取决于前面几个问题的回答
  • 工业4.0利器:MES系统
  • 在一个定义好的数据对象(class)中,后续更新时只更新其中部分数据,其余部分会恢复初始设置吗
  • Amazon云计算AWS(四)
  • typescript --object对象类型
  • 开发和渗透偷懒利器utools
  • 鲁教版七年级数学下册-笔记
  • OCR图片转Excel表格:没结构化的弊端
  • JS(DOM、事件)
  • 【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
  • Amazon云计算AWS(二)
  • 发布 jar 包到 maven 中央仓库
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • ➹使用webpack配置多页面应用(MPA)
  •  D - 粉碎叛乱F - 其他起义
  • DOM的那些事
  • Java程序员幽默爆笑锦集
  • js数组之filter
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • mongodb--安装和初步使用教程
  • React-生命周期杂记
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 关于for循环的简单归纳
  • ------- 计算机网络基础
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 思维导图—你不知道的JavaScript中卷
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 整理一些计算机基础知识!
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #define
  • #java学习笔记(面向对象)----(未完结)
  • #QT(QCharts绘制曲线)
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (13)DroneCAN 适配器节点(一)
  • (9)STL算法之逆转旋转
  • (floyd+补集) poj 3275
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (含答案)C++笔试题你可以答对多少?
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十)T检验-第一部分
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (未解决)macOS matplotlib 中文是方框
  • (一)WLAN定义和基本架构转
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • (自用)交互协议设计——protobuf序列化
  • .libPaths()设置包加载目录
  • .net 7 上传文件踩坑
  • .NET Framework 3.5安装教程
  • .net mvc部分视图