封闭生产环境手工批量部署脚本

为何要通过脚本部署项目?

成长在jenkins+docker的自动化部署环境下的孩子无疑是幸福的,但受限于某些情况,例如我们本地开发,生产环境却是一个客户内网封闭环境的情况,就无法使用jenkins进行持续集成了。

此时如何实现高效率的部署呢?手动写脚本是一种比较省心的方式。理解jenkins的工作方式,我总结一般jar部署为一下几点:

  • 从git拉取部署分支最新版本
  • 使用maven对代码进行打包
  • 将打包好的应用上传到服务器
  • 编写脚本启动应用

以上面4点,本文将以实际项目介绍如何编写脚本实现上述功能

1. 编写脚本,拉取代码,将批量jar打包成压缩包

脚本运行前提:

  1. 该脚本为windows批处理脚本,在windows环境运行
  2. 该脚本应在父工程目录下执行,可以将所有子工程进行编译打包(项目结构如下)
  3. 该脚本执行了git及maven命令,调用了window中winrar.exe、7z.exe应用程序。故要求电脑安装了git、manven、winrar、7z程序,并且配置了git和maven的path环境变量

项目结构:

D:\git\Backend 的目录
2019/05/17  09:04             9,603 pom.xml
2019/05/17  09:52              zh_admin_server
2019/05/17  09:58              zh_auth
2019/05/17  09:51              zh_common
2019/05/17  09:52              zh_eureka
2019/05/17  09:52              zh_filemanager
2019/05/17  09:52              zh_linemanager
2019/05/17  09:52              zh_usermanager
2019/05/17  09:52              zh_web

该脚本主要功能:

  1. 弹出命令行窗口,输入需要打包的分支,部署的profile
  2. 使用git命令检出该分支,并拉取最新代码
  3. 执行mvn打包命令,对整个父项目进行package
  4. 递归遍历父项目下文件夹内所有.jar文件,拷贝到创建好的application目录下
  5. 调用 winrar 压缩程序,将application文件夹压缩为application.rar压缩包(一个文件,用于上传到服务器为windows操作系统)
  6. 查找7z.exe 压缩程序,将application文件夹压缩为application.tar压缩包,再进行gz压缩为application.tar.gz文件
  7. 删除本脚本创建的临时文件及文件夹
@echo off
title 自动打包脚本,指定要打包的分支及profile自动打包成rar及tar.gz文件
set "base_path=%cd%"
set /p checkout_branch=请确保本地修改均已commit,本脚本将强制checkout到您输入的分支,请输入要检出的分支: 
set /p package_profile=请输入打包环境profile: 
set "ff=7z.exe"


rem 注意,运行本脚本需要安装git、winrar、7z等程序
echo =================================================== 当前工作目录为%base_path%
echo =================================================== 当前检出分支为%checkout_branch%


git pull
git checkout -f %checkout_branch%

TIMEOUT /T 5
rem 无需确认删除application文件夹
del /Q application
del /Q application.rar
rem 创建application文件夹
md application

echo =================================================== 开始对项目进行打包 当前打包环境为%package_profile% 
TIMEOUT /T 1
rem call:执行mvn命令不退出 mvn:maven打包命令 清理 打包 跳过测试 指定profile
call mvn clean package -Dmaven.test.skip=true -P %package_profile% 
echo =================================================== 打包完成,开始复制jar到application目录下
TIMEOUT /T 1

rem 递归遍历子文件夹中匹配.jar文件,拷贝到application目录下
for /r %cd% %%a in (*.jar) do (
    copy %%a %cd%\application\
) 
echo =================================================== 复制完成,添加压缩包,请检查jar包数量是否正确
TIMEOUT /T 1
rem 调用 winrar 程序, 将application文件夹压缩保存为application.rar文件
start winrar a -ep1 "%cd%\application.rar" "%cd%\application" 



echo 正在从c d e f g h i盘中查找%ff%程序,默认执行找到的第一个程序。
::下一行括号里列所有盘有几个写几个,不清楚就一直列到z
for %%i in (c d e f g h i )do (
    if exist %%i:\ (
        cd/d %%i:\
        for /f "delims=" %%j in ('dir/b/a-d/s "%ff%" 2^>nul') do (
            echo.&echo 在%%~fj找到%ff%,准备启动它...
            "%%~fj" a -ttar %base_path%\application.tar %base_path%\application
            "%%~fj" a -tgzip %base_path%\application.tar.gz %base_path%\application.tar
            del /Q %base_path%\application.tar
            goto BREAK_FOR

        )
    )
)
:BREAK_FOR

del /Q %base_path%\application
echo =================================================== application.rar及application.tar.gz文件已生成在%base_path%下
echo =================================================== 请注意当前目录现分支为%checkout_branch%,请自行切换分支
pause

运行脚本,输入信息


image.png

该脚本执行产生的日志:

请确保本地修改均已commit,本脚本将强制checkout到您输入的分支,请输入要检出的分支: dev-test
请输入打包环境profile: test
=================================================== 当前工作目录为D:\git\Backend
=================================================== 当前检出分支为dev-test
Already up-to-date.
Switched to branch 'dev-test'
Your branch is up-to-date with 'origin/dev-test'.

等待 0 秒,按一个键继续 ...
找不到 D:\git\Backend\application.rar
子目录或文件 application 已经存在。
=================================================== 开始对项目进行打包 当前打包环境为test

等待 0 秒,按一个键继续 ...
[INFO] Scanning for projects...
[WARNING]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] ZHBackend .......................................... SUCCESS [  0.183 s]
[INFO] zh_common .......................................... SUCCESS [  5.085 s]
[INFO] zh_auth ............................................ SUCCESS [  4.858 s]
[INFO] zh_eureka .......................................... SUCCESS [  0.646 s]
[INFO] zh_web ............................................. SUCCESS [  0.607 s]
[INFO] zh_usermanager ..................................... SUCCESS [  4.240 s]
[INFO] zh_linemanager ..................................... SUCCESS [  8.219 s]
[INFO] zh_filemanager ..................................... SUCCESS [  3.272 s]
[INFO] zh_admin_server .................................... SUCCESS [  1.994 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30.225 s
[INFO] Finished at: 2019-05-17T11:50:28+08:00
[INFO] Final Memory: 97M/917M
[INFO] ------------------------------------------------------------------------
=================================================== 打包完成,开始复制jar到application目录下

等待 0 秒,按一个键继续 ...
已复制         1 个文件。
已复制         1 个文件。
已复制         1 个文件。
已复制         1 个文件。
已复制         1 个文件。
已复制         1 个文件。
已复制         1 个文件。
已复制         1 个文件。
=================================================== 复制完成,添加压缩包,请检查jar包数量是否正确

等待 0 秒,按一个键继续 ...
正在从c d e f g h i盘中查找7z.exe程序,默认执行找到的第一个程序。

在c:\Program Files\7-Zip\7z.exe找到7z.exe,准备启动它...

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
1 folder, 8 files, 66000730 bytes (63 MiB)

Creating archive: D:\git\Backend\application.tar

Add new data to archive: 1 folder, 8 files, 66000730 bytes (63 MiB)


Files read from disk: 9
Archive size: 66008064 bytes (63 MiB)
Everything is Ok

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
1 file, 66008064 bytes (63 MiB)

Creating archive: D:\git\Backend\application.tar.gz

Add new data to archive: 1 file, 66008064 bytes (63 MiB)


Files read from disk: 1
Archive size: 59173895 bytes (57 MiB)
Everything is Ok
找不到 c:\application.tar
=================================================== application.rar及application.tar.gz文件已生成在D:\git\Backend下
=================================================== 请注意当前目录现分支为dev-test,请自行切换分支
请按任意键继续. . .

该脚本执行后生成的压缩文件


image.png

压缩文件内容如图:


image.png

2. 将打包好的应用上传到服务器

各客户机和服务器安装的文件上传工具都不一样,因此此步骤本文不做介绍

3. 服务器解压运行应用

编写脚本,功能为解压压缩包,运行解压后的相关应用
LINUX版shell脚本

#!/bin/bash
workdir=$(cd $(dirname $0); pwd)
rm -rf $workdir/application
echo 解压application.tar.gz到$workdir
tar -zxvf application.tar.gz
for file in $workdir/application/*.jar
do
        echo 正在运行$file 请检查日志
        nohup java -jar  $file >/dev/null 2>&1 &
done

WINDOWS版批处理脚本

@echo off
echo "删除历史文件"
del *.jar
del *.rar
del *.log
echo %cd% 
echo "启动批处理文件执行中······解压压缩包到当前目录"
start winrar x -ad application.rar
TIMEOUT /T 3
echo "遍历jar文件"
for /r %cd%\application\ %%i in (*.jar) do (
    TIMEOUT /T 3
    echo "运行jar:" %%i
    start java -jar %%i
)
pause

Linux环境下需修改shell脚本权限,使用chmod 777 run.sh 命令赋予run.sh的执行权
运行run.sh或者run.bat脚本
Linux下脚本将使用解压命令解压压缩包,并使用nohup命令执行java应用,使用ps -ef | grep java命令可以查看当前启动的java程序

image.png

登录eureka,所有微服务均已启动
image.png

本文中脚本仅针对文中项目适用,如需在其它项目适用请根据注释做适当修改。
记得点赞

你可能感兴趣的:(封闭生产环境手工批量部署脚本)