Как я могу скопировать определение сборки TFS 2010? - PullRequest
21 голосов
/ 26 мая 2010

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

Ответы [ 7 ]

36 голосов
/ 04 ноября 2010

Вы можете загрузить новые TFS 2010 электроинструменты . У него есть возможность клонировать определение сборки.

См. http://msmvps.com/blogs/molausson/archive/2010/10/21/clone-a-build-definition.aspx для примера

Примечание. Помните, что клон работает только тогда, когда вы НЕ выскакиваете из окна сборки.

12 голосов
/ 09 июня 2010

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

static IBuildDefinition CloneBuildDefinition(IBuildDefinition buildDefinition)
{
    var buildDefinitionClone = buildDefinition.BuildServer.CreateBuildDefinition(
        buildDefinition.TeamProject);

    buildDefinitionClone.BuildController = buildDefinition.BuildController;
    buildDefinitionClone.ContinuousIntegrationType = buildDefinition.ContinuousIntegrationType;
    buildDefinitionClone.ContinuousIntegrationQuietPeriod = buildDefinition.ContinuousIntegrationQuietPeriod;
    buildDefinitionClone.DefaultDropLocation = buildDefinition.DefaultDropLocation;
    buildDefinitionClone.Description = buildDefinition.Description;
    buildDefinitionClone.Enabled = buildDefinition.Enabled;
    buildDefinitionClone.Name = String.Format("Copy of {0}", buildDefinition.Name);
    buildDefinitionClone.Process = buildDefinition.Process;
    buildDefinitionClone.ProcessParameters = buildDefinition.ProcessParameters;

    foreach (var schedule in buildDefinition.Schedules)
    {
        var newSchedule = buildDefinitionClone.AddSchedule();
        newSchedule.DaysToBuild = schedule.DaysToBuild;
        newSchedule.StartTime = schedule.StartTime;
        newSchedule.TimeZone = schedule.TimeZone;
    }

    foreach (var mapping in buildDefinition.Workspace.Mappings)
    {
        buildDefinitionClone.Workspace.AddMapping(
            mapping.ServerItem, mapping.LocalItem, mapping.MappingType, mapping.Depth);
    }

    buildDefinitionClone.RetentionPolicyList.Clear();

    foreach (var policy in buildDefinition.RetentionPolicyList)
    {
        buildDefinitionClone.AddRetentionPolicy(
            policy.BuildReason, policy.BuildStatus, policy.NumberToKeep, policy.DeleteOptions);
    }

    return buildDefinitionClone;
}
2 голосов
/ 02 марта 2012

Следующий инструмент (VS Addin) удовлетворит ваше требование>

Менеджер сообщества TFS Build

http://visualstudiogallery.msdn.microsoft.com/16bafc63-0f20-4cc3-8b67-4e25d150102c

1 голос
/ 09 июля 2012

Вот решение, если вы хотите переместить определение сборки из одного командного проекта в другой командный проект.

    public void MoveBuild(string fromTeamProject, string toTeamProject, string buildName, string newBuildName)
    {

        var _server = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new

        Uri("http://Mytfs:8080/defaultcollection"));

        IBuildServer _buildServer = _server.GetService<IBuildServer>();

        var buildDetails = _buildServer.QueryBuildDefinitions(fromTeamProject);

        foreach (var fromBuild in buildDetails)
        {
            if (fromBuild.Name != buildName) continue;
            var newBuildDefinition = _buildServer.CreateBuildDefinition(toTeamProject);
            newBuildDefinition.Name = !string.IsNullOrEmpty(newBuildName) ? newBuildName : fromBuild.Name;

            newBuildDefinition.BuildController = fromBuild.BuildController;

            // This finds the template to use 
            foreach (var mapping in fromBuild.Workspace.Mappings)
            {
                newBuildDefinition.Workspace.AddMapping(
                    mapping.ServerItem, mapping.LocalItem, mapping.MappingType, mapping.Depth);
            }
            newBuildDefinition.DefaultDropLocation = fromBuild.DefaultDropLocation;
            newBuildDefinition.Description = fromBuild.Description;
            // buildDefinition.Workspace.AddMapping(build.Workspace.);
            newBuildDefinition.Process = _buildServer.QueryProcessTemplates(fromBuild)[2];

            newBuildDefinition.ProcessParameters = fromBuild.ProcessParameters;
            newBuildDefinition.Enabled = false;
            newBuildDefinition.Save();
        }//end of for each loop 

    }
1 голос
/ 12 августа 2011

Можно щелкнуть правой кнопкой мыши определение сборки и выбрать «определение сборки клона», чтобы скопировать файл определения. Вы можете отредактировать его оттуда.

1 голос
/ 03 ноября 2010

Мне просто нужно было скопировать определения сборки, и мне показался полезным ответ Джима выше. Однако, поскольку я был новичком в TFS API, мне потребовалась помощь в подключении к серверу и получении существующего определения сборки с помощью кода. Эти две ссылки помогли заполнить пробелы:

http://msdn.microsoft.com/en-us/library/bb286958.aspx

http://geekswithblogs.net/jakob/archive/2010/04/26/creating-a-build-definition-using-the-tfs-2010-api.aspx

0 голосов
/ 26 мая 2010

Из вашего сообщения не ясно, какой шаблон используется в определении вашей сборки (по умолчанию, обновление или управление лабораторией). Если я правильно понимаю, вы хотели бы легко настроить определение сборки, которое строит то же решение, но из другой ветви.

Одна вещь, которую вы можете попробовать вместо копирования определения, это отредактировать его. Когда ветвь умирает, переименуйте определение сборки (может помочь с отчетностью), измените отображение рабочей области сборки, и все будет готово.

Спасибо, Ладислау

...