美文网首页学习
封闭生产环境手工批量部署脚本

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

作者: KICHUN | 来源:发表于2019-05-20 09:15 被阅读117次

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

    成长在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    <DIR>          zh_admin_server
    2019/05/17  09:58    <DIR>          zh_auth
    2019/05/17  09:51    <DIR>          zh_common
    2019/05/17  09:52    <DIR>          zh_eureka
    2019/05/17  09:52    <DIR>          zh_filemanager
    2019/05/17  09:52    <DIR>          zh_linemanager
    2019/05/17  09:52    <DIR>          zh_usermanager
    2019/05/17  09:52    <DIR>          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

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

    相关文章

      网友评论

        本文标题:封闭生产环境手工批量部署脚本

        本文链接:https://www.haomeiwen.com/subject/jqggaqtx.html