在Team Build上的post build事件中包含分支名称

时间:2015-06-14 11:40:51

标签: tfs msbuild workflow tfsbuild workflow-foundation

我想在TFS构建过程中执行以下步骤:

  • 做post post事件,将我编译的项目中的一些文件复制到另一个预定义目录,我希望该目录路径包含分支名称。
  • 我希望能够在我的xaml工作流模板中引用分支名称。

1 个答案:

答案 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版本的ImportAfterImportBefore文件夹中,以使其全局加载。你可以在这里找到这个文件夹:

C:\Program Files (x86)\MSBuild\{MsBuild Version}\Microsoft.Common.Targets\ImportAfter