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

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

Archive for the ‘Visual Studio’ Category

Как синхронизировать GIT репозитории между TFS, VSTS и GitHUB

Posted by Шамрай Александр на Январь 17, 2018

<< Перейти в раздел «Team Foundation Version Control FAQ»

Интересная статья по синхронизации TFS 2015, VSTS и GitHub через сервис сборки: https://blogs.microsoft.co.il/leonj/2017/01/24/synchronizing-tfs-2015-and-vsts-with-github/

Реклама

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

Salma for Word v2.0.4

Posted by Шамрай Александр на Декабрь 21, 2017

Выпустил очередное обновление для  Salma for Word: https://github.com/ashamrai/Salma/releases/tag/v2.0.4

Что нового:

1. Отказ от использования TFS Object Model в сторону Microsoft Team Foundation Server Extended Client. Это позволило обеспечить простую поддержку Visual Studio Team Services.

2. Добавлена функция для «устаревания» рабочих элементов. Очень часто возникает вопрос: что делать, если требование устарело? С точки зрения TFS/VSTS можно выполнить следующие шаги:

  • Просто перевести требование из закрытого состояния в активное. Но это в свою очередь «подтягивает» все ссылки, которые есть в требовании, допустим, уже закрытые работы, что будет потом отображаться в планах.
  • Можно выполнить копирование требования стандартными функциями, но в этом случае, если была декомпозиция требования на дочерние, связи не будут перенесены. А также необходимо как-то пометить требование источник, что оно уже не актуально.

Поэтому из инструмента можно выполнить:

  • Копирование требования со всем содержимым в новое требование.
  • Перенести или скопировать необходимые ссылки в новое требование.
  • Пометить старое требование в его наименовании и/или с помощью тега.
  • Сохранить ссылку на требование источник.

obs_req

3. Автоматически связывать требование и документ. Если документ, находится в сетевом доступе, то можно выполнить настройку, чтоб при создании нового требования, автоматически вставлял ссылка на документ, в котором это требование «родилось». Соответственно, из требования всегда можно открыть документ-источник и просмотреть его контекст.

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

Вебинар «Организация конвейера по производству ПО на основе VSTS» — Видео

Posted by Шамрай Александр на Декабрь 13, 2017

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

Отчет по возрасту ошибок в TFS

Posted by Шамрай Александр на Апрель 3, 2017

«Борьба» с техническим долгом команды является неотъемлемой частью любого процесса разработки. Команда всегда старается минимизировать количество существующих проблем, но зачастую для нового релиза устанавливаются пороги качества, которым он должен соответствовать, и в него входит пограничное количество ошибок определенной важности. Пороги могут варьировать в зависимости от сложности проекта, а иногда приходится выпускать релиз с превышением установленных порогов, находясь под давлением различных обстоятельств (дедлайны, требования заказчика или прямого руководства). В случае если выпущенный релиз содержит ошибки с высокой важностью, то команда старается описать ее как «известную проблему» и в ближайшее время старается ее решить. TFS обеспечивает необходимые отчеты, которые позволяют акцентировать внимание на текущие проблемы качества и их тренды. Но, к сожалению, нет отчетов, которые бы показали насколько старыми являются наши ошибки или насколько долго они находятся в определенном состоянии. Такие отчеты позволяют шире посмотреть на существующие ошибки:

  1. Если ошибка долго находится в зарегистрированном состоянии, то она соответственно длительное время мешает нашему заказчику и влияет на наш авторитет. Поэтому, возможно, стоит повысить приоритет этой ошибки.
  2. Если ошибка находится долго в активном состоянии, то в этом тоже нет ничего хорошего. Т.е. либо разработчик больше не уделяет ей внимания, либо просто не знает, как с ней справиться.

Ниже рассмотрим пример создания подобного отчета. Для этих целей мы воспользуемся возможностями Report Server. Чтобы получать информацию о последнем изменении состояния, нам понадобится соответствующее поле. Такое поле в принципе в TFS поставляется из коробки, но оно не попадает в отчетную базу данных, т.к. не нас троен соответствующий атрибут. Пройдемся по шагам для создания нашего отчета.

  1. Поле для отслеживания изменения состояния. Это поле «Microsoft.VSTS.Common.StateChangeDate», которое обновляется при изменении состоянии соответствующей датой. Для того, чтобы оно попадало в отчетную базу, ему нужно установить атрибут Reportable в значение dimension. Для этого мы воспользуемся TFS Power Tools. На скриншотах ниже отображена последовательность шагов для обновления. После изменения атрибута сохраняем результаты работы.

Рисунок 1. Изменение свойства отчетности для поля

  1. Шаблон отчета. ALM Ranger-ы выпустили Руководство по отчетности TFS, которое было переведено в рамках данного блога. Данное руководство содержит предварительно подготовленный шаблон отчета на английском языке. Тут можно получить шаблон на русском языке. Шаблон отчета открываем в Report Builder и сохраняем в необходимом каталоге проекта на сервере отчетности.
  2. Параметры отчета. Для отчета можно установить параметры, которые позволят сузить количество выдаваемой информации, например, по состояниям. Для этого мы добавим новый параметр, установим для него возможные значения, установим значение по умолчанию.

Рисунок 2. Добавление нового параметра

Рисунок 3. Список выбора для параметра

  1. Набор данных отчета. Набор данных включает в себя запрос, который должен отобрать необходимые ошибки согласно заданным параметрам и при этом установить соответствующий атрибут его возраста. В рамках данного запроса устанавливаются атрибуты 1 неделя, 2 недели, 3 недели, 4 недели и более. Пример запроса:
SELECT

CurrentWorkItemView.System_Id

,CurrentWorkItemView.System_Title

,CurrentWorkItemView.System_State

,CurrentWorkItemView.System_AssignedTo

,CurrentWorkItemView.Microsoft_VSTS_Common_Priority

,CurrentWorkItemView.Microsoft_VSTS_Common_Severity

,CurrentWorkItemView.Microsoft_VSTS_Common_StateChangeDate

,CurrentWorkItemView.System_CreatedDate

,CASE WHEN (DATEDIFF(day, CurrentWorkItemView.Microsoft_VSTS_Common_StateChangeDate, GETDATE())>0) AND (DATEDIFF(day, CurrentWorkItemView.Microsoft_VSTS_Common_StateChangeDate, GETDATE())<8) THEN 1 ELSE 0 END One_Week

,CASE WHEN (DATEDIFF(day, CurrentWorkItemView.Microsoft_VSTS_Common_StateChangeDate, GETDATE())>7) AND (DATEDIFF(day, CurrentWorkItemView.Microsoft_VSTS_Common_StateChangeDate, GETDATE())<15) THEN 1 ELSE 0 END Two_Weeks

,CASE WHEN (DATEDIFF(day, CurrentWorkItemView.Microsoft_VSTS_Common_StateChangeDate, GETDATE())>14) AND (DATEDIFF(day, CurrentWorkItemView.Microsoft_VSTS_Common_StateChangeDate, GETDATE())<22) THEN 1 ELSE 0 END Three_Weeks

,CASE WHEN (DATEDIFF(day, CurrentWorkItemView.Microsoft_VSTS_Common_StateChangeDate, GETDATE())>21) AND (DATEDIFF(day, CurrentWorkItemView.Microsoft_VSTS_Common_StateChangeDate, GETDATE())<29) THEN 1 ELSE 0 END Four_Weeks

,CASE WHEN (DATEDIFF(day, CurrentWorkItemView.Microsoft_VSTS_Common_StateChangeDate, GETDATE())>28) THEN 1 ELSE 0 END Very_Old

FROM

CurrentWorkItemView

WHERE

CurrentWorkItemView.System_WorkItemType = N’Ошибка’

AND CurrentWorkItemView.System_State IN (@State)

AND CurrentWorkItemView.ProjectNodeGUID = @ProjectGuid

  1. Отображение отчета. Отчет может быть представлен в табличном или графическом виде. Мы же воспользуемся столбиковой диаграммой. Шаги установки атрибутов диаграммы отображены ниже.

Рисунок 4. Выбор набора данных для диаграммы

Рисунок 5. Тип диаграммы

Рисунок 6. Выбор полей для диаграммы

Рисунок 7. Стиль диаграммы

  1. Отчет готов. Можно оценить его результат.

Рисунок 8. Отчет «Возраст ошибок»

Готовый отчет можно скачать здесь.

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

Работа с контейнерами и сервисами на основе Docker и Visual Studio Team Services

Posted by Шамрай Александр на Март 22, 2017

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

Возможности по интеграции Team Foundation Server и Oracle — Видео

Posted by Шамрай Александр на Январь 18, 2017

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

Использование TFS REST API на примере решения для учета времени, потраченного на задачи

Posted by Шамрай Александр на Июль 14, 2016

На сегодняшний день TFS предоставляет следующие основные механизмы для взаимодействия со своими данными внешним приложениям:

  • TFS API на основе клиентский и серверных моделей взаимодействия, которые обеспечивают доступ ко всем необходимым функциям и объектам TFS. Для работы этого подхода необходимо иметь соответствующие библиотеки, которые позволят выполнять необходимые операции.
  • Командная строка tf, которая обеспечивает взаимодействие с сервером для операций с версионным контролем TFVC.
  • Набор инструментов TFS Power Tools дают дополнительные возможности для работы из командной строки для оперирования с рабочими элементами, запросами, а также дополнительные возможности для использования Power Shell.
  • TFS REST API взаимодействие с сервером TFS на основе запросов в формате Json. Этот механизм не настолько богат набором функций как первый, но является в общем достаточным для обеспечения интеграционных задач. Кроме этого плюсом данного механизма является то, что нет необходимости устанавливать клиентские библиотеки, а в случае с VS 2015 необходимо устанавливать всю студию, т.к. Team Explorer отдельно объектная модель не поставляется.

В рамках данного поста мы рассмотрим, как можно использовать Rest Api, чтоб получить информацию о рабочих элементах и зарегистрировать свои. Пример использования приложен к статье в виде таймтрекер клиента, который позволяет подсчитывать потраченное на активности время и привязывать это к конкретной задаче, ошибке и т.д. Основные операции, которые выполняются приложением через REST API:

  • Получение информации об активных рабочих элементах, назначенных на текущего пользователя.
  • Создание рабочего элемента Активность и его связывание с родительским рабочим элементом из предыдущего пункта.
  • Обновление информации о времени в родительском рабочем элементе.

Выполнение запросов к TFS

Взаимодействие с сервером TFS или службой VSO выполняется на основе HTTP запросов в формате JSON. Вся основная информация о доступных методах находится по следующему адресу: https://www.visualstudio.com/en-us/docs/integrate/api/overview

Для подключения к серверу и выполнения запросов используется HttpClient, пример использования которого отображен ниже:

В первой части функции организуется подключение в зависимости от настроек приложения. Можно выполнять подключение через значения имени и пользователя по умолчанию или указывать необходимые данные для авторизации. Во второй части выполняется создание асинхронных запросов со следующими методами:

  • GET – используется в основном для получения какой-либо информации, например, рабочего элемента или запроса по рабочим элементам.
  • POST – в рамках примера используется для выполнения запроса по рабочим элементам на основе Work item query language.
  • PATCH – для создания и обновления рабочих элементов. Т.к. данный пункт не реализован стандартными методами, то выполняется создание нового метода через new HttpMethod(«PATCH»).

Выполнение запросов на основе WIQL

В рамках примера WIQL используется для получения активных рабочих элементов. Подробнее можно посмотреть здесь: https://www.visualstudio.com/en-us/docs/integrate/api/wit/wiql.

Для выполнения запроса необходимо отправить запрос в соответствующей структуре и разобрать полученный ответ. Для этой цели можно использовать решение Newtonsoft.Json, которое позволяет быстро сформировать необходимые классы и налету преобразовывать их в соответствующий вид. Пример классов ниже.

  • Для формирования запроса используется класс с единственным свойством, которое будет содержать передаваемый запрос WIQL

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

Пример использования классов для получения необходимого списка рабочих элементов отображен ниже:

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

string QueryWisReq = «{Url сервера}/{Имя коллекции}/_apis/wit/wiql?api-version=1.0»;

Далее создается экземпляр класса для запроса по рабочим элементам и его свойству присваивается соответствующее значение, в нашем случае задается запрос, который отбирает все назначенные на исполнителя рабочие элементы в состоянии Активно. Следующим шагом выполняется преобразование класса в JSON формат и его передача в тело запроса к серверу TFS с использованием метода POST. Результат запроса преобразовывается в экземпляр класса FlatQueryResult, из которого мы получаем необходимый для нас список идентификаторов рабочих элементов.

Создание рабочего элемента

Подробную информацию о доступных методах для оперирования с рабочими элементами можно посмотреть здесь: https://www.visualstudio.com/en-us/docs/integrate/api/wit/work-items. При создании нового рабочего элемента задается запрос, который в своем теле несет информацию о новых атрибутах, включающие в себя:

  • Информацию о полях и их значениях:

  • Информацию о ссылках:


Пример использования классов для создания рабочих элементов отображен ниже:

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

  • op – отражает операцию с полем, при присваивании значения можно использовать выражение «add»;
  • path – путь к полю, которое формируется через слияние строк «/fields/» и имя-ссылка на поле;
  • value – содержимое поля при создании рабочего элемента.

Кроме этого добавляется информация о ссылках. В данном случае добавляется ссылка для родительского элемента с системным наименованием «System.LinkTypes.Hierarchy-Reverse», которая также является заблокированной, т.е. ее невозможно удалить стандартными средствами TFS:

_lnks.value.attributes.isLocked = true;

Для создания рабочего элемента формируется запрос:

string urlCreateWI = «{Url сервера}/{Имя коллекции}/{Имя проекта}/_apis/wit/workitems/${Тип рабочего элемента}?api-version=1.0»;

Результат запроса в свою очередь преобразовывается в экземпляр класса WorkItemAtrr, описание которого можно увидеть в исходно коде приложении для примера.

Исходный код приложения для примера

Для того, чтобы посмотреть подробнее как используют приведенные выше примеры, а также другие методы, можно перейти по ссылке https://tfstimetracker.codeplex.com/

Использование приложения, которое приведено для примера

Данное решение выработано на основе предыдущих статей по учету рабочего времени Организация управления расписаниями (Timesheet) в TFS и позволяет автоматизировать учет потраченных часов на выполнение поставленных задач. Приложение выполняет следующие основные функции:

  • Конфигурирование приложения. В данном случае необходимо указать путь к серверу и коллекцию, с которыми необходимо работать, отображаемое имя, по которому выполняется поиск активных назначенных на сотрудника рабочих элементов, а также, если необходимо, параметры авторизации. Кроме этого конфигурируются настройки по рабочим элементам: какой рабочий элемент отвечает за активность, какое состояние считается как «Активное», какие типы активностей могут использоваться.

Рисунок 1.Настройка параметров подключения к TFS

Рисунок 2. Настройка рабочих элементов

  • Выбор активных рабочих элементов и запуск подсчета времени. Решение выполняет поиск рабочих элементов по всем командным проектам и, когда пользователь выбрал необходимый, начинает подсчет времени. Также предусмотрена функция паузы, которую можно активировать нажатием соответствующей кнопки или активируется автоматически, если пользователь 10 минут ничего не делает за рабочим местом.

Рисунок 3. Выбор активных задач с помощью меню

  • Сохранение информации о затраченном времени. При нажатии на кнопку Стоп создается рабочий элемент (в примере Активность), который содержит информацию о времени, типе активности и комментарий. Также данный рабочий элемент связывается родительской связью с выбранной на предыдущем шаге задачей (или дефектом), в которой в свою очередь также обновляется информация о затраченном и оставшемся времени.

Рисунок 4. Сохранение информации о потраченном времени на задачу

Рисунок 5. Новая активность и родительская задача

Итог

Как видно из примера, использование REST API при работе с рабочими элементами обеспечивает достаточную функциональность и при этом невысокую сложность. Отдельным плюсом является то, что данный подход является кроссплатформенным без необходимости использования каких-либо отдельных клиентских библиотек.

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

Улучшения TFS 2015 Update 2 на примере работы с проблемами

Posted by Шамрай Александр на Март 18, 2016

TFS 2015 Update 2 предлагает много различных обновлений, включая релиз менеджер, который теперь доступен через Web-интерфейс, а также работает с VMWare и System Center. Но есть также как, казалось бы, небольшие, но полезные функции. Например, функция подстановки отображаемого имени пользователя через символ «@». С использованием этого нововведения можно улучшить некоторые процессы внутри команды разработки, например, управление проблемами.

Зачастую этот процесс решается по довольно привычному пути — через телефон или корпоративную почту. Например, если возникает какой-либо вопрос, нужно что-либо уточнить, то инициатор в первую очередь пытается как-то решить проблему сразу личным общением, а если не получается, то начинает «писать письма». В больших компаниях таких писем очень много и существует много методик и советов как правильно работать с корпоративной почтой, но вряд ли все им следуют, что превращает почтовый ящик в солидный архив корреспонденции. Исходя из этого появляется небольшой список затруднений, связанных с электронной почтой:

  1. При большом количестве почты, включая обычно еще письма, в которых мы стоим просто в копии, получатель просто может упустить важное для него письмо и проблема долгое время остается незамеченной и нерешенной.
  2. Получатель может откладывать ответ для инициатора ввиду своей занятости, пока просто про него не забудет.
  3. Т.к. письмо в общем случае находится только в почтовых ящиках инициатора и получателя, то о процессе решения возникшей проблемы знает немного людей.
  4. Если в какой-то момент приходит точка Х, в которой нужно понять, что происходило, то это приводит к поиску в почтовом ящике, переборе потоков обсуждений и писем, а сделать это доступным для других участников можно только форвардом или распечатыванием потока обсуждения.
  5. Т.к. почта остается в личном ящике, то полученный опыт при решении проблем не может быть доступен для всех участников команды. А это может привести к повторному прохождению пути при решении схожих или этих же проблем.
  6. Невозможно понять сколько проблем у нас возникает, сколько мы решили, сколько еще нужно решить и сколько мы потратили на это времени.

Использование TFS может помочь упростить этот процесс:

  • Для управления проблемами в различных шаблонах существуют необходимые рабочие элементы, например, CMMI имеет Проблемы, Agile — препятствия, Scrum – также препятствия. Инициатор создает соответствующий рабочий элемент в командном проекте, назначает на исполнителя, который может решить проблему, и она доступна всем участникам разработки, включая руководителя проекта. Использование рабочего элемента позволяет определить правила обработки и эскалации при решении проблем.
  • Через символ «@» к решению проблемы можно привлечь необходимое количество людей, которые могут что-то подсказать или направить по нужному пути. Данную возможность можно использовать в комментариях для рабочего элемента, при этом им будет отправлено системой оповещение.

Рисунок 1. добавление участников к обсуждению

Рисунок 2. Пример нотификации

  • Запросы по рабочим элементам позволяют видеть, что у нас с проблемами в проекте, что с моими проблемами, а также, что происходит с проблемами, в которых я участвовал. Это решается с использованием поиска соответствующего отображаемого имени поле Кому назначено, Кем создано и в истории рабочих элементов.

Рисунок 3. Пример запроса по рабочим элементам

  • Использование Report Server позволит собрать отчетную информацию по нашим проблемам, в том числе, если вы используете TimeSheet, что обсуждалось ранее, то вы можете учитывать время, которое было потрачено на их решение.
  • Все проблемы остаются в TFS, поэтому всегда можно организовать писк их решения через запросы по рабочим элементам и через стандартный механизм быстрого поиска TFS.

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

Организация управления расписаниями (Timesheet) в TFS

Posted by Шамрай Александр на Март 10, 2016

Если вам необходимо точно отслеживать время и активности, которые происходят при выполнении задач, а также время, которое тратится на различные собрания и другие общие активности, а при этом нет желания покупать и интегрироваться со сторонними решения, то можно воспользоваться стандартными возможностями TFS.

TFS «из коробки» в принципе дает уже некоторые такие функции на основе задач и отчетности, что рассматривалось здесь ранее, но при этом нужно следовать строгим правилам:

  1. Пользователи системы должны по факту событий или ежедневно указывать потраченное на задачи время.
  2. Указание комментариев и новых значений времени должны выполняться одним сохранением.

Но следовать таким установкам не всегда возможно. Поэтому мы рассмотрим другой вариант, который будет не очень сложен для реализации собственными силами и будет отвечать следующим требованиям:

  1. Возможность отслеживать активности связанные или не связанные с конкретными задачами.
  2. Возможность указывать дату для активностей, чтоб их можно было вносить пост фактом.
  3. Автоматизировать калькуляцию времени у задач, для которых существуют активности.
  4. Возможность собрать отчетную информацию.

Основная идея данного решения состоит в следующем:

  1. Ввести новый рабочий элемент, который мы назовем Активность. Он будет использоваться для сохранения времени и при этом он может связываться с задачами либо вводиться отдельно.
  2. Доработать рабочий элемент Задача, чтобы можно было быстро добавлять новые Активности по ней. Новые Активности будут являться дочерними по отношению к задачам, что позволит по необходимости строить запросы со связями, а также использовать существующие отчеты.
  3. Написать решение, которое будет обновлять время у Задач. По всем связанным активностям в родительскую задачу будет суммироваться потраченное время и соответствующе уменьшаться запланированное.
  4. Подготовить отчет, который позволит просматривать Активности по текущим работам. Для примера мы изменим один из существующих отчетов, который позволит построить дерево работ по иерархии Требование->Задача->Активность.

Давайте рассмотрим эти шаги подробнее для TFS 2015 русской версии.

Ввести новый рабочий элемент Активность

Для этого мы можем использовать любой уже существующий рабочий элемент, например, Задачу, которая содержит основной набор атрибутов. Для этого нам необходимо экспортировать его на локальный диск, указав для файла имя Активность, и доработать.

  • Для редактирования мы воспользуемся TFS Power Tools и пример экспорта отображен на рисунке ниже:

Рисунок 1. Экспорт типа рабочего элемента

  • Далее мы открываем экспортированный файл и для определения типа рабочего элемента меняем его название:

Рисунок 2. Название типа рабочего элемента

  • Кроме этого нам необходимы дополнительные поля:
    • Поле, которое будет содержать типы активностей. Для этого можно использовать уже готовое поле Дисциплина. В него нужно только добавить к существующим необходимые значения, а также можно установить обязательным.

Рисунок 3. Поле Дисциплина

  • Завершенная работа. Также используем стандартное поле, но устанавливаем ему обязательность для заполнения. Кроме этого, если время могут изменять, поле Исходная оценка можно использовать для хранения предыдущего значения времени.

Рисунок 4. Поле завершенной работы

  • Дата активности. Тут можно использовать новое поле, которое должно попадать в базу для отчетов, и нужно добавить его на форму с возможностью выбора даты.

Рисунок 5. Поле даты активности

Рисунок 6. Размещение даты активности на форме

  • Техническое поле, которое будет использоваться как флаг для приложения обработки времени. Это поле будет сбрасываться при изменениях времени и даты Активности.

Рисунок 7. Отслеживание изменения активности

Состояния можно либо оставить, либо удалить, оставив только Предложено. После всех изменений модифицированный рабочий элемент импортируется в проект TFS.

Рисунок 8. Импорт нового типа рабочего элемента

Пример рабочего элемента Активность можно посмотреть в конце статьи.

Доработать рабочий элемент Задача

Для задачи изменений особых добавлять нет острой необходимости. Мы всего лишь добавим контрол, который позволит пользователю видеть все активности по задаче и быстро добавлять новые активности.

  • В этом случае выполняется изменение определения типа рабочего элемента Задача непосредственно на сервере без операций экспорта и импорта.

Рисунок 9. открыть рабочий элемент с сервера

  • Для контрола мы создаем новую вкладку, в которую уже его и добавляем с типом LinkControlOptionsType, а также конфигурируем на добавление и отображение только дочерних Активностей. Пример контрола и его свойств отображен ниже.

Рисунок 10. Новая вкладка и контрол

Рисунок 11. Настройки контрола

В результате мы получим Задачу приблизительно в следующем виде:

Рисунок 12. Пример формы задачи

Написать решение, которое будет обновлять время у Задач

Решение можно реализовать различными подходами:

  1. Реализовать как серверный плагин. В данном случае выполняется разработка плагина, который «прослушивает» все события по изменению рабочих элементов и срабатывает только, когда выполняется работа с Активностями. Метод позволяет фактически моментально выполнять необходимые изменения, но будет дополнительно нагружать сервер TFS, особенно если происходит какое-то массовое изменение рабочих элементов.
  2. Реализовать как веб-сервис. TFS позволяет двумя различными методами подписываться на события, которые в нем происходят, и отправлять сообщения на SOAP сервисы. В данном случае мы будем получать только нужные для нас сообщения, но нужна дополнительная реализация самого сервиса, обработка входящих сообщений, а в дельнейшем также нужно задуматься, где его развернуть.
  3. Отдельное консольное приложение. В данном случае приложение работает на основе запроса по рабочим элементам, который будет получать необходимую информацию и выполнять операции по обновлению данных. В этом методе будет использоваться минимум кода, а развернуть его можно в виде периодической задачи на любом рабочем месте, включая сам сервер TFS, с предустановленными клиентскими библиотеками. Этот вариант проще для реализации, поэтому его мы и рассмотрим.

Основные шаги приложения будут следующими:

  • Подключение к хранилищу рабочих элементов и выполнения запроса. В нашем случае запрос отбирает информацию о ссылках активностей, которые связаны с задачами и были созданы или обновлены. Пример подключения и выполнения запроса:

WorkItemStore wiStore = new WorkItemStore(«http://tfs-srv:8080/tfs/DefaultCollection&#187;);

Query query = new Query(wiStore, QueryStr);

var result = query.RunLinkQuery();

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

WorkItem activity = wiStore.GetWorkItem(wilink.SourceId);

WorkItem task = wiStore.GetWorkItem(wilink.TargetId);

  • Получение информации о времени и обновление полей с временем у задачи. Пример операции:

Double work = (Double)activity.Fields[«Microsoft.VSTS.Scheduling.CompletedWork»].Value;

Field taskRemaining = task.Fields[«Microsoft.VSTS.Scheduling.RemainingWork»];

if (taskCompleted.Value == null) taskCompleted.Value = work;

else taskCompleted.Value = (Double)taskCompleted.Value + work;

task.Save();

  • Обновление информации в Активности о том, что из нее данные получены, а также блокировка ссылки с задачей для того, чтоб ее случайно или намеренно эта связь не потерялась. Пример блокировки связи:

foreach (WorkItemLink activityLink in activity.WorkItemLinks)

{
if (activityLink.LinkTypeEnd.Id == parentLink.Id)

{

if (activityLink.IsLocked) break;

activityLink.IsLocked = true;

break;

}

}

Пример приложения можно посмотреть в конце статьи.

Подготовить отчет

Для отчета, как и в случае с рабочими элементами, мы воспользуемся существующим, который называется «Ход реализации требований». Данный отчет уже хорошо подготовлен, он выстраивает дерево требований и работ, собирает по ним информацию о трудозатратах и имеет параметры, которые можно настроить под собственные потребности. Для работы с отчетом можно использовать Report Builder, в котором нужно выполнить следующие шаги:

  • Открыть отчет «Ход реализации требований», который будет являться исходным. По умолчанию он находится в каталоге «Управление проектами». Сохраним отчет с новым именем.

Рисунок 13. Расположение исходного отчета

  • Добавить новый параметр, который будет содержать название рабочего элемента Активность, например, следующим образом:

Рисунок 14. Параметр Activity

  • Изменить запрос отчета для того, чтоб потраченное время учитывалось только через рабочие элементы Активность, а также по необходимости вывести дополнительные, например, Кому назначено, Тип и дата активности. Пример учета потраченных часов из активностей:

Рисунок 15. Пример изменения запроса

  • Далее необходимо вывести столбцы и присвоить для них необходимые значение. На примере ниже отображено условие, с использованием которого мы сможем видеть исполнителей только для активностей:

Рисунок 16. Выражение для поля Исполнитель

  • Далее нам необходимо протестировать и сохранить отчет:

Рисунок 17. Пример работы отчета

В итоге

В итоге мы получаем решение для формирования и отслеживания расписаний на основе TFS с использованием небольших доработок. Для формирования расписания мы используем рабочий элемент Активность, который можно создавать в связке с задачами или отдельно. В дальнейшем посмотрим, как можно автоматизировать подсчет рабочего времени.

Ресурсы

То, что использовалось в данной статье, можно скачать здесь:

  • Определение типа рабочего элемента Активность – Активность.xml.
  • Исходный код решения для обновления потраченного времени – UpdateCompletedFromActivity.zip.
  • Доработанный отчет по требованиям и их задачам и активностям – «Активности по требованиям.rdl».

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

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

Posted by Шамрай Александр на Декабрь 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 такие блоггеры, как: