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 <> Then
WScript.Echo "Arguments Count Error"
wscript.quit
End If Set objFS = CreateObject("Scripting.FileSystemObject")
'version.h path
versionFilePath=Wscript.Arguments()
'ProductNameeProductDriver.ism path
driverFilePath=Wscript.Arguments() 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()
'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)> Then
versionPostfixLength=Len(strLine)-Len(versionPostfixString)
versionPostfix=Right(strLine,versionPostfixLength)
nextVersionPostfix=versionPostfix+
If nextVersionPostfix>= Then
nextVersionPostfix=
End If
strLine = Replace(strLine,versionPostfix,nextVersionPostfix)
End If
'Search if this line has versionPrefixString
If InStr(strLine,versionPrefixString)> Then
versionPrefixLength=Len(strLine)-Len(versionPrefixString)
versionPrefix=Right(strLine,versionPrefixLength)
versionPrefix=Left(versionPrefix,versionPrefixLength-)
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,)
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)> 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)> 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,)
driverFile.Write newDriverContent
driverFile.Close 'This is the file version number, return to the result.
WScript.Echo currentVersion
TFS build server搭建,搭建自动化构建服务器的更多相关文章
- TFS2010单独安装配置tfs build server
记录一下确实很磨人. 同样硬件和软件环境的两台服务器,其中一台服务器很久之前就配置好了tfs2010 build ,然后最近想再配置一台tfs build server,但是按照以前的配置流程始终提示 ...
- 搭建yeoman自动化构建工具
yeoman可以快速的搭建一个项目的手脚架,初次接触yeoman,在搭建的过程中遇到了很多的问题. yeoman需要node.js(http://nodejs.org)和git(http://git- ...
- Jenkins+Ant+TestNG+Testlink自动化构建集成(完整版)
这段时间折腾自动化测试,之前都是在Eclipse工程里面手工执行自动化测试脚本,调用Testlink API执行测试用例,目前搭建Jenkins自动化构建测试的方式,实现持续构建,执行自动化测试. 硬 ...
- Jenkins+Ant+TestNG+Testlink自动化构建集成
这段时间折腾自动化测试,之前都是在Eclipse工程里面手工执行自动化测试脚本,调用Testlink API执行测试用例,目前搭建Jenkins自动化构建测试的方式,实现持续构建,执行自动化测试. 硬 ...
- 边缘化搭建 DotNet Core 2.1 自动化构建和部署环境(上)
写在前面 写这篇文章的缘由是由于笔者的对新兴技术方向有所追求,但个人资产有限,只能容许购买一台阿里云低配1核2G服务器.服务器上搭建了 Centos7 & Docker & Jenki ...
- 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...
原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...
- 使用Hudson搭建自动构建服务器
环境: ubuntu1404_x64 说明: 使用hudson和git搭建自动构建服务器的简单示例 安装hudson及相关插件 安装hudson 安装命令如下: sudo sh -c "ec ...
- 我是如何进行Spring MVC文档翻译项目的环境搭建、项目管理及自动化构建工作的
感兴趣的同学可以关注这个翻译项目 . 我的博客原文 和 我的Github 前段时间翻译的Spring MVC官方文档完成了第一稿,相关的文章和仓库可以点击以下链接.这篇文章,主要是总结一下这个翻译项目 ...
- Geoserver+Openlayers+MySQL设计思想,GeoServer服务器搭建(Docker构建镜像)
Geoserver+Openlayers+MySQL设计思想,GeoServer服务器搭建(Docker构建镜像) 一.geoserver+openlayers+mysql主要设计思想 1.1 Geo ...
随机推荐
- angular.js小知识总结
angular-watch.html 代码如下: <script> var app = angular.module('app',[]); app.controller('ctrl',fu ...
- vue 基础-->进阶 教程(1): 基础(数据绑定)
第一章 建议学习时间4小时 课程共3章 前面的nodejs教程并没有停止更新,因为node项目需要用vue来实现界面部分,所以先插入一个vue教程,以免不会的同学不能很好的完成项目. 本教程,将从零 ...
- curl通过调用WebService查询当前天气
<?php /** * curl通过调用WebService查询北京的当前天气 */ header("Content-type: text/html; charset=utf-8&qu ...
- linq中日期格式转换或者比较,程序报错说不支持方法的解决办法
public void TestMethod1(){using (var _context = new hotelEntities()){var rq = DateTime.Now.Date;var ...
- div自身高度、屏幕高度
获取元素高度 scrollWidth //显示当前元素的宽度 scrollHeight //显示当前元素的高度 scrollLeft //显示当前元素的左边距左侧的距离 scroll ...
- JAVA基础——异常详解
JAVA异常与异常处理详解 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1 ...
- Spring Security 概念基础 验证流程
Spring Security 概念基础 验证流程 认证&授权 认证:确定是否为合法用户 授权:分配角色权限(分配角色,分配资源) 认证管理器(Authentication Manager) ...
- usaco training 4.1.2 Fence Rails 题解
Fence Rails题解 Burch, Kolstad, and Schrijvers Farmer John is trying to erect a fence around part of h ...
- Unity3D拖尾组件在Ui界面下正常显示
在项目中Canvas下UI添加拖尾效果,会发现Ui完全遮挡住了拖尾. 如果要正常显示通常需要对Canvas进行设置,Render Mode 我这里用的是-Camera模式 其次要对Material 下 ...
- 实现一个栈类,类似STL中的栈
1.思路讲解 stack集合类是一个简单的堆栈的实现. 这里有两个模板参数,T和size,T用于指定堆栈中的元素类型,my_size用于表示堆栈中项数的最大值. 类中添加方法isempty.isful ...