热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Shell脚本自动发布springboot到docker容器中

1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho

1. 脚本功能

1)自动替换jar包中的配置文件。

2)自动备份老版本的Jar包

3) 自动判断是初次启动还是更新服务


2. 脚本准备

进入/home目录新建springcloud文件夹,并进入

然后新建文件夹shell、DockerBuilder、Jar、Front


shell自动化脚本放置自动化部署脚本,执行脚本即可一键部署或者更新java服务或者前端服务。
DockerBuilder构建工厂放置服务名对应的各个服务文件夹,服务文件夹下放置application.properties、bootstrap.properties。打包后端Jar会自动替换这些配置文件
Jar

微服务更新包

放置所有微服务包
Front前端更新包放置所有前端包

3. 环境变量配置

vi /etc/profile

 在文件末尾追加如下环境变量

export DockerBuilder=/home/springcloud/DockerBuilder
export Jar=/home/springcloud/Jar
export FrOnt=/home/springcloud/Front
export NginxHtml=/usr/springcloud/nginx/htmlalias shell="cd /home/springcloud/shell"

 刷新环境变量使其生效

source /etc/profile

 配置全局java环境

1.查看已经安装的JDKyum list installed |grep java2.卸载CentOS系统Java环境yum -y remove java-1.8.0-openjdk* *表示卸载所有openjdk相关文件输入 yum -y remove tzdata-java.noarch 卸载tzdata-java 3.查看yum库中的Java安装包yum -y list java*3.安装yum install java-1.8.0-openjdk*4.查看java版本java -version5.执行java,javac命令显示帮助信息则安装成功6.执行javac 报错:javac: command not found 解决方案:yum install java-1.8.0-openjdk-devel.x86_64

配置全局node环境

 Nodejs官方版本

#安装源
curl -sL https://rpm.nodesource.com/setup_13.x | bash -
#安装Nodejs
yum -y install nodejs
#配置淘宝镜像
npm config set registry http://registry.npm.taobao.org/
#安装cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
#安装yarn
npm install yarn -g
#配置yarn淘宝镜像
yarn config set registry https://registry.npm.taobao.org -g
yarn config set sass_binary_site http://cdn.npm.taobao.org/dist/node-sass -g
#检查yarn
yarn config get registry // https://registry.npm.taobao.org
yarn config get sass_binary_site // http://cdn.npm.taobao.org/dist/node-sass

 4. 启动脚本

shell && sh test.sh

5. 微服务脚本 

#!/bin/bash
#auth eric
#date 2021-08-13
#*********脚本入参#*********
appname=${0%\.*}
#Docker脚本位置
dockersrc=$DockerBuilder/$appname
#需要替换的包名称
bmc=$appname-server-web-1.0.jar
#需要替换的文件名称
file1=bootstrap.properties
file2=application.properties
#*********脚本入参#*********
#当前镜像版本
source /etc/profile
version="`date +%Y%m%d%H%M%S`"
echo '第一步:备份老版本'
if [ ! -d "$Jar/backup" ]; thenecho "备份文件夹不存在,自动创建中";mkdir $Jar/backup;
fi
if [ -f "$dockersrc/$bmc" ];thenecho "旧版本存在,自动备份中"mv $dockersrc/$bmc $Jar/backup/$bmc.$version
fi
echo '第二步:替换JAR包配置文件'
#找到替换文件路径
if [ ! -f "$Jar/$bmc" ];thenecho "$Jar/$bmc更新包不存在"exit 1;
fi
#清除上一次的残余
cd $dockersrc
sudo rm -rf *.tar *.jar
cp $Jar/$bmc $dockersrc
filesrc1=`jar -tvf \$bmc|grep \$file1|awk '{print \$NF}'`
filesrc2=`jar -tvf \$bmc|grep \$file2|awk '{print \$NF}'`
if [ $? != 0 ]; thenecho "java命令不存在,请安装JDK"exit 1;
fi
if [ -f "$dockersrc/$file1" ]; thenecho '替换bootstrap配置文件'jar -xvf $bmc $filesrc1#删掉原文件sudo rm -f $filesrc1#换掉文件cp $file1 $filesrc1#重新将文件加入到jar包中jar -uvf $bmc $filesrc1
fi
if [ -f "$dockersrc/$file2" ]; thenecho '替换application配置文件'jar -xvf $bmc $filesrc2#删掉原文件sudo rm -f $filesrc2#换掉文件cp $file2 $filesrc2#重新将文件加入到jar包中jar -uvf $bmc $filesrc2
fi
#删除解压文件
sudo rm -rf BOOT-INF
sudo rm -f *.tmp
echo '替换完成'
echo '第三步:查看是否有容器'
cd $dockersrc
imageresult=$(docker ps |grep $appname | wc -l)
if [ $imageresult -eq 0 ];
thenecho "不存在容器,需要初始化容器";docker build -t zhhq-$appname .if [ $? != 0 ]; thenecho "docker构建失败,请检查Docker" && exit 1fiif [[ "$appname" == "manager" ]]; thenecho "发布管理端后台"docker run -d --network host --name zhhq-$appname -p 7001:7001 --restart always zhhq-$appnameelif [[ "$appname" == "user" ]];thenecho "发布用户端后台"docker run -d --network host --name zhhq-$appname -p 7011:7011 --restart always zhhq-$appnameelseecho "发布$appname服务"docker run -d --name zhhq-$appname --restart always zhhq-$appnamefiif [ $? -eq 0 ];thenecho "$appname发布成功!" && exit 0elseecho -e '\033[31m[ error ]$appname 发布失败 \033[0m' && exit 1fiif [ $? -eq 0 ];thenecho "$appname发布成功!"elseecho -e '\033[31m[ error ]$appname 发布失败 \033[0m' && exit 1fi
elseecho "已经存在容器,需要更新容器";cOnid=$(docker ps |grep $appname |awk '{print $1}')docker cp $Jar/$appname-server-web-1.0.jar $conid:/$appname-server-web-1.0.jardocker restart $conidif [ $? -eq 0 ]; thenecho "发布成功!"else echo -e '\033[31m[ error ] 发布失败 \033[0m' && exit 1fi
fi

6. 前端脚本

#!/bin/bash
#auth eric
#date 2021-08-13
#*********脚本入参#*********
bmc=smartapp
#*********脚本入参#*********
version="`date +%Y%m%d%H%M%S`"
echo '第一步:备份老版本'
if [ ! -d "$Front/backup" ]; thenecho "备份文件夹不存在,自动创建中";mkdir $Front/backup;
fi
if [ ! -d "$Front/$bmc" ];thenecho '更新包不存在请检查' && exit 1
elseecho "准备更新$appname"
fi
if [ -f "$NginxHtml/$bmc" ];thenecho "旧版本存在,自动备份中"mv $NginxHtml/$bmc $Front/backup/$bmc.$version
fi
mv $Front/$bmc $NginxHtml/
echo "发布成功!"


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 标题: ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 使用Spring AOP实现切面编程的步骤和注意事项
    本文介绍了使用Spring AOP实现切面编程的步骤和注意事项。首先解释了@EnableAspectJAutoProxy、@Aspect、@Pointcut等注解的作用,并介绍了实现AOP功能的方法。然后详细介绍了创建切面、编写测试代码的过程,并展示了测试结果。接着讲解了关于环绕通知的使用方法,并修改了FirstTangent类以添加环绕通知方法。最后介绍了利用AOP拦截注解的方法,只需修改全局切入点即可实现。使用Spring AOP进行切面编程可以方便地实现对代码的增强和拦截。 ... [详细]
  • struts2重点——ValueStack和OGNL
    一、值栈(ValueStack)1.实现类:OGNLValueStack2.对象栈:CompoundRoot( ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了Python函数的定义与调用的方法,以及函数的作用,包括增强代码的可读性和重用性。文章详细解释了函数的定义与调用的语法和规则,以及函数的参数和返回值的用法。同时,还介绍了函数返回值的多种情况和多个值的返回方式。通过学习本文,读者可以更好地理解和使用Python函数,提高代码的可读性和重用性。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • Python的参数解析argparse模块的学习
    本文介绍了Python中参数解析的重要模块argparse的学习内容。包括位置参数和可选参数的定义和使用方式,以及add_argument()函数的详细参数关键字解释。同时还介绍了命令行参数的操作和可接受数量的设置,其中包括整数类型的参数。通过学习本文内容,可以更好地理解和使用argparse模块进行参数解析。 ... [详细]
  • 详解react组件通讯方式(多种)
    这篇文章主要介绍了详解react组件通讯方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着 ... [详细]
author-avatar
oth0037112
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有