Наконец я узнал, что происходит:
По сути, набор изменений, который можно увидеть на моем рисунке 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 я добавил аргумент (строку) «Branch», который должен быть заполнен строкой, указывающей на верхнюю папку, которая создается. Пользовательское действие принимает это в качестве входных данных и выводит строку, которая является правильным идентификатором набора изменений. Свойство BuildDetail.SourceGetVersion будет переопределено правильным идентификатором набора изменений.
Мне действительно странно, что никто другой, похоже, не сталкивался с этой проблемой. Я не смог найти ни одного человека в интернете с такой же проблемой. В любом случае, я надеюсь, что этот ответ поможет кому-то еще и в будущем.
РЕДАКТИРОВАТЬ - Написание вышеуказанного кода непосредственно в Workflow Foundation:
Чтобы получить правильный набор изменений, используя более компактный код и избегая пользовательских активаций, также можно напрямую использовать Workflow Foundation. Ниже приведен «код» (делает именно то, что сделано в коде выше C #):
(1) Операция GetTeamProjectCollection получает текущую коллекцию. Я сохраняю его в переменной TeamProjectCollection (см. Внизу рисунка). Важное замечание: Переменная должна быть определена внутри этой последовательности, если вы определите ее во внешней области, произойдет ошибка: «Невозможно сериализовать тип« Microsoft.TeamFoundation.Client.TfsTeamProjectCollection ». Убедитесь, что тип является общедоступным и имеет либо конструктор по умолчанию или дескриптор экземпляра. "
(2) Foreach "changeset" в "TeamProjectCollection.GetService (Of VersionControlServer) .QueryHistory (Branch, VersionSpec.Latest, 0, RecursionType.Full, Nothing, Nothing, Nothing, Integer.MaxValue, False, False, False) .Cast (Of Changeset) () "
Аргументом типа цикла Foreach является «Microsoft.TeamFoundation.VersionControl.Client.Changeset».
Это выражение получает объект управления версиями из коллекции, вызывает его методом «QueryHistory», который возвращает IEnumerable со всеми наборами изменений.
(3) Итак, мы перебираем все наборы изменений и смотрим на ChangesetId. Затем сохраняем максимальный ChangesetId в переменную «maxId».
(4) В конце BuildDetails.SourceGetVersion = "C" + maxId.ToString (). «C» указывает, что версия является набором изменений.
Надеюсь, кто-то найдет этот фрагмент "кода" полезным!
Christian