Windows下用bat实现git的Pull和Push及SVN的update和commit及自动配布处理

     项目中遇到一个复杂状况:项目分了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函数定义用 :函数名字来定义

                 

你可能感兴趣的:(bat,jenkins)