TFS build server搭建,搭建自动化构建服务器
TFS build 服务器的搭建主要步骤如下:
一:环境准备:
- 新建一台build服务器
- 安装Visual Studio。主要目的是: a. 生成Build脚本所需要的build命令;b.与TFS组合,方便下载最新源代码
- 安装TFS。在Build Server触发build时,会通过tfs的命令从源代码服务器下载最新代码
- 安装InstallShield。通过InstallShield命令自动打包软件包
- 启动Visual Studio,手动Mapping源代码到build server本地目录。(供源代码下载使用)
二:脚本代码的编写(.bat),以下是bat脚本文件的工作流程
- 启用Visual Studio tool,这样就可以使用visual studio的命令。
- 删除本地的所有代码
- 从服务器下载最新的源代码
- 开始触发最新源代码的Build
- 开始触发InstallShield项目的build
- 把最新生成的软件包.exe上传到某个文件夹备用
- checkout 项目源代码的版本文件并+1,大于9999则从1重新开始。
- checkout InstallShield的版本文件并+1
- checkin 以上两个文件,供下次使用。
三:编写一个计划任务,自动调用步骤二中的.bat脚本,完成build server的搭建
四:代码示例
以下是一个示例,共有两个文件,一个.bat文件,一个vbs文件。
.bat文件是整个build脚本的入口,负责整体build server脚本的流程和大部分的工作
.vbs文件主要是用来取出文件的版本信息;版本信息加1;并把新的版本号重新写入存储版本的文件
下面是这两个文件的代码,部分隐私信息已用*号处理
AutoBuildScript:
@echo off ::Need to manually configure the Path set VisualStudio2010Tool="C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86 set SourceCodeItemSpecPath="$/Company_1003/Product/dev/EGS/Product/source/Product/App/eProduct/eProduct-1.7.0/CLK/source/eProduct" set InstallshieldCommandTool="C:\Program Files (x86)\InstallShield\2012\System\IsCmdBld.exe" set TeamforgeProjectName="eProduct 1.7" set TeamforgePackage="eProduct 1.7" ::Relative Path, Manually configure if needed ::SourceCodeFolder e.g. "C:\Code\eProduct1.7\eProduct-1.7.0\CLK\source\eProduct" set SourceCodeFolder=%~f0\..\..\eProduct set ForceDownloadLatestSourceCode=True ::BuildSolutionFile e.g."C:\Code\eProduct1.7\eProduct-1.7.0\CLK\source\eProduct\2008sln\eProduct.sln" set BuildSolutionFile=%~f0\..\..\eProduct\2008sln\eProduct.sln ::BuildModel e.g. Debug or Release set BuildModel=Release ::eProductDriverProject e.g. "C:\Code\eProduct1.7\eProduct-1.7.0\CLK\source\eProduct\ProductNameeProductDriver\ProductNameeProductDriver.ism" set eProductDriverProject=%~f0\..\..\eProduct\ProductNameeProductDriver\ProductNameeProductDriver.ism ::TeamforgeUploadExecutableFile e.g. "C:\Data\SFEEUploadFiles\UploadFiles.exe" set TeamforgeUploadExecutableFile=%~f0\..\SFEEUploadFiles\UploadFiles.exe ::DriverReleaseFilePath e.g. "C:\Code\eProduct1.7\eProduct-1.7.0\CLK\source\eProduct\ProductNameeProductDriver\ProductNameeProductDriver\PROJECT_ASSISTANT\Release 1\DiskImages\DISK1" set DriverReleaseFilePath="%~f0\..\..\eProduct\ProductNameeProductDriver\ProductNameeProductDriver\PROJECT_ASSISTANT\Release 1\DiskImages\DISK1" ::e.g "C:\Code\eProduct1.7\eProduct-1.7.0\CLK\source\eProduct\libfsl\include\version.h" set VersionFilePath=%~f0\..\..\eProduct\libfsl\include\version.h ::e.g. "C:\Code\eProduct1.7\eProduct-1.7.0\CLK\source\eProduct\ProductNameeProductDriver\ProductNameeProductDriver.ism" set DriverFilePath=%~f0\..\..\eProduct\ProductNameeProductDriver\ProductNameeProductDriver.ism ::e.g. C:\Code\eProduct1.7\eProduct-1.7.0\CLK\source\eProduct\ProductNameeProductDriver\ProductNameeProductDriver\PROJECT_ASSISTANT\Interm\IsConfig.ini set DriverConfigFilePath=%~f0\..\..\eProduct\ProductNameeProductDriver\ProductNameeProductDriver\PROJECT_ASSISTANT\Interm\IsConfig.ini ::e.g. C:\Code\eProduct1.7\eProduct-1.7.0\CLK\source\eProduct\Product\2008win32\ set eProductReleaseFilePath=%~f0\..\..\eProduct\Product\2008win32\ set ModifyVersionVBSFilePath=%~f0\..\autoincreaseversionnumber.vbs set eProductDriverFilesPath=%~f0\..\..\eProduct\ProductNameeProductDriver\eProductDriverFiles set eProductDriverCreatePath=%~f0\..\..\eProduct\Product\2008win32\Create @echo on echo Set the vs 2010 command tool as the default command prompt. call %VisualStudio2010Tool% echo Start to download source code from TFS if not exist %SourceCodeFolder% ( echo please maping the tfs source code to build server local folder echo Build Failed. exit ) echo Delete the old source code rd %SourceCodeFolder%/s/q echo Downloading source code... IF %ForceDownloadLatestSourceCode% EQU False (tf get %SourceCodeItemSpecPath% /recursive) ELSE (tf get %SourceCodeItemSpecPath% /all /recursive) echo Download source code Finished. echo Start Build the solution MSBuild %BuildSolutionFile% /property:Configuration=%BuildModel% echo Build Finished. echo Start to build Installshield Project tf checkout %DriverConfigFilePath% echo Copy files under Create folder to eProduct Driver installer rd /s /q %eProductDriverFilesPath% md %eProductDriverFilesPath% xcopy /E /F /Y %eProductDriverCreatePath% %eProductDriverFilesPath% %InstallshieldCommandTool% -p %eProductDriverProject% echo Build Installshield Project Finished echo Start checkout and increase version number, then checkin the increased version number tf checkout %VersionFilePath% %DriverFilePath% for /f "delims=" %%i in ('cscript //nologo %ModifyVersionVBSFilePath% %VersionFilePath% %DriverFilePath%') do set "d=%%i" set TeamforgeVersion=%d% tf checkin %VersionFilePath% %DriverFilePath% /comment:"Build Server New Build on %TeamforgeVersion%" /noprompt /override:"Build Server Checkin" echo Start to Upload the Image files to Teamforge set eProductReleaseUploadFile=%eProductReleaseFilePath%eProduct%TeamforgeVersion%.ZIP if not exist %eProductReleaseUploadFile% ( echo Do not exist %eProductReleaseUploadFile%, maybe build solution failed. echo Build Failed. exit ) if not exist %DriverReleaseFilePath% ( echo Do not exist %DriverReleaseFilePath%, maybe build Driver Disk failed. echo Build Failed. exit ) %TeamforgeUploadExecutableFile% %eProductReleaseUploadFile% %TeamforgeProjectName% %TeamforgePackage% %TeamforgeVersion% "http://sourceforge.is.ad.Company.com/sf-soap43/services" "Cruise_Control" "Mikohn123" %TeamforgeUploadExecutableFile% %DriverReleaseFilePath% %TeamforgeProjectName% %TeamforgePackage% %TeamforgeVersion% "http://sourceforge.is.ad.Company.com/sf-soap43/services" "Cruise_Control" "Mikohn123" echo Upload the Image files to Teamforge Finished echo Build Finished. exit
Auto Increase Version Number:
If Wscript.Arguments.Count <> 2 Then WScript.Echo "Arguments Count Error" wscript.quit End If Set objFS = CreateObject("Scripting.FileSystemObject") 'version.h path versionFilePath=Wscript.Arguments(0) 'ProductNameeProductDriver.ism path driverFilePath=Wscript.Arguments(1) Dim newFileContent Dim newDriverContent Dim currentVersion Dim nextVersion 'Manually configure if needed. 'Below 5 variables is used for search the special version number 'This is used for search the postfix number 888 (e.g. 1.7.0.888) versionPostfixString="#define Product_INT_VERSION " 'This is used for search the prefix string 1.7.0 (e.g. 1.7.0.888) versionPrefixString="#define PACKAGE_VERSION " & chr(34) 'This is used for search the Product version number in ism file (e.g. 1.7.0.888) driverProductVersionPrefixString=" <row><td>ProductVersion</td><td>" 'This is used for search the EProduct version number in ism file (e.g. 1.7.0.888) driverEProductVersionPrefixString=" <row><td>EProductVERION</td><td>" 'the last charactor in the row (ism file) driverCommonPostfixString="</td><td/></row>" ' Auto Increase version.h file version number Set versionFile = objFS.OpenTextFile(versionFilePath) 'Read the lines one by one Do Until versionFile.AtEndOfStream strLine = versionFile.ReadLine ' Search if this line has versionPostfixString , Then get the postfix number and set the next number: nextVersionPostfix If InStr(strLine,versionPostfixString)> 0 Then versionPostfixLength=Len(strLine)-Len(versionPostfixString) versionPostfix=Right(strLine,versionPostfixLength) nextVersionPostfix=versionPostfix+1 If nextVersionPostfix>=1000 Then nextVersionPostfix=1 End If strLine = Replace(strLine,versionPostfix,nextVersionPostfix) End If 'Search if this line has versionPrefixString If InStr(strLine,versionPrefixString)> 0 Then versionPrefixLength=Len(strLine)-Len(versionPrefixString) versionPrefix=Right(strLine,versionPrefixLength) versionPrefix=Left(versionPrefix,versionPrefixLength-1) End If 'Store all the lines to newFileContent, it will be write to the version.h again. newFileContent = newFileContent & strLine & vbcrlf Loop versionFile.Close 'Write the new content to the version.h Set versionFile = objFS.OpenTextFile(versionFilePath,2) versionFile.Write newFileContent versionFile.Close currentVersion=versionPrefix & "." & versionPostfix nextVersion = versionPrefix & "." & nextVersionPostfix 'Auto increase driver version number Set driverFile = objFS.OpenTextFile(driverFilePath) 'Read the lines one by one Do Until driverFile.AtEndOfStream strLine = driverFile.ReadLine ' Search if this line has driverProductVersionPrefixString If InStr(strLine,driverProductVersionPrefixString)> 0 Then driverPreProductLength=Len(strLine)-Len(driverProductVersionPrefixString) driverLastVersionString=Right(strLine,driverPreProductLength) driverProductLength=Len(driverLastVersionString)-Len(driverCommonPostfixString) driverLastVersionString=Left(driverLastVersionString,driverProductLength) strLine = Replace(strLine,driverLastVersionString,nextVersion) End If 'Search if this line has driverEProductVersionPrefixString If InStr(strLine,driverEProductVersionPrefixString)> 0 Then driverPreEProductLength=Len(strLine)-Len(driverEProductVersionPrefixString) driverLastEProductVersionString=Right(strLine,driverPreEProductLength) driverEProductLength=Len(driverLastEProductVersionString)-Len(driverCommonPostfixString) driverLastEProductVersionString=Left(driverLastEProductVersionString,driverEProductLength) strLine = Replace(strLine,driverLastEProductVersionString,nextVersion) End If 'Store all the lines to newDriverContent, it will be write to the version.h again. newDriverContent = newDriverContent & strLine & vbcrlf Loop driverFile.Close 'Write the new content to the driver file Set driverFile = objFS.OpenTextFile(driverFilePath,2) driverFile.Write newDriverContent driverFile.Close 'This is the file version number, return to the result. WScript.Echo currentVersion