2013-09-29 26 views
2

我的工作,通过使用代码踢过另一个构建一个TFS生成定义博客在这里:Queue another Team Build when one Team Build succeedsTFS - 链接构建 - 如何将信息从一个构建传递到下一个构建?

我很感兴趣,在文章底部的第一对夫妇的意见。基本上,我只是想将第一个版本号传递给下一个版本。

这是相当简单的改变XAML模板传递一个IBuildRequest而不是​​...

<Sequence.Variables> 
    <Variable x:TypeArguments="mtbc:IBuildDefinition" Default="[BuildServer.GetBuildDefinition(BuildDetail.TeamProject, buildChainItem)]" Name="ChainedBuildDefinition" /> 
    <Variable x:TypeArguments="mtbc:IBuildRequest" Default="[BuildServer.CreateBuildRequest(ChainedBuildDefinition.Uri)]" Name="ChainedBuildRequest" /> 
    <Variable x:TypeArguments="mtbc:IQueuedBuild" Default="[BuildServer.QueueBuild(ChainedBuildRequest)]" Name="QueuedChainedBuild" /> 
</Sequence.Variables> 

什么被证明更加棘手的是将当前版本号为新IBuildRequestProcessParameters

我可以看到如何使用<Variable>像上面的Default属性添加的代码行,但似乎每行必须返回的东西。但是我想运行的一些行只是调用一个没有返回值的方法,例如将新元素添加到ProcessParameters字典中时。这是我已经尝试过...

<Sequence.Variables> 
    <Variable x:TypeArguments="mtbc:IBuildDefinition" Default="[BuildServer.GetBuildDefinition(BuildDetail.TeamProject, buildChainItem)]" Name="ChainedBuildDefinition" /> 
    <Variable x:TypeArguments="mtbc:IBuildRequest" Default="[BuildServer.CreateBuildRequest(ChainedBuildDefinition.Uri)]" Name="ChainedBuildRequest" /> 

    <Variable x:TypeArguments="x:String" Default="[ChainedBuildRequest.ProcessParameters]" Name="NextProcessParameters" /> 
    <!-- deserialize processparameters string into dictionary --> 
    <Variable x:TypeArguments="scg:IDictionary(x:String, x:Object)" Default="[WorkflowHelpers.DeserializeProcessParameters(NextProcessParameters)]" Name="DeserializedProcessParameters" /> 
    <!-- *** add new parameter, but no return value, so will not work *** --> 
    <Variable x:TypeArguments="x:String" Default="[DeserializedProcessParameters.Add(&quot;PreviousBuildNumber&quot;, &quot;1.1.1.1&quot;)]" Name="AddNewParameter" /> 
    <!-- serialize back into a string --> 
    <Variable x:TypeArguments="x:String" Default="[WorkflowHelpers.SerializeProcessParameters(DeserializedProcessParameters)]" Name="SerializedProcessParameters" /> 
    <!-- *** also no return value, so will not work *** --> 
    <Variable x:TypeArguments="x:String" Default="ChainedBuildRequest.ProcessParameters = SerializedProcessParameters" Name="UpdateProcessParameters" /> 

    <Variable x:TypeArguments="mtbc:IQueuedBuild" Default="[BuildServer.QueueBuild(ChainedBuildRequest)]" Name="QueuedChainedBuild" /> 
</Sequence.Variables> 

所以,我的第一个问题......是否有可能运行序列变量中没有返回值的代码行?

我对这些技术很陌生,所以可能错过了一些根本性的东西。如果有人有不同的方法将先前的版本号传递给下一个版本,那么也会非常感激。

非常感谢,如果你走到这一步:-)

+1

你可以尝试InvokeMethod活动: http://msdn.microsoft.com/en-us/library/vstudio/system.activities .statements.invokemethod(v = vs.100).aspx –

+0

谢谢Jason。它看起来很有希望。我会尽快尝试。在[WCF和WF Samples for .NET 4]中有一些优秀的例子(http://www.microsoft.com/en-us/download/details.aspx?id=21459) – davmos

回答

1

感谢@Jason Stangroome他原来的博客文章,指着我对InvokeMethod活动。凭借着出色的WCF & WF Samples for .NET 4的帮助下,我更新了XAML这样的:

<Sequence DisplayName="Queue chained build" sap:VirtualizedContainerService.HintSize="222,146"> 
    <Sequence.Variables> 
     <Variable x:TypeArguments="mtbc:IBuildDefinition" Default="[BuildServer.GetBuildDefinition(BuildDetail.TeamProject, buildChainItem)]" Name="ChainedBuildDefinition" /> 
     <Variable x:TypeArguments="mtbc:IBuildRequest" Default="[BuildServer.CreateBuildRequest(ChainedBuildDefinition.Uri)]" Name="ChainedBuildRequest" /> 
     <Variable x:TypeArguments="x:String" Default="[ChainedBuildRequest.ProcessParameters]" Name="NextBuildProcessParameters" /> 
     <Variable x:TypeArguments="scg:IDictionary(x:String, x:Object)" Default="[WorkflowHelpers.DeserializeProcessParameters(NextBuildProcessParameters)]" Name="DeserializedParameters" /> 
     <Variable x:TypeArguments="mtbc:IQueuedBuild" Name="QueuedChainedBuild" /> 
    </Sequence.Variables> 

    <sap:WorkflowViewStateService.ViewState> 
     <scg:Dictionary x:TypeArguments="x:String, x:Object"> 
      <x:Boolean x:Key="IsExpanded">True</x:Boolean> 
     </scg:Dictionary> 
    </sap:WorkflowViewStateService.ViewState> 

    <InvokeMethod DisplayName="Add current build number to ProcessParameters" sap:VirtualizedContainerService.HintSize="299.663333333333,127.553333333333" MethodName="Add"> 
     <InvokeMethod.TargetObject> 
      <InArgument x:TypeArguments="scg:IDictionary(x:String, x:Object)">[DeserializedParameters]</InArgument> 
     </InvokeMethod.TargetObject> 
     <InArgument x:TypeArguments="x:String">["ParentBuildNumber"]</InArgument> 
     <InArgument x:TypeArguments="x:Object">[BuildDetail.BuildNumber]</InArgument> 
    </InvokeMethod> 

    <InvokeMethod DisplayName="Re-serialize ProcessParameters" sap:VirtualizedContainerService.HintSize="299.663333333333,127.553333333333" MethodName="SerializeProcessParameters" TargetType="mtbw:WorkflowHelpers"> 
     <InvokeMethod.Result> 
      <OutArgument x:TypeArguments="x:String">[ChainedBuildRequest.ProcessParameters]</OutArgument> 
     </InvokeMethod.Result> 
     <InArgument x:TypeArguments="scg:IDictionary(x:String, x:Object)">[DeserializedParameters]</InArgument> 
    </InvokeMethod> 

    <InvokeMethod DisplayName="Queue Next Build" sap:VirtualizedContainerService.HintSize="299.663333333333,127.553333333333" MethodName="QueueBuild"> 
     <InvokeMethod.Result> 
      <OutArgument x:TypeArguments="mtbc:IQueuedBuild">[QueuedChainedBuild]</OutArgument> 
     </InvokeMethod.Result> 
     <InvokeMethod.TargetObject> 
      <InArgument x:TypeArguments="mtbc:IBuildServer">[BuildServer]</InArgument> 
     </InvokeMethod.TargetObject>      
     <InArgument x:TypeArguments="mtbc:IBuildRequest">[ChainedBuildRequest]</InArgument> 
    </InvokeMethod> 

    <mtbwa:WriteBuildMessage sap:VirtualizedContainerService.HintSize="200,22" Importance="[Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High]" Message="[String.Format(&quot;Queued chained build '{0}'&quot;, buildChainItem)]" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" /> 
</Sequence> 
相关问题