Ответ 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. Ниже приведен "код" (точно выполняется то, что сделано в коде С#):
(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