簡體   English   中英

從.net 3.5以編程方式訪問和更新tfs 2010構建參數

[英]accessing and updating tfs 2010 build parameters programmatically from .net 3.5

我可能在這里錯過了一些基本的東西,因為這似乎並沒有按照我期望的方式工作。 我並不是一個真正的熟人。

我有一個tfs 2010插件,可以監視票證更改事件並過濾所需的票證WIT更改。 這全部基於http://geekswithblogs.net/jakob/archive/2010/10/27/devleoping-and-debugging-server-side-event-handlers-in-tfs-2010.aspx

我在插件中提取了所有必需的變量,然后將其傳遞給構建引擎,該引擎實際上將推動構建。 讓我最難過的是,這些參數以xaml字符串或“字典並將其序列化為字符串”的形式推送。 現在,有一個庫Microsoft.TeamFoundation.Build.Workflow對此做了一些處理,但它似乎適用於.net 4,而tfs服務器正在.net 2中運行並且無法綁定它。 在廣泛鏈接的http://blogs.msdn.com/b/jpricket/archive/2010/03/25/tfs2010-queuing-a-build-from-code-with-custom-process-parameter-中討論了該方法values.aspx,但他只是使用了我無權訪問的DeserialzeProcessParameters方法。

我只是嘗試更新一些值,並且可以在幾行powershell中執行此操作,因此我認為自己可以解決此問題,但我遇到了麻煩。

生成請求的默認Buildrequest.parameters如下所示(將/ r / n轉換為新行。可以將其解析為XmlDocument的innerXml)。

如果我有如下所示的xml文檔,如何在C#中如何尋址和更新RestoreDatabase的值?

<Dictionary x:TypeArguments="x:String, x:Object" xmlns="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:mtbw="clr-namespace:Microsoft.TeamFoundation.Build.Workflow;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:mtbwa="clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Activities;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
            <mtbwa:BuildSettings x:Key="BuildSettings" ProjectsToBuild="$/EJTest/TFSServerEventHandler/TFSServerEventHandler.sln">
                            <mtbwa:BuildSettings.PlatformConfigurations>
                                            <mtbwa:PlatformConfigurationList Capacity="0" />
                            </mtbwa:BuildSettings.PlatformConfigurations>
            </mtbwa:BuildSettings>
            <mtbwa:TestSpecList x:Key="TestSpecs" Capacity="0" />
            <mtbwa:CodeAnalysisOption x:Key="RunCodeAnalysis">Never</mtbwa:CodeAnalysisOption>
            <x:Boolean x:Key="AssociateChangesetsAndWorkItems">False</x:Boolean>
            <x:Boolean x:Key="CreateWorkItem">False</x:Boolean>
            <x:Boolean x:Key="DropBuild">False</x:Boolean>
            <x:Boolean x:Key="PerformTestImpactAnalysis">False</x:Boolean>
            <x:Boolean x:Key="CreateLabel">False</x:Boolean>
            <x:Boolean x:Key="DisableTests">True</x:Boolean>
            <mtbw:BuildVerbosity x:Key="Verbosity">Detailed</mtbw:BuildVerbosity>
            <x:String x:Key="BuildNumber">4.4.2.29</x:String>
            <x:String x:Key="BackupDatabase">yes</x:String>
            <x:String x:Key="RestoreDatabase">Yes</x:String>
            <x:String x:Key="OverwriteBackup">Yes</x:String>
            <x:String x:Key="UpgradeSoftware">No</x:String>
            <x:String x:Key="DeploymentTicket">654</x:String>
</Dictionary>

x:string值是我要更新和更改的值。

值得的是,PS版本

[xml]$a = Get-Content .\test.xml
$b = $a.Dictionary.string | where {$_.key -eq "CustomerData"}
$b."#text" = 'No'

謝謝你的時間。

好吧,我撞了過去。 不確定這是最有效的方法,但它似乎可以工作:

        XmlDocument xDoc = new XmlDocument();
        xDoc.Load("test.xml");
        XmlNodeList elemList = xDoc.GetElementsByTagName("x:String");

        foreach (XmlNode xNode in elemList)
        {
            switch (xNode.Attributes[0].Value)
            {
                case "BuildNumber":
                    Console.WriteLine(xNode.Attributes[0].Value + " = " + xNode.InnerText);
                    xNode.InnerText = "4.3w2432.2";
                    break;

                case "BackupDatabase":
                    Console.WriteLine(xNode.Attributes[0].Value + " = " + xNode.InnerText);
                    xNode.InnerText = "4.3w2432.2";
                    break;

                case "RestoreDatabase":
                    Console.WriteLine(xNode.Attributes[0].Value + " = " + xNode.InnerText);
                    xNode.InnerText = "4.3w2432.2";
                    break;

                case "OverwriteBackup":
                    Console.WriteLine(xNode.Attributes[0].Value + " = " + xNode.InnerText);
                    xNode.InnerText = "4.3w2432.2";
                    break;

                case "UpgradeSoftware":
                    Console.WriteLine(xNode.Attributes[0].Value + " = " + xNode.InnerText);
                    xNode.InnerText = "4.3w2432.2";
                    break;

                case "DeploymentTicket":
                    Console.WriteLine(xNode.Attributes[0].Value + " = " + xNode.InnerText);
                    xNode.InnerText = "4.3w2432.2";
                    break;


            }

由於生成環境dll是.net 4.0 dll,而當前的dll是您需要使用適配器的(http://code.msdn.microsoft.com/windowsdesktop/Using-a-NET-4-Based-DLL-bb141db3 ,這樣您就可以使用對象模型正常啟動構建)或通過代碼中的tfsbuild.exe啟動構建。 這是因為您的值不會被序列化。

由於您在Powershell中列出了相同的功能,因此我想您已經在Powershell中。 如果是這種情況,您可能只需啟動tfsbuild.exe命令行即可啟動構建。 但是事實並非如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM