我想在TFS构建过程中执行以下步骤:
答案 0 :(得分:2)
第一个很简单。当您使用新的TFS 2013构建服务器和流程模板时,您只需在构建定义配置中添加构建后版本的PowerShell脚本,签入脚本并在构建期间运行它。
第二种方法取决于您是使用TFVC还是Git,在第一种情况下,使用VersionControlServer类查询BranchObjects,然后检查哪一个是您的工作文件夹的根目录。但请注意,在TFVC中,可以在一个工作空间中引用多个分支,因此该查询可能有多个答案,具体取决于您使用哪个文件查找branchroot。自定义CodeActivity可以解决这个问题,类似于this check in a custom checkin policy。
代码类似于:
IBuildDetail buildDetail = context.GetExtension<IBuildDetail>();
var workspace = buildDetail.BuildDefinition.Workspace;
var versionControlServer = buildDetail.BuildServer.TeamProjectCollection.GetService<VersionControlServer>();
var branches = versionControlServer.QueryRootBranchObjects(RecursionType.Full);
var referencedBranches = listOfFilePaths.GroupBy(
file =>
branches.SingleOrDefault(
branch => file.ServerItem.StartsWith(branch.Properties.RootItem.Item)
)
).Where(group => group.Key != null);
要获取yo工作区中所有项目的列表,您可以使用Workspace.GetItems
。
如果你正在使用Git,你也有一些选择。最简单的是invoke the command line:
git symbolic-ref --short HEAD
或深入LibGit2Sharp并使用它根据自定义活动中的当前工作文件夹查找分支名称。
如果要将其包含在MsBuild任务中,也可以这样做。这个答案完全概括了所需的步骤,但是一旦你知道该做什么就不那么难了。
Create a custom MsBuild task that invokes the same snippet of code above,但不是通过BuildDetail.BuildDefinition.Workspace
访问工作区,而是through the WorkStation
class:
Workstation workstation = Workstation.Current;
WorkspaceInfo info = workstation.GetLocalWorkspaceInfo(path);
TfsTeamProjectCollection collection = new TfsTeamProjectCollection(info.ServerUri);
Workspace workspace = info.GetWorkspace(collection);
VersionControlServer versionControlServer = collection.GetService<VersionControlServer>();
创建任务后,您可以创建一个自定义.targets
文件,该文件通过覆盖某些变量或在构建完成时复制数据来挂钩到MsBuild进程。您可以挂钩到多个目标,并定义是否需要在它们之前或之后执行某些操作。
您可以<import>
将这些内容放入每个项目中,也可以将其放在MsBuild版本的ImportAfter
或ImportBefore
文件夹中,以使其全局加载。你可以在这里找到这个文件夹:
C:\Program Files (x86)\MSBuild\{MsBuild Version}\Microsoft.Common.Targets\ImportAfter