Автоматическая отправка проблем приложения в TFS
Обратная связь между пользователями и группой разработки очень часто является важным фактором успех проекта, особенно на стадии пилотной эксплуатации. Заказная или внутренняя разработка приложений требует, чтобы проблемы, которые возникают у пользователей, решались как можно быстрее. Самым привычным способом коммуникаций при этом является телефон или электронная почта. Такой способ не всегда хорошо работает. Например, если идет пилотная эксплуатация, пользователи могут не знать куда звонить или отправлять письма с описанием проблем. К тому же, качество таких коммуникаций может сильно зависеть от опыта пользователей.
Если команда использует TFS для организации процессов разработки, то идеально чтобы проблемы, которые возникают у пользователей регистрировались в TFS проекте в виде ошибок. В некоторых случаях возможно даже предоставление доступа к Team Web Access пользователям разрабатываемой системы, для того чтобы они сами могли создавать ошибки. Но это тоже не всегда удобно, так как пользователи могут не обладать необходимыми навыками.
Очевидным выходом из положения является интеграция приложения с Team Foundation Server для предоставления пользователю возможности прямо из эксплуатируемой системы сообщить о возникших проблемах. При этом само ПО может собрать дополнительную диагностическую информацию и создать баг на сервере.
Team Foundation Server API
TFS снабжен программным интерфейсом который позволяет работать практически со всеми компонентами, в том числе управлять рабочими элементами. В простейшем случае достаточно подключить две библиотеки Microsoft.TeamFoundation.Client.dll и Microsoft.TeamFoundation.WorkItemTracking.Client.dll и у вас уже будет возможность создавать и управлять рабочими элементами.
Например, код который создет рабочий элемент очень краток:
1: projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("https://tfs_server_address:8080/tfs"));
2:
3: var workItemStore = projectCollection.GetService<WorkItemStore>();
4:
5: var workItemTypes = workItemStore.Projects["ProjectName"].WorkItemTypes;
6:
7: var workItem = new WorkItem(workItemTypes["bug"])
8:
9: {
10:
11: Title="Bug created programmatically"
12:
13: };
14:
15: workItem.History = "sometext";workItem.Save();
Подключить его к вашему приложению не составит никакого труда.
Более детальные примеры работы с TFS можно посмотреть на сайте MSDN.
Сложности и их решения
В случае если вы разрабатываете настольное приложение, такой способ обладает рядом недостатков. В первую очередь они связаны с аутентификацией и авторизацией пользователя на сервере TFS, и требуют создания учетной записи на сервере, или его имперсонации. Так же на компьютер пользователя в обязательном порядке требуется установка Team Foundation Server Client, что может быть не всегда удобным. Таких недостатков лишено серверное приложение, например веб-сайт на базе ASP.NET. Самым очевидным решением в случае с настольными приложениями видится создание веб-сервиса и его вызов из приложения.
Соединяем все вместе
В подготовленном примере можно увидеть реализацию трех вариантов взаимодействия обыкновенного пользователя с TFS
- Публикация информации о найденной ошибке c помощью веб приложения
- Уведомление о произошедшей ошибке в приложении с помощью вебсервиса
- Уведомление о произошедшей ошибке напрямую из приложения в TFS
В первом случае мы имеем следующую форму:
Которая позволяет простому пользователю заполнить информацию не задумываясь о многих деталях как если бы это пришлось делать с помощью TFS Web Access. Эта форма в последствии вызывает код который и создает баг на сервере TFS.
Для того чтобы проиллюстрировать последние два варианта подготовлен пример Windows Forms приложения которое при нажатии на кнопку генерирует исключение.
В месте обработки исключения собирается информация о произошедшем (в нашем случае это просто StackTrace).
Далее в зависимости от отмеченного checkbox вызываются методы отправки данных об ошибке с помощью реализованного нами веб-сервиса, либо напрямую в TFS с использованием имперсонации.
Для того чтобы была возможна имперсонация текущего пользователя создан специальный класс ImpersonatedTFSCollection в котором напрямую задан пользователь от лица которого будет осуществляться соединение с TFS, потому что пользователь возможно не знает таких деталей.
В дальнейшем работа с методами TFS ничем не будет отличаться от той которая реализована в примере на базе веб-сервисов.
Исходные коды примера вы можете скачать отсюда.