Как изменить состояние рабочего процесса вновь созданного рабочего элемента TFS через API?

Я создаю приложение для переноса рабочих элементов из «чего-то» в TFS 2013 и хочу, чтобы рабочие элементы TFS находились в соответствующих состояниях рабочего процесса, как в исходной системе. Например, если исходный рабочий элемент находится в состоянии «Закрыто», я хочу, чтобы в TFS он находился в состоянии «Готово».

Я следовал советам в этой статье, где предлагается установить BypassRules свойство объекта WorkItemStore на true, чтобы можно было установить поле CreatedDate. Полагаю, то же самое относится и к изменению состояния рабочего процесса, поскольку оно также требует обхода правил.

Итак, я попробовал следующее:

// obtain collection and authenticate towards it
var collection = new TfsTeamProjectCollection(new Uri(_tfsUrl), cred);
collection.Authenticate();

// get the work item store object
var store = new WorkItemStore(collection, WorkItemStoreFlags.BypassRules);

// creating the work item
var workItem = new WorkItem(store.Projects[_tfsProjectName].WorkItemTypes["Product Backlog Item"]);

// setting some standard fields
workItem.Title = "some name";
workItem.Description = "some description";

// validating the work item
if (workItem.Validate().Count > 0)
{
   // throw validation rules violated
}

// saving the work item
workItem.Save();    

Как видите, этот образец не нарушает никаких правил проверки, и workItem.Validate().Count возвращает 0. Но вызов workItem.Save() вызывает следующее исключение:

Дополнительная информация: TF26212: Team Foundation Server не может сохранить ваши изменения. Могут возникнуть проблемы с определением типа рабочего элемента. Попробуйте еще раз или обратитесь к администратору Team Foundation Server.

Я дважды проверил, что BypassRules установлено на true прямо перед вызовом метода Save(). Кроме того, workItem.IsValid также является true.

Интересен тот факт, что если я изменю способ получения объекта WorkItemStore из

var store = new WorkItemStore(collection, WorkItemStoreFlags.BypassRules);

to

var store = collection.GetService<WorkItemStore>();

он может сохранить без каких-либо проблем! Но в этом случае я не знаю, как установить BypassRules в true. Это свойство доступно только для чтения при создании объекта WorkItemStore, и я получаю ошибки проверки, если пытаюсь установить для шага рабочего процесса значение, отличное от «Новый».

Итак, мой основной вопрос: как создавать рабочие элементы в TFS через API и иметь возможность изменять поле State в этом вновь созданном элементе?


person Yan Sklyarenko    schedule 14.11.2013    source источник


Ответы (1)


Хорошо, ребята, как это часто бывает, ответ в руководстве. Позволь мне объяснить.

В статье, на которую я ссылался в своем вопросе, четко говорится:

Вы должны быть участником учетных записей службы сбора проектов.

Но в нем не упоминается, что вы не можете легко добавить пользователя или группу в Project Collection Service Accounts. Если вы попытаетесь сделать это через веб-доступ, у вас ничего не получится — кнопка «Добавить» просто отключена. Кроме того, снимок экрана вводит в заблуждение, показывая учетную запись как члена Project Collection Administrators group.

По умолчанию Project Collection Service Accounts group содержит одну группу под названием Team Foundation Service Accounts. И это группа, в которую вы должны добавить учетную запись. Это можно сделать с помощью консольного приложения TFSSecurity.exe:

TFSSecurity.exe /g+ "Team Foundation Service Accounts" "Domain\my-service-account" /server:http://mytfsserver:8080/tfs

Это подробно описано в этой статье, где описан именно мой случай с правильным разрешением. TFSSecurity.exe можно найти в следующем месте: %ProgramFiles(x86)%\Microsoft Visual Studio\Common7\IDE (например, C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE)

person Yan Sklyarenko    schedule 15.11.2013