为何要通过脚本部署项目?
成长在jenkins+docker的自动化部署环境下的孩子无疑是幸福的,但受限于某些情况,例如我们本地开发,生产环境却是一个客户内网封闭环境的情况,就无法使用jenkins进行持续集成了。
此时如何实现高效率的部署呢?手动写脚本是一种比较省心的方式。理解jenkins的工作方式,我总结一般jar部署为一下几点:
- 从git拉取部署分支最新版本
- 使用maven对代码进行打包
- 将打包好的应用上传到服务器
- 编写脚本启动应用
以上面4点,本文将以实际项目介绍如何编写脚本实现上述功能
1. 编写脚本,拉取代码,将批量jar打包成压缩包
脚本运行前提:
- 该脚本为windows批处理脚本,在windows环境运行
- 该脚本应在父工程目录下执行,可以将所有子工程进行编译打包(项目结构如下)
- 该脚本执行了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
该脚本主要功能:
- 弹出命令行窗口,输入需要打包的分支,部署的profile
- 使用git命令检出该分支,并拉取最新代码
- 执行mvn打包命令,对整个父项目进行package
- 递归遍历父项目下文件夹内所有.jar文件,拷贝到创建好的application目录下
- 调用 winrar 压缩程序,将application文件夹压缩为application.rar压缩包(一个文件,用于上传到服务器为windows操作系统)
- 查找7z.exe 压缩程序,将application文件夹压缩为application.tar压缩包,再进行gz压缩为application.tar.gz文件
- 删除本脚本创建的临时文件及文件夹
@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程序
登录eureka,所有微服务均已启动
image.png
本文中脚本仅针对文中项目适用,如需在其它项目适用请根据注释做适当修改。
记得点赞
网友评论