c# - TFS - 链式构建 - 如何将信息从一个构建传递到下一个构建?

标签 c# xaml tfs workflow-foundation tfsbuild

我正在研究一个 TFS 构建定义,该定义通过使用此处博客中的代码启动另一个构建:Queue another Team Build when one Team Build succeeds

我对帖子底部的前几条评论很感兴趣。基本上,我只想将第一个内部版本号传递给下一个版本。

更改 XAML 模板以传递 IBuildRequest 相当简单而不是 IBuildDefinition ...

<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>

更棘手的是将当前内部版本号添加到 ProcessParameters 中新的 IBuildRequest .

我可以看到如何使用 Default 添加代码行<Variable> 的属性像上面一样,但似乎每一行都必须返回一些东西。但是我想运行的一些行只是调用一个没有返回值的方法,例如将新元素添加到 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>

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

我对这些技术还很陌生,所以可能错过了一些基本知识。如果有人有不同的方法将以前的版本号传递给下一个版本,我们也将不胜感激。

非常感谢你能走到这一步:-)

最佳答案

感谢@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>

关于c# - TFS - 链式构建 - 如何将信息从一个构建传递到下一个构建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19078624/

相关文章:

c# - Asp.net MVC3 Razor View 引擎,使用 "Multiline @:"转义几行文本?

WPF 控件作为资源字典中的静态资源,用于多个 WPF 窗口?

xaml - 如何使用 XAML 在 UWP 应用程序中创建默认按钮?

TFS 2010-用于转换为分支的命令行

tfs - 在 TFS 上以 x86 构建 ASP.NET Core

c# - 使用 Kinect 查找肘部角度

c# - 使用 appsettings.Production.json 中的数组设置覆盖 appsettings.json 中的数组设置

c# - 在 Umbraco 7 中,我如何搜索具有自定义属性的所有成员?

Grid.IsSharedSizeScope 和 ItemsControl.ItemTemplate 的 WPF 布局问题

wcf - Team Foundation 服务的 SOAP 警报