Я уже писал в блоге, как связать рабочие элементы с проверками TFS, используя теги в комментариях и несколько вызовов API . Эта функция теперь доступна для любой службы TF, основанной на Git , но кто-то спросил меня, как вы можете выполнить эту задачу с помощью API. Возможный сценарий — поддержка синтаксиса комментариев другого типа и в целом понимание того, как эта задача может быть выполнена с помощью API.
Код действительно похож на тот, который я опубликовал в другой статье, единственное отличие состоит в том, что комментарии взяты из коммита Git, а не из проверок изменений. Обязательным условием является наличие локального репозитория git, клонированного из проекта на основе TF Service Git , после чего мы можем просто перебрать все коммиты для идентификации комментариев, содержащих шаблон #wid, где wid — идентификатор рабочего элемента. Как только фиксация идентифицирована, мы можем создать связь между соответствующим рабочим элементом с некоторыми вызовами API .
Вы можете найти большинство деталей в предыдущем посте , в этом я просто хочу показать раздел, связанный с Git. Прежде всего, чтобы создать ссылку, связывающую рабочий элемент с коммитом Git, необходимо иметь как руководство по групповому проекту, так и руководство по TFS в репозитории Git .
//get a reference to the git repository service var gitRepoService = projectCollection.GetService<GitRepositoryService>(); var gitProjectRepoService = gitRepoService.QueryRepositories(teamProjectName); var defaultGitRepo = gitProjectRepoService.Single(gr => gr.Name.Equals(teamProjectName)); //Id needed to create the link var tpGuid = teamProject.Guid; var gitGuid = defaultGitRepo.Id;
Git-репозитории не имеют понятия «guid», но в TF Service сервер назначает guid для каждого Git-репозитория. Поскольку командный проект может содержать более одного репозитория git, в этом простом примере я беру единственный, имя которого совпадает с именем командного проекта, по умолчанию. В реальном производственном сценарии вы, вероятно, должны сканировать все репозитории .
Благодаря LibGit2Sharp получение списка коммитов становится действительно простым, вам нужно иметь локальный клон репозитория, и вы должны извлечь его из источника (TF Service), чтобы ваш локальный источник / мастер репозитория выровнялся с сервером, тогда вы можете просто перебрать все коммиты происхождения.
using (var repo = new Repository(@"C:DevelopTfServiceGitTestProject"))
{
var remoteCommits = repo.Branches["origin/HEAD"].Commits;
foreach (var commit in remoteCommits)
{
Console.WriteLine("Analyzing commit {0}", commit.Id);
var comment = commit.Message;
var matches = Regex.Matches(comment, @"#(?<id>d+)");
foreach (Match match in matches)
{
//I have an association on the form #changesetid
var id = Int32.Parse(match.Groups["id"].Value);
var workItem = workItemStore.GetWorkItem(id);
//now I should create the link, I need the guid of the team project
var link = String.Format
(
"vstfs:///git/commit/{0}%2f{1}%2f{2}",
tpGuid,
gitGuid,
commit.Sha
);
Интересная часть — это та, которая создает действующую ссылку TF Service на коммит для установления связи с рабочим элементом. Ссылка состоит из части vstfs: /// git / commit, за которой следует идентификатор (guid) командного проекта, затем косая черта (закодированная так, чтобы она была% 2f), затем guid службы TF из репозитория Git еще одна косая черта и ша коммита (полный идентификатор коммита). Оставшаяся часть кода просто использует регулярное выражение для поиска комментария, который содержит шаблон #wid для определения идентификаторов рабочих элементов, которые необходимо подключить. Создав строковое представление ссылки, вы можете легко создать связь между рабочим элементом и фиксацией.
Приведенный выше код просто проверяет, был ли рабочий элемент уже связан с тем же коммитом (чтобы избежать создания дублирующих ссылок), и если ссылка отсутствует, просто создайте новую ссылку рабочего элемента типа ExternalLink и рабочий элемент подключен.
//now create the link
ExternalLink changesetLink = new ExternalLink(
workItemStore.RegisteredLinkTypes[ArtifactLinkIds.Commit],
link);
//you should verify if such a link already exists
if (!workItem.Links.OfType<ExternalLink>()
.Any(l => l.LinkedArtifactUri == link))
{
Console.WriteLine("tAssociate changeset {0} to Work Item {1}:{2}",
commit.Id.Sha,
workItem.Id,
workItem.Title);
workItem.Links.Add(changesetLink);
workItem.Save();
}
Вы можете использовать это простое Доказательство Концепций и реализовать логику, которая вам нравится, чтобы связать Changeset и Work Items. Код здесь http://sdrv.ms/107Wgo, который вы можете использовать на свой страх и риск, он предназначен не для производственного использования , а только в качестве руководства для ознакомления с соответствующим API.