项目中遇到一个复杂状况:项目分了6个工程,一个前端angular2的web工程。4个后台java的,两个基础一个Gen一个framework;三个机能,一个前台调用的api,一个批处理的batch,一个各种接口的intf。开发过程中由于多地开发,代码放在了外网的git上。现在进入结合测试,需要发布到客户的内网的结合服务器上Linux+tomcat。还必须用客户的版本管理工具svn和集成发布工具jenkins。这样造成了每次发布都需要把6个工程从外网git服务器上pull下来,然后把两个基础包打包,放到三个机能工程的lib下,提交到git服务器上。然后在把src和打好的基础包,放到commit到客户内容的svn上,触发用jenkins搭建了自动发布的任务。这中间手动作业太多,极容易出错,而且还需要时间很长。最快也要30-60分钟。今天抽了一天时间写了个脚本,由于能访问外网的全是windows,只好写bat了。一边摸索一边百度,终于搞定了。
需要安装的软件:
1,要从外网git服务器拉取和推送,所以必须有git客户端。这里用的 git version 2.9.3.windows.1
2,要对maven工程进行编译,必须安装maven。选择的是 Apache Maven 3.5.3,java8
3,前端工程要打包发布,必须有node.js和npm 选择node v8.9.1 ,npm 5.3.0
4,需要提交到svn服务器,必须有svn的客户端。选择 TortoiseSVN(安装时选中command line client tools)
5,有一些需要判断是否有差分,需要用到diff。这里用的是以前下载的一个windows版的diff.exe,具体版本不详。
具体的实现:
目录结构:
Deploy2SIT.bat 主脚本程序
030checkEnv.bat 环境安装检查
040getGitAll.bat git上代码取得
diff.exe 比较工具
git\ git上代码的取得路径 事先把git代码clone下来,并保存密码。
svn\ snv代码取得路径 事先svn代码也checkout下来,也保存上密码。
Deploy2SIT.bat概要:
::::::::010.取得系统时间用做日志文件文件名字
@echo off
for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set ct=%%a
set log=%ct:~0,14%.log
::::::::020.建立日志的目录
if not exist logs md logs
::::::::030.环境检查::::::::::::::
call 030checkEnv.bat >> logs\%log%
::::::::040.取得git上最新代码
echo 需要从Git上取代码,请确保你的网络处于能访问外网的状态!!!
pause
call 040getGitAll.bat >> logs\%log%
::::::::051.检查gen是否有变化
set chkflg = "diff git\gen\src srcback\gen\src -r"
if "%chkflg%" NEQ "" (echo Gen有差分,对Gen进行编译) else (echo "Gen没有差分")
::::::::052.编译GEN
cd git\gen
mvn package
if %errorlevel% NEQ 0 (echo Gen编译打包错误)
::::::::053.拷贝 Gen.jar 到各个文件夹
xcopy target\*.jar ..\..\svn\framework\libs\ /Y
...
::::::::056.01提交git的各个目录下的gen.jar和framework.jar
cd git\framework
git commit -m "提交gen.jar"
git push
cd ..\..
::::::::058.打包web
cd git\web
npm run buildsit
if %errorlevel% NEQ 0 (echo web编译打包错误)
::::::::060.将git代码copy到svn路径
echo 更新svn目录下所有代码,请确保网络连接能访问内网!!!
pause
::清除并替换source
del /f /s /q svn\api\src\*.*
xcopy git\api\src svn\api\src /E/Y
::结合测试环境的配置文件更新
xcopy svn\api\src\main\resources\config\application_sit.properties svn\api\src\main\resources\config\application.properties /Y
::::::::070.将svn路径下的最新代码提交
cd svn
::SVN追加新追加代码
svn add . --no-ignore --force
::commit变更和追加的代码
svn commit -m "自动从发布到sit环境" -q
if %errorlevel% NEQ 0 ( echo 代码提交错误失败 )
::::::::正常终了
exit /B 0
:er
::::::::异常终了
echo 异常终了,参照日志:logs\%log%.log
exit /B 1
030checkEnv.bat概要:
::::::::检查git环境
call git --version>nul
set giterr=%errorlevel%
if %errorlevel% EQU 0 ( echo git检查正常 ) else echo git没有正确安装
::::::::检查svn环境::::::::::::::
svn --version>nul
set svnerr=%errorlevel%
if %errorlevel% EQU 0 ( echo svn检查正常) else echo svn没有正确安装
::::::::检查Maven环境::::::::::::::
mvn -v>nul
set mvnerr=%errorlevel%
if %mvnerr% EQU 0 ( echo Maven检查正常) else echo Maven没有正确安装
::::::::检查npm环境::::::::::::::
npm-v>nul
set npmerr=%errorlevel%
if %npmerr% EQU 0 ( echo Maven检查正常) else echo Maven没有正确安装
if %giterr% NEQ 0 (goto er)
if %svnerr% NEQ 0 (goto er)
if %mvnerr% NEQ 0 (goto er)
if %npmerr% NEQ 0 (goto er)
exit /B 0
:er
exit /B 1
040getGitAll.bat概要
set work_path="git"
cd %work_path%
for /f "delims=" %%i in ('dir /b/ad ') do (
::.idea目录不做Pull
if not "[%%i]"=="[.idea]" (
call :merge_src %%i
)
)
goto:ed
:merge_src
rem %1 : path
echo "###############Repository %1 fetch start."
cd %1
git fetch --all
echo "###############Repository %1 merge start."
git merge
echo "###############Repository %1 merged."
cd ..
goto:eof
:ed
cd ..
exit /B 0
具体代码从这里下载:《代码下载》
遇到的坑:
1,安装 TortoiesSVN时,必须选中 command line clinet tools,否则svn命令不能执行。
2,diff的返回值用""来判断的时候,"%checkflg%"必须用双引号引起来
3,bat返回值设定必须用exit /B设定,否则调用侧取不到返回值。
4,bat函数定义用 :函数名字来定义