我正在为 TFS 开发几个自定义构建脚本,我想知道是否有开发、测试和部署 TFS 构建脚本的最佳实践。
您是否设置了与生产构建服务器分开的开发和 QC 环境?是否有其他方法可以将开发脚本的过程与构建过程的其余部分隔离开来,以便正在开发的构建脚本不会干扰“生产”构建?
Team Build 喜欢创建工作项、更新工作项和添加标签作为构建过程的一部分,我不希望在“测试”构建中发生这种情况。
jMM
在这里查看我的答案:模块化 TeamBuilds
您可以将核心功能分解到一个通用的 MSBuild 文件中,该文件包含在所有构建中。此外,所有这些文件都是您更广泛的分支结构的一部分,因此它们直接参与您预先存在的 SDLC,而无需任何额外工作。因此:
为了稍微扩展#2,让我们以“生产”与“测试”构建为例。您只想在生产版本中打开标签等功能。因此,您将从 TFSBuild.proj(以及 TFSBuild.Common.targets,如果它在那里定义)中删除 SkipLabel 属性,而是在 TFSBuild.Production.targets 和 TFSBuild.Test.targets 中设置它——当然,使用两个不同的值。
如前一个问题所述,TFSBuild.proj 是主 msbuild 文件,它控制构建的其余部分如何操作。这是我的样子:
<?xml version="1.0" encoding="utf-8"?>
<!-- DO NOT EDIT the project element - the ToolsVersion specified here does not prevent the solutions
and projects in the SolutionToBuild item group from targeting other versions of the .NET framework.
-->
<Project DefaultTargets="DesktopBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<!-- Import configuration for all MyCompany team builds -->
<Import Project="MyCompany.TeamBuild.Common.targets"/>
<!-- Import build-specific configurations -->
<Import Condition="'$(BuildDefinition)'=='Dev - quick'" Project="MyCompany.TeamBuild.Quick.targets" />
<Import Condition="'$(BuildDefinition)'=='Main - full'" Project="MyCompany.TeamBuild.Full.targets" />
<Import Condition="'$(BuildDefinition)'=='Main - quick'" Project="MyCompany.TeamBuild.Quick.targets" />
<Import Condition="'$(BuildDefinition)'=='Release - full'" Project="MyCompany.TeamBuild.Full.targets" />
<!-- This would be much cleaner as we add more branches, but msbuild doesn't support it :(
Imports are evaluated declaratively at parse-time, before any tasks execute
<Target Name="BeforeEndToEndIteration">
<RegexReplace Input="$(BuildDefinition)" Expression=".*\s-\s" Replacement="">
<Output TaskParameter="Output" PropertyName="BuildType" />
</RegexReplace>
</Target>
<Import Condition="$(BuildType)==full" Project="MyCompany.TeamBuild.Full.targets" />
<Import Condition="$(BuildType)==quick" Project="MyCompany.TeamBuild.Quick.targets" />
-->
</Project>
通过做类似的事情,您可以确保来自 Dev 分支的所有构建都是“快速”构建(这对您来说意味着没有标签等),来自 Release 分支的所有构建都是“完整”构建,并且来自 Main 分支的构建可以取决于用户从 Visual Studio / TSWA 启动的构建定义。就我自己而言,我使用持续集成设置了“快速”构建,并且每晚运行“完整”构建。