TFS BuildHttpClient UpdateDefinition Пример C #

Мне нужно обновить определение сборки vNext программно. Причина необходимости программного обновления определения сборки заключается в том, что мы запускаем RTM-версию Team Foundation Server 2015, и с этого выпуска некоторые части определений сборки vNext не отображаются в веб-интерфейсе, и есть (как пока) нет другого способа их изменить. (Предполагается, что вы хотите сохранить свою базу данных в поддерживаемом состоянии и отказаться от непосредственного изменения базы данных.)

В нашей корпоративной среде и на всех машинах недавно произошла смена домена. Сервер TFS был перемещен в новый домен без проблем. Однако определение vNext Build имеет внутреннюю ссылку на старое имя сервера в поле URL, в котором все еще есть старое доменное имя внутри.

Пока что у меня есть следующий код, который должен обновлять URL каждого определения сборки определенного проекта. Вызов GetDefinitonsAsync явно возвращает мне правильную сборку DefinitionReferences, но UpdateDefinitionAsync, похоже, не имеет никакого эффекта.

   List<DefinitionReference> bds = new List<DefinitionReference>();
.
.
.
   {
        Uri tfsURI = new Uri("http://<tfsserver>:8080/tfs/<collection>");
        WindowsCredential wc = new WindowsCredential(true);
        BuildHttpClient bhc = new BuildHttpClient(tfsURI, new VssCredentials(wc));

        var task = Task.Run(async () => { bds = await bhc.GetDefinitionsAsync(project: "projectname"); });
        task.Wait();

        foreach (var bd in bds)
        {
            BuildDefinition b = (BuildDefinition)bd;
            b.Url = b.Url.Replace("<server>.<olddomain>", "<server>.<newdomain>");

            var task1 = Task.Run(async () => { await bhc.UpdateDefinitionAsync(b); });
            task1.Wait();
        }

    }

Этот фрагмент кода компилируется и запускается без ошибок. Однако, когда я позже исследую определение сборки, оно не было обновлено и остается прежним. Отладчик не видит никаких исключений, и нет соответствующих сообщений для просмотра событий или DebugView.

Что касается приведенного выше фрагмента кода, я не уверен, могу ли я получить BuildDefinition, который мне нужно передать в UpdateDefinition с помощью приведение DefinitionReference (подкласса) к BuildDefinition или нет, но я не вижу ничего близкого в классе BuildHttpClient, который дал бы мне BuildDefiniton из DefinitonReference.

Любая помощь будет принята с благодарностью. Спасибо!

0
задан 28 August 2016 в 19:16
1 ответ

Чтобы уточнить мой последний комментарий с кодом,

public partial class Form1 : Form
{
    List<DefinitionReference> bds = new List<DefinitionReference>();
    List<BuildDefinitionRevision> bdrs = new List<BuildDefinitionRevision>();
    Dictionary<string, BuildDefinition> defs = new Dictionary<string, BuildDefinition>();

    public Form1()
    {
        InitializeComponent();

        //Connect to TFS vNext API
        Uri tfsURI = new Uri("http://<servername>:8080/tfs/<collectionname>");
        WindowsCredential wc = new WindowsCredential(true);
        Microsoft.TeamFoundation.Build.WebApi.BuildHttpClient bhc = new Microsoft.TeamFoundation.Build.WebApi.BuildHttpClient(tfsURI, new VssCredentials(wc));

        //Populate builddefinitionreference list for the project
        var task = Task.Run(async () => { bds = await bhc.GetDefinitionsAsync(project: "<projectname>"); });
        task.Wait();

        foreach (var bd in bds)
        {
            Log(bd.Revision.ToString());
            Log(bd.Url);

            //Populate the definition revision reference list for this one build definition
            var task1 = Task.Run(async () => { bdrs = await bhc.GetDefinitionRevisionsAsync(project: bd.Project.Id, definitionId: bd.Id); });
            task1.Wait();

            //Go through the revisions of this one builddefinition.   In this case I am only interested
            //In updating the latest revision so I'm saving a copy of the last one.
            string LastDefinitionUrl = "";
            foreach (var bdr in bdrs)
            {
                Log(string.Format("Name: {0}, Revision: {1}, Comment: {2}, Url: {3}", bdr.Name, bdr.Revision, bdr.Comment, bdr.DefinitionUrl));
                LastDefinitionUrl = bdr.DefinitionUrl;
            }

            //Get the JSON for the complete BuildDefinition class.   The list above only contains
            //DefinitonReference class.
            var client = new WebClient();
            client.UseDefaultCredentials = true;
            var json = client.DownloadString(LastDefinitionUrl);

            //Convert the JSON to an actual builddefinition
            BuildDefinition result = JsonConvert.DeserializeObject<BuildDefinition>(json);

            //modify result here, if desired...

            //Save the builddefinition classes in a dictionary for this project as I construct them
            defs.Add(bd.Name, result);

            //Save the changes.  (i.e. this creates a new revision)
            var task2 = Task.Run(async () => { await bhc.UpdateDefinitionAsync(result, definitionId: bd.Id, project: bd.Project.Id); });
            task2.Wait();
        }

}

0
ответ дан 5 December 2019 в 09:38

Теги

Похожие вопросы