为了自动化部署jar包到k8s容器云上边而写的脚本。

懒惰才是第一生产力,为了避免繁杂的发包操作。复制粘贴的喋喋不休,jar包升版的版本控制而写的脚本。

一、 脚本功能

把jar包放到指定目录,执行shell脚本,脚本先自动根据文件夹的环境把jar包中的配置文件替换掉。这样可以很方便的打生产环境和测试环境的jar包。只需要把jar放上去,配置文件无需关系,自动放到jar包里。然后脚本会自动把jar打成镜像,给镜像打成镜像名称加时间日期的标签,然后把镜像推送到镜像仓库。然后自动替换k8s的yaml脚本停止旧容器,启动新容器。

二、 脚本所需

1. springboot的jar包

2. 构建springboot镜像的Dockerfile

3. k8s启动yaml文件

三、 脚本定义

appname:所打包的name

dockersrc:用来放置Dockerfile文件。把jar包打成docker镜像。

k8ssrc:用来防止k8s的yaml文件,启动pod,停止pod

bmc:jar包的名字

file1:jar包种要替换的配置文件的名字,这个文件放置在dockersrc目录下。如bootstrap.properties

【替换jar包配置文件真的很方便,这样打成的jar包直接放进来就能用,无需关心配置文件,一键shell即可打包更新环境】

四、 脚本流程

1.  获取当前时间的年月日时分秒,生成当前jar包的版本号

2.  把jar包中的配置文件替换为dockersrc中的配置文件。

3. 把jar包打成docker镜像

4. 清除替换配置文件的残余

5. 给镜像打标签带上我们的版本号

6. 把这个镜像推送到远程镜像仓库

7. 替换yaml文件中的版本号

8. 重启pod,更新完成

五、 脚本详情

#!/bin/bash
#auth eric
#date 2020-11-25


#*********脚本入参#*********
appname=base
#Docker脚本位置
dockersrc=/home/springcloud/DockerBuilder/$appname
#K8s脚本位置
k8ssrc=/home/springcloud/k8s/$appname
#需要替换的包名称
bmc=$appname-server-web-1.0.jar
#需要替换的文件名称
file1=bootstrap.properties
#*********脚本入参#*********



#当前镜像版本
source /etc/profile
version="`date +%Y%m%d%H%M%S`"
echo '当前版本为'$version
echo '第一步:替换JAR包配置文件'
#找到替换文件路径
cd $dockersrc
if [ ! -d "$dockersrc"]; then
  echo "$dockersrc文件夹不存在";
  exit 1;
fi
if [ ! -f  "$jarsrc/$bmc" ];then
  echo  "$jarsrc/$bmc更新包不存在"
fi
#清除上一次的残余
rm -f *.tar *.jar
cp $jarsrc/$bmc $dockersrc
filesrc1=`jar -tvf \$bmc|grep \$file1|awk '{print \$NF}'`
echo $bmc
echo $file1
echo $filesrc1
#把要替换的文件解压出来
jar -xvf $bmc $filesrc1
if [ $? != 0 ]; then
    echo "java命令不存在,请安装JDK"
    exit 1;
fi
#删掉原文件
rm -f $filesrc1
#换掉文件
cp $file1 $filesrc1
#重新将文件加入到jar包中
jar -uvf $bmc $filesrc1
#删除解压文件
rm -rf BOOT-INF
rm -f *.tmp
echo '替换完成'
echo '第二步:构建Docker镜像'
docker build -t springcloud-$appname:1.1 .
if [ $? != 0 ]; then
    echo "docker构建失败,请检查Docker"
    exit 1;
fi
docker save springcloud-$appname:1.1 -o springcloud-$appname.tar
docker load < springcloud-$appname.tar
docker tag springcloud-$appname:1.1 192.168.1.6:15000/springcloud/springcloud-$appname:v$version
docker push  192.168.1.6:15000/springcloud/springcloud-$appname:v$version
if [ $? != 0 ]; then
    echo "远程仓库推送失败,请检查远程镜像仓库"
    exit 1;
fi
echo '第三步:升级K8s容器'
#替换k8s容器镜像版本
cd $k8ssrc
if [ ! -d "$k8ssrc"]; then
  echo "$k8ssrc文件夹不存在";
  exit 1;
fi
sed  -i  "s|springcloud/springcloud-$appname:.*|springcloud/springcloud-$appname:v$version |g"  04.application-deployments.yaml
kubectl delete -f 04.application-deployments.yaml
kubectl apply -f 04.application-deployments.yaml
echo '升级完成,当前版本为:'$version

六、 Dockerfile实例

首先要先安装openjdk

docker  pull  openjdk

然后注意修改时区保证docker容器内的时间和外部时间同步 

FROM openjdk:8
MAINTAINER ERIC-BASE
LABEL app="eric-base" version="1.1" by="eric"
COPY ./base-server-web-1.0.jar base-server-web-1.0.jar
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
CMD java -Xms256m -Xmx512m -jar base-server-web-1.0.jar