Мне нужно программно обновить определение сборки 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.
Любая помощь будет оценена. Спасибо!
Чтобы уточнить мой последний комментарий с кодом,
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();
}
}