最近進到的公司,因為我之前做過自動化測試,所以要求我寫一個從svn上面的各個目錄拉取需要的代碼,集合在一起打zip包。想了想,覺得用批處理+Jenkins持續集成工具來操作應該是可行的,於是就開始着手去做了,還真的是有些事情你去想了然后大膽去做了就會能實現。下面是我的實現過程:
1、首先你得安裝Jenkins,安裝Jenkins就不多說了,網上一搜一大把;
2、安裝好了就構建自由風格的任務,進入配置頁面
2.1、選擇參數化構建過程,根據自己需要選擇相應的參數類型
2.2、把svn相應的目錄作為參數寫入配置中
3、把需要的參數寫好后在構建的步驟選擇Execute Windows batch command,如果選項中沒有的自己去系統管理--》管理插件--》可安裝插件中搜索Execute Windows batch command安裝
4、這個步驟也是最重要的部分就是寫批處理代碼,寫入剛剛選擇的構建步驟中,下面是我的代碼:
代碼部分:
::disk是我上面設置的參數,是指打的包將要存放在哪個磁盤,Jenkins構建使用的目錄 set Jenkins=%disk%:\Jenkins ::svnupdate是構建使用目錄,因為我本機有全量自動化打包的目錄,為了區分就建了這個目錄 set svnupdate=%Jenkins%\svnupdate ::temp是每次構建使用的臨時目錄 set tempdir=%svnupdate%\temp ::sources目錄是作為構建后打包的備份目錄 set sources=%Jenkins%\sources ::版本起始-1是因為下面使用svn命令行比較差異文件時是不包括開始版本的,-1之后的參數放到svn比較差異文件的命令里面,參數就不用往前挪版本,開發給什么版本到什么版本直接填入參數就好 set /a from_version_up=%from_version%-1 if not exist %Jenkins% mkdir %Jenkins% if not exist %sources% mkdir %sources% if not exist %svnupdate% mkdir %svnupdate% if exist %tempdir% rd /s /Q %tempdir% if exist %svnupdate% del /s /q %svnupdate% if %type%==APP set folder=%city%/HTML/sources/%APPbranch% if %type%==DT (if %DLL%==old (set folder=%DLL%)else (if %DLL%==aa (set folder=%DLL%/%city%/test)else ( if %DLL%==差異驅動和配置文件 (set folder=%DLL%/%差異驅動和配置文件%)else ( set folder=%DLL%/test)))) if %DLL%==差異驅動和配置文件 set "folder=%folder: =%" if %type%==NJW (if %NJW%==EXPJS (set folder=%NJW%/trunk/n) else (set folder=%NJW%/nw)) set url=http://IP/svn/%type%/%folder% rem 把差異清單導入到txt文件中 set stringName=%svnupdate%\file_list.txt set stringName1=%svnupdate%\filelist.txt svn log -r %to_version%:%from_version% %url% >%svnupdate%\updatelog.txt svn diff -r %from_version_up%:%to_version% --summarize %url% > %stringName% --username svn賬號 --password svn密碼 ::如果svn有中文目錄,運行python的轉碼文件來識別,下面給出loop.py文件 python C:\loop.py %stringName% %stringName1% rem 導出差異文件 for /f "delims=" %%i in (%stringName1%) do ( if '%%i'=='' goto end call :export %%i ) for /f "delims=" %%i in (%svnupdate%\updatelog.txt) do ( for /f "tokens=1,2,3,4 delims=|" %%a in ("%%i") do (set a1=%%a && echo %%a|find "r">nul && goto next ) ) :next for /f "tokens=1,2 delims=r" %%a in ("%a1%") do (set a1=%%a) set "a1=%a1: =%" set path=%path%;c:\program files\winrar %disk%: cd %svnupdate% if %type%==APP mkdir %svnupdate%\app ::設置打包的名稱帶上時間 set update=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2% set update=%update: =0% if %type%==APP set updatezip=app_%city%_%from_version%-%a1%_%update%.zip if %type%==DLL (if %DLL%==aa (set updatezip=%DLL%_%city%_%from_version%-%a1%_%update%.zip) else (if %DLL%==差異驅動和配置文件 (set updatezip=%DLL%_%差異驅動和配置文件%_%from_version%-%a1%_%update%.zip) else (set updatezip=%DLL%_%from_version%-%a1%_%update%.zip))) if %type%==NJW set updatezip=%NJW%_%from_version%-%a1%_%update%.zip mkdir %update% if %type%==APP (xcopy /s/e/y %tempdir% %svnupdate%\app\) else (xcopy /s/e/y %tempdir% %svnupdate%\%update%\) if %type% NEQ APP cd %svnupdate%\%update% if %type%==APP (winrar a -r -m3 -ed %updatezip% .\app\*) else (winrar a -r -m3 -ed %updatezip% * && xcopy /s/e/y %updatezip% %svnupdate%\ && cd %svnupdate%\) if %type%==APP (rd /s /Q app) rd /s /Q %update% xcopy /s/y %svnupdate%\%updatezip% %sources%\ ::把備份的zip按時間順序列入到txt文件中 dir %sources%\*.zip /O:-D >%sources%\file.txt %disk%: cd %sources% ::刪除按時間排序后多余20個的zip文件 for /F "skip=25 tokens=4" %%a in (%sources%\file.txt) do @if exist %%a del %%a :end exit 0 :export set fullpath=%2 if %fullpath%==%url% goto :EOF if %fullpath%==%url%/DLL goto :EOF if %fullpath%==%url%/dll goto :EOF set filename=%~nx2 call set "filepath=%%fullpath:%filename%=%%" call set "filepath=%%filepath:%url%=%%" call set "filepath=%%filepath:/=\%%" if not exist %tempdir% mkdir %tempdir% set tempfilepath=%tempdir%%filepath% echo "%tempfilepath%"|find "\DLL">nul&& call set tempfilepath=%%tempfilepath:\DLL=\dll%% if not exist "%tempfilepath%" mkdir "%tempfilepath%" svn export -r %to_version% %fullpath% %tempfilepath%%filename% --force goto :EOF
(要求裝有python,下面代碼是python2.7寫的)下面是loop.py文件代碼:
#coding=utf-8 import sys import urllib import codecs a = sys.argv[1] #批處理輸入參數1 b = sys.argv[2] #批處理輸入參數2 f=open(a,"r") line=f.readline() fx = codecs.open(b, 'wb+', 'gb2312') while line: url = urllib.unquote(line)+"\r\n" content = unicode(url,"utf-8") fx.write(content) line = f.readline() fx.close() f.close()
這樣一個增量自動化打包就完成了,代碼肯定有改進的地方,有大神看到請指出