Получить текущий путь итерации из TFS
Я пытаюсь получить текущий путь итерации для проекта TFS команды. Я пытаюсь это сделать, используя блог http://blog.johnsworkshop.net/tfs11-api-reading-the-team-configuration-iterations-and-areas/. Я начну с получения конфигураций команды из следующего кода:
TfsTeamProjectCollection tpc = TFSConncetion(@"http://tfs/url");
var configSvc = tpc.GetService<TeamSettingsConfigurationService>();
var configs = configSvc.GetTeamConfigurationsForUser(projectUri);
Проблема в том, что мои конфиги всегда нулевые, хотя я и являюсь членом команды. Я уверен, что URI моих проектов также верен. После этого я получал настройки команды и использовал их для отображения текущего пути итерации.
TeamSettings ts = config.TeamSettings;
Console.WriteLine(ts.CurrentIterationPath);
Даже если это не сработало, я все равно могу запросить даты итераций в настройках команды, чтобы получить одну итерацию, которая имеет дату начала до сегодняшнего дня и дату окончания после сегодняшнего дня. Основная проблема заключается в том, что я не могу заставить свой TeamSettingsConfigurationService возвращать что-либо, кроме нуля, когда я пытаюсь получить конфигурации группы с помощью URI моих проектов.
3 ответа
Я на самом деле получил ответ сам, не используя TeamSettingsConfigurationService вообще. Вот как я это сделал:
private static XmlNode currentIterationNode;
TfsTeamProjectCollection tpc = TFSConncetion(@"http://tfs/url");
ICommonStructureService4 css = tpc.GetService<ICommonStructureService4>();;
WorkItemStore workItemStore = new WorkItemStore(tpc);
foreach (Project teamProject in workItemStore.Projects)
{
if (teamProject.Name.Equals("TeamProjectNameGoesHere"))
{
NodeInfo[] structures = css.ListStructures(teamProject.Uri.ToString());
NodeInfo iterations = structures.FirstOrDefault(n => n.StructureType.Equals("ProjectLifecycle"));
if (iterations != null)
{
XmlElement iterationsTree = css.GetNodesXml(new[] { iterations.Uri }, true);
XmlNodeList nodeList = iterationsTree.ChildNodes;
currentIterationNode = FindCurrentIteration(nodeList);
String currentIterationPath = currentIterationNode.Attributes["Path"].Value;
}
}
}
Где currentIterationPath - это текущий путь итерации из TFS. Ключом к этому было получение массива структур NodeInfo[] и итераций NodeInfo из этих двух строк кода, которые я получил от chamindacNavantis https://social.msdn.microsoft.com/Forums/vstudio/en-US/4b785ae7-66c0-47ee-a6d2-c0ad8a3bd420/tfs-get-iteration-dates-metadata?forum=tfsgeneral:
NodeInfo[] structures = css.ListStructures(teamProject.Uri.ToString());
NodeInfo iterations = structures.FirstOrDefault(n => n.StructureType.Equals("ProjectLifecycle"));
После этого я создал xml с узлами каждой итерации внутри командного проекта. Эти узлы также имеют даты начала и окончания каждой итерации. Поэтому я проверил каждый узел на дату начала до DateTime.Now и дату окончания после DateTime.Now, что делает все FindCurrentIteration(nodeList). И это даст вам текущий узел итерации.
Должно быть что-то не так с вашим сервером или проектом, который вы передаете, так как другой код выглядит нормально.
Может быть, попробовать что-то вроде этого:
TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri("http://server:8080/tfs/collection"),
new System.Net.NetworkCredential(tfsUserName, tfsPassword));
tpc.EnsureAuthenticated();
Подключение к Team Foundation Server из консольного приложения
Здесь есть хороший пример, который вы можете загрузить (клиент WPF), и он позволит вам выбрать соединение с сервером, Team Project и Team:
TFS API Part 46 (VS11) - настройки команды
Вы можете пройти через это и проверить значения, которые вы передаете в свой код.
Пример получает информацию о конфигурации команды так же, как в коде.
TeamSettingsConfigurationService teamConfig = tfs.GetService<TeamSettingsConfigurationService>();
var configs = teamConfig.GetTeamConfigurationsForUser(new[] { projectInfo.Uri });
Когда у вас есть коллекция TeamConfiguration
предметы то вам нужно TeamSettings.CurrentIterationPath
Я нашел самый простой способ сделать это, используя ICommonStructureService4
а также TeamSettingsConfigurationService
методы:
static TfsTeamProjectCollection _tfs = TfsTeamProjectCollectionFactory
.GetTeamProjectCollection("<tfsUri>")
(...)
static string GetCurrentIterationPath()
{
var css = _tfs.GetService<ICommonStructureService4>();
var teamProjectName = "<teamProjectName>";
var project = css.GetProjectFromName(teamProjectName);
var teamName = "<teamName>";
var teamSettingsStore = _tfs.GetService<TeamSettingsConfigurationService>();
var settings = teamSettingsStore
.GetTeamConfigurationsForUser(new[] { project.Uri })
.Where(c => c.TeamName == teamName)
.FirstOrDefault();
if (settings == null)
{
var currentUser = System.Threading.Thread.CurrentPrincipal.Identity.Name;
throw new InvalidOperationException(
$"User '{currentUser}' doesn't have access to '{teamName}' team project.");
}
return settings.TeamSettings.CurrentIterationPath;
}