Заметки консультанта

Шамрай Александр Владимирович

Posts Tagged ‘api’

Создание WCF сервиса для обработки событий из Team Foundation Server или Team Services

Posted by Shamrai Alexander на Январь 24, 2018

Проекты TFS и VSTS включают в себя полезную функцию сервисных хуков, которая позволяет подписываться на различные события и интегрироваться с большим количество различных сервисов. А также отсылать информацию о событиях на собственные сервисы:

Данная функция очень полезна, если необходимо добавить дополнительною автоматизацию, которую TFS/VSTS не поддерживают. Например, создание пула дочерних задач, при переводе рабочего элемента в определенное состояние, или установка критической даты рассмотрения дефекта в зависимости от его важности и т.д.

В этой статье мы рассмотрим возможность создания wcf сервиса, который будет в состоянии «слушать» сообщения, которые приходят из TFS или VSTS.

Пример, как создать wcf сервис, который способен принимать входящие сообщения через метод POST, можно посмотреть здесь: https://www.codeproject.com/Articles/275279/Developing-WCF-Restful-Services-with-GET-and-POST.

Основные моменты, которые стоит отметить при создании сервиса:

  • В файле определения сервиса «имя_сервиса.svc» добавить атрибут:

Factory=»System.ServiceModel.Activation.WebServiceHostFactory»

  • Для метода, который будет в дальнейшем использовать для приема сообщений от TFS/VSTS указать атрибуты, которые будут укажут, что метод POST и работать он будет в json формате.

[OperationContract]

[WebInvoke(Method = «POST», RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]

  • Указать входящий параметр для метода как поток, который в дальнейшем будет преобразован в строку, а потом в нужный класс:

void WorkItemChangedEvent(Stream EventData);

Для конвертирования некоторой базовой информации можно использовать следующий пример класса:

public class WorkItemEventCore

{

[JsonProperty(«subscriptionId«)]

public string subscriptionId;

[JsonProperty(«notificationId«)]

public int notificationId;

[JsonProperty(«id«)]

public string id;

[JsonProperty(«eventType«)]

public string eventType;

[JsonProperty(«publisherId«)]

public string publisherId;

[JsonProperty(«message«)]

public MessageClass message;

[JsonProperty(«resourceVersion«)]

public string resourceVersion;

[JsonProperty(«createdDate«)]

public string createdDate;

}

Данный класс используется в методе при десериализации строки в экземпляр с помощью библиотек Newtonsoft.Json:

StreamReader _reader = new StreamReader(pEventData, Encoding.UTF8);

string _eventStr = _reader.ReadToEnd();

WorkItemEventCore _wieventcorre = JsonConvert.DeserializeObject<WorkItemEventCore>(_eventStr);

После развертывания решения на IIS можно выполнить тестирование метода. В моем случае создается подписка на VSTS на создание рабочего элемента:

Указывается адрес, на который отсылать сообщения, включая сервис и метод:

И после нажатия кнопки Test, можно получить информацию об успешности исполнения и пример отправленной нотификации:

Если выполнить отладку через подключение к сервису IIS, то можно увидеть следующий пример, который включает в себя экземпляр с информацией о событии и рабочем элементе:

Пример решения данной статьи находится здесь: https://github.com/ashamrai/tfevents

Реклама

Posted in Microsoft, Team Foundation Server, Visual Studio | Отмечено: , , , , | Leave a Comment »

Как получить список команд проекта и их настройки через API

Posted by Shamrai Alexander на Август 9, 2017

Для получения необходимой информации воспользуемся nuget пакетом Microsoft.TeamFoundationServer.ExtendedClient, который обеспечивает необходимые .Net библиотеки для работы как с Team Foundation Server, так и с Team Services. Если говорить о последовательности, который необходимо выполнить, то это можно представить следующими шагами:

  • Подключиться к коллекции проектов через класс TfsTeamProjectCollection:

TfsTeamProjectCollection _tpc = new TfsTeamProjectCollection(new Uri(«http://server:8080/Collection&#187;))

  • Получить сервис работы с рабочими элементами для выбранной коллекции:

WorkItemStore _wistore = _tpc.GetService<WorkItemStore>();

  • Получить сервис для работы с командами для выбранной коллекции:

TfsTeamService _teamService = _tpc.GetService<TfsTeamService>();

  • Набор все команд можно запросить через метод QueryTeams() сервиса работы с командами. Команды реализуются через класс TeamFoundationTeam:

var _teams = _teamService.QueryTeams(pProject.Uri.ToString());

  • Список участников команды можно получить через метод GetMembers класса TeamFoundationTeam.
  • Для работы с настройками команды (итерации, пути области и т.д.) используется также отдельный сервис TeamSettingsConfigurationService:

var _teamConfig = _tpc.GetService<TeamSettingsConfigurationService>();

  • В свою очередь настройки для команды можно получить через метод GetTeamConfigurations сервиса работы с настройками команд:

var _configs = _teamConfig.GetTeamConfigurations(new Guid[] {pTeam.Identity.TeamFoundationId});

Полный пример кода можно посмотреть ниже:

static List<TeamFoundationTeam> ListTeams(TfsTeamProjectCollection pTpc, Project pProject)

{

TfsTeamService _teamService = pTpc.GetService<TfsTeamService>();

var _teams = _teamService.QueryTeams(pProject.Uri.ToString());

return (from t in _teams select t).ToList();

}

static bool GetTeamsSettings(TfsTeamProjectCollection pTpc, TeamFoundationTeam pTeam)

{

try

{

var _teamConfig = pTpc.GetService<TeamSettingsConfigurationService>();

var _configs = _teamConfig.GetTeamConfigurations(new Guid[] { pTeam.Identity.TeamFoundationId });

Console.WriteLine(«============={0}==================», pTeam.Name);

Console.WriteLine(«Team Members: «);

foreach (var _member in pTeam.GetMembers(pTpc, MembershipQuery.Expanded))

Console.WriteLine(«Display Name: » + _member.DisplayName + » || Is active: » + _member.IsActive);

foreach( var _config in _configs)

{

Console.WriteLine(«Team current iteration: » + _config.TeamSettings.CurrentIterationPath);

Console.WriteLine(«Team selected iterations:»);

foreach (var _iteration in _config.TeamSettings.IterationPaths)

Console.WriteLine(_iteration);

Console.WriteLine(«Team selected areas:»);

foreach (var _area in _config.TeamSettings.TeamFieldValues)

Console.WriteLine(«Area path: » + _area.Value + » || Include children: » + _area.IncludeChildren.ToString());

}

Console.WriteLine(«===============================»);

}

catch (Exception)

{

return false;

}

return true;

}

static void Main(string[] args)

{

string _teamProject = «VSTSAgile»;

try

{

TfsTeamProjectCollection _tpc = new TfsTeamProjectCollection(new Uri(«http://server:8080/Collection&#187;));

WorkItemStore _wistore = _tpc.GetService<WorkItemStore>();

var _teams = ListTeams(_tpc, _wistore.Projects[_teamProject]);

foreach (var _team in _teams) GetTeamsSettings(_tpc, _team);

}

catch (Exception ex)

{

Console.WriteLine(«Error: » + ex.Message);

Console.WriteLine(ex.StackTrace);

}

}

Posted in Microsoft, Team Foundation Server, Visual Studio, visual studio team services | Отмечено: , , , , | Leave a Comment »

Создание коллекции проектов TFS 2015 через API

Posted by Shamrai Alexander на Декабрь 21, 2015

Для автоматизации создания коллекции проектов используется метод QueueCreateCollection через интерфейс ITeamProjectCollectionService, который формирует задачу на создание новой коллекции. Этот метод имеет следующие параметры:

QueueCreateCollection(string name /*Название*/, string description /*Описание*/, bool isDefault /*коллекция по умолчанию*/, string virtualDirectory /*виртуальная директория*/, TeamFoundationServiceHostStatus state /*состояние после создания*/, IDictionary<string, string> servicingTokens /*сервисные данные*/);

Если с простыми параметрами все понятно, то сложность заключается в получении сервисных маркеров для портала проектов и сервера отчетности. Для создания используются следующие ключи:

  • SharePointAction со значениями CreateSite или None
  • SharePointSitePath – относительный путь для сайтов SharePoint в коллекции
  • SharePointServer – ключ сервера SharePoint
  • ReportingAction со значениями CreateFolder или None
  • ReportFolder – относительный путь для отчетности коллекции
  • ReportServer – ключ сервера отчетности

Пример:

Dictionary<string, string> servicingTokens = new
Dictionary<string, string>();

servicingTokens.Add(«SharePointAction», «CreateSite»);

servicingTokens.Add(«SharePointSitePath», «sites/» + newCollectionName);

servicingTokens.Add(«ReportingAction», «CreateFolder

servicingTokens.Add(«ReportFolder», «/TfsReports/» + newCollectionName);

Данные серверов отчетности и сайтов SharePoint можно получить из сервисной задачи создания коллекции TFS, которая выполнялась ранее. Она имеет название «Microsoft.TeamFoundation.JobService.Extensions.Core.ServicingJobExtension». Получить ключи можно по следующему примеру:

TeamFoundationJobDefinition[] _jobs = _jobservice.QueryJobs();

IEnumerable<TeamFoundationJobDefinition> _job = from a in _jobs where a.ExtensionName == «Microsoft.TeamFoundation.JobService.Extensions.Core.ServicingJobExtension»
select a;

if (_job.Count() > 0)

{


TeamFoundationJobDefinition _createcollection = _job.ElementAt(0);


XmlNodeList _nodes = _createcollection.Data.SelectNodes(«ServicingTokens/KeyValueOfStringString»);


foreach (XmlNode _node in _nodes)

{


if (_node.FirstChild.Name == «Key» && _node.FirstChild.InnerText == «SharePointServer») servicingTokens.Add(_node.FirstChild.InnerText, _node.LastChild.InnerText);


if (_node.FirstChild.Name == «Key» && _node.FirstChild.InnerText == «ReportServer») servicingTokens.Add(_node.FirstChild.InnerText, _node.LastChild.InnerText);

}

}

Теперь осталось выполнить формирование задачи для создания новой коллекции:

ITeamProjectCollectionService _tpcService = _tfsc.GetService<ITeamProjectCollectionService>();

ServicingJobDetail _createJob = _tpcService.QueueCreateCollection(newCollectionName, «Collection from console app», false, string.Format(«~/{0}/», newCollectionName), TeamFoundationServiceHostStatus.Started, servicingTokens);

TeamProjectCollection tpc = _tpcService.WaitForCollectionServicingToComplete(_createJob);

Пример можно скачать здесь.

Posted in Microsoft, Team Foundation Server, Visual Studio | Отмечено: , | Leave a Comment »

 
%d такие блоггеры, как: