Я уже писал в блоге, как связать рабочие элементы с проверками 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.