Подтвердить что ты не робот

TFS2010 - Неправильный набор изменений, появляющийся в SourceGetVersion

В настоящее время я настраиваю Team Foundation Server 2010, и при выполнении сборки я обнаружил очень странное поведение:

Ситуация объясняется: У нас есть 2 ветки

  • Разработка
  • Главная

Все разработчики проверяют код только в ветке разработки. Один раз в день менеджер сборки объединяет несколько наборов изменений в главный ветвь. На платформе разработки выполняется непрерывная сборка при каждой проверке. В главном филиале один раз в день (ночью) запускается сборка.

Теперь предположим, что набор изменений 1-100 объединяется в основной блок в 5 вечера, предоставляя набор изменений 101 в качестве операции слияния. Некоторые разработчики проверяют набор изменений 102-106 после 5 часов в ветку разработки. Теперь в 11 вечера ежедневная сборка автоматически запускается и запускается в главном филиале. Последний набор изменений в главном ветки - это набор изменений 101. Однако в деталях сборки отображается набор изменений 106:

enter image description here

Я мог представить, что это поведение предназначено, потому что если вы проверите набор изменений 106 в главном ветки, вы фактически получите содержимое набора изменений 101. Но было бы гораздо более читаемым, если бы в этом сводке сводки было указано правильное число.

Вопрос 1: Существует ли способ манипулирования выводом информации SourceGetVersion? Может быть, с помощью шаблона процесса сборки?

Второй сценарий, где TFS ведет себя странно, еще хуже: При очередности новой сборки есть возможность ввести параметр "Получить версию", как показано на следующем рисунке:

enter image description here

Если теперь я нажимаю на "очередь", сборка запускается и AGAIN, деталь сборки выводит набор изменений 106, хотя я специально установил его для получения набора изменений 76.

Вопрос 2: Это ошибка? Есть исправление или что-то, чтобы это исправить? Или есть ли какой-либо флаг опции, который должен быть установлен?

Я надеюсь, что кто-то знает об этом больше. Я действительно не верю, что это ошибка, потому что это такая важная функциональность, с которой раньше сталкивались другие люди.

Спасибо за любую помощь!! Christian

РЕДАКТИРОВАТЬ 1

Структура папок Team Project:

$ProjectName

  • BuildProcessTemplates
  • Документация
  • SourceCode
    • Разработка < - это ветвь
      • 3rdParty
      • Источник
    • Main < - это ветвь
      • 3rdParty
      • Источник

Строка только тянет главную ветвь и все под ней.

РЕДАКТИРОВАТЬ 2

Вот изображение закладки Workspace в определении сборки: enter image description here

4b9b3361

Ответ 1

Наконец, я узнал, что происходит:

В принципе, набор изменений, который можно увидеть на моем снимке 1, всегда является последним набором изменений всей Team Project Collection. Это свойство "SourceGetVersion" для объекта "BuildDetails" типа "IBuildDetails".

Я думаю, что это ошибка, с которой можно работать: Если вы измените BuildDetails.SourceGetVersion(которая является строкой) на какое-то другое значение, то в сводке сборки будет показана обновленная строка. Кроме того, он затем корректно сохраняется в базе данных коллекции.

Что я сделал, чтобы добавить правильный номер набора изменений, я создал пользовательскую операцию сборки, которая берет ветку, которая должна быть построена как входной параметр. Он выводит правильный набор изменений. Эта активность обнаруживает правильный набор изменений, подключаясь к TFS и загружая Историю. Затем он просматривает все элементы в истории и выводит самый большой номер набора изменений. Вот код этого действия:

using System.Activities;
using System.Collections;
using System.Net;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.Build.Client;

namespace SourceGetVersionActivity
{
    [BuildActivity(HostEnvironmentOption.All)]
    public sealed class SourceGetVersionActivity : CodeActivity<string>
    {
        // Define an activity input argument of type string
        public InArgument<string> Branch { get; set; }

        // If your activity returns a value, derive from CodeActivity<TResult>
        // and return the value from the Execute method.
        protected override string Execute(CodeActivityContext context)
        {
            // Obtain the runtime value of the Text input argument
            string branch = context.GetValue(this.Branch);

            ICredentials account = new NetworkCredential("Useranme", "password", "domain");

            // connect / authenticate with tfs
            TeamFoundationServer tfs = new TeamFoundationServer("http://tfs:8080/tfs/CollectionName", account);
            tfs.Authenticate();

            // get the version control service
            VersionControlServer versionControl = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));

            IEnumerable changesets = versionControl.QueryHistory(branch, VersionSpec.Latest, 0, RecursionType.Full,
                null, null, null, int.MaxValue, false, false, false, false);

            int maxVersion = 0;

            foreach (Changeset c in changesets)
            {
                if (c.ChangesetId > maxVersion)
                {
                    maxVersion = c.ChangesetId;
                }
            }

            return string.Concat('C', maxVersion.ToString());
        }
    }
}

Я вызываю это действие как можно скорее (после действия GetBuild).

В основном в BuildProcessTemplate я добавил Аргумент (строка) "Ветка", который должен быть заполнен строкой, указывающей на верхнюю папку, которая создается. Таможенное действие принимает это как ввод и выводит строку, которая является правильным идентификатором набора изменений. Свойство BuildDetail.SourceGetVersion будет переопределено правильным идентификатором набора изменений.

Мне кажется странным, что никто другой, похоже, не столкнулся с этой проблемой. Я не мог найти человека в Интернете с той же проблемой. Во всяком случае, я надеюсь, что этот ответ поможет кому-то еще и в будущем.

EDIT - Написание вышеуказанного кода непосредственно в Workflow Foundation:

Чтобы получить правильный набор изменений с использованием более компактного кода и избежать пользовательских действий, также можно напрямую использовать Workflow Foundation. Ниже приведен "код" (точно выполняется то, что сделано в коде С#):

enter image description here

(1) Активность GetTeamProjectCollection получает текущую коллекцию. Я сохраняю его внутри переменной TeamProjectCollection (см. Снизу изображения). Важно: переменная должна быть определена внутри этой последовательности, если вы определяете ее во внешней области, произойдет ошибка: "Невозможно сериализовать тип" Microsoft.TeamFoundation.Client.TfsTeamProjectCollection ". Убедитесь, что тип является общедоступным и либо имеет конструктор по умолчанию или дескриптор экземпляра."

(2) Foreach "changeet" в "TeamProjectCollection.GetService(Of VersionControlServer).QueryHistory(Branch, VersionSpec.Latest, 0, RecursionType.Full, Nothing, Nothing, Nothing, Integer.MaxValue, False, False, False).Cast(Of Changeset)()" ТипArgument цикла Foreach - "Microsoft.TeamFoundation.VersionControl.Client.Changeset". Это выражение получает объект управления версиями из коллекции, называет его методом QueryHistory, который возвращает IEnumerable со всеми наборами изменений.

(3) Итак, мы повторяем все изменения и смотрим на ChangeetId. Затем сохраняем максимум ChangesetId переменной "maxId".

(4) В конце BuildDetails.SourceGetVersion = "C" + maxId.ToString(). "C" указывает, что версия является набором изменений.

Я надеюсь, что кто-то найдет этот кусок "Кода" полезным!

Christian