Статьи

Связывание рабочих элементов с Git Commit в сервисах TFS с вызовами API

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