2011-05-19 61 views
3

我正在尝试使用自定义工作流活动来基于以前成功的构建自动增加内部版本号。这种方法与基于MSBuild的“工作流程”一起工作,但我似乎无法让TFS为当前正在运行的构建定义报告正确的“最后构建”。TFSBuild 2010自定义活动:IBuildDetail.LastGoodBuildUri == null?

我在做什么是很简单:

IBuildDetail build = context.GetExtension<IBuildDetail>(); 
IBuildDetail last = build.BuildServer.GetBuild(build.BuildDefinition.LastGoodBuildUri); 

我已经运行了一个成功的构建,其中我的代码活动被迫具有BuildName_1.0.0.0的版本号。但是,当我尝试获取此版本并提取版本号时,GetBuild抱怨LastGoodBuildUri为空。

我使用的自定义构建模板在末尾设置了CompilationStatusTestStatusBuildPhaseStatus.Succeeded,因此TFS应该能够判断这是一个很好的构建。我还有什么遗漏?

+0

嘿迈克尔,你是否设置了构建的FinishTime?这个构建的原因是什么? – 2011-05-20 03:41:09

+0

这些都是手动触发构建 - 我们不做CI或门控签入。不,我没有明确设置FinishTime,但我认为我已经拿起了默认模板所做的一切。由于我们没有也没有计划在VS2010 Test或VS2010 Lab版本上花费$$,所以我将所有相关内容全部删除。在那里我需要做些重要的事情吗? – 2011-05-20 16:31:09

+0

我想我误解了你的问题,我会在下面回答他们。 – 2011-05-20 16:46:04

回答

1

既然你正在运行一个自定义活动在这里面的代码,你需要确保:

  1. 构建(IBuildDetail)完成并保存在此之前,自定义活动的日程服务器。
  2. IBuildDetail实例或IBuildDefinition实例(build.BuildDefinition)被刷新,以从服务器获取最新更改。

您可以使用IBuildDetail.IsFinished来检查您的构建是否完成。如果完成,请使用IBuildDefinition.Refresh()刷新BuildDefinition对象。

希望这会有所帮助。

+0

我正在运行此代码的自定义操作发生在构建的早期 - 它将取代Set Drop Location序列中出现的默认构建编号逻辑。在这一点上,我试图读取Uri的这个构建定义的_previous_构建,这应该从一开始就可用。在TFS2008中,我需要的是存储在$(LastGoodBuildNumber)变量中,我只是试图从TFS2010对象模型中获取相同的信息。 – 2011-05-23 13:48:23

+0

我明白了,迈克尔。如果你有权访问数据库,你可以看看tbl_BuildDefinition,看看你的构建定义是否有正确的最后的良好构建信息?还要检查tbl_Build表中该构建定义的最后一个构建,以查看它对于编译状态,测试状态,构建原因和完成时间具有的值。如果我可以直接与您联系以调查此问题,请告知我们。 – 2011-05-23 14:34:08

+0

啊哈。是的,这是我的问题。当我需要使用SetBuildProperties活动时,我使用基本的Assigment活动来设置编译和测试状态 - 显然,我的状态更新没有保存。 – 2011-05-24 19:39:01