仅限TFS 2012备份和还原BuildDefinitions

时间:2013-01-30 10:29:29

标签: testing backup restore tfs2012

我安装了TFS2012作为测试系统并在我们开始工作之前进行了一些测试。 这包括定义许多BuildDefinitions,这是很多工作。

测试成功后,将安装一台新服务器,其中包含TFS2012。

对于这个新服务器 - 它作为生产系统运行 - 我想从测试系统恢复BuildDefinitions。但只有BuildDefinitions,而不是整个TeamCollections。因为我运行了测试签到,我不想在我的高效服务器上使用它们。

现在,是否可以仅备份和恢复BuildDefinitions?

也许有可能直接通过Sql数据库?,但我有点害怕那里的引用,指向其他一些表。

最诚挚的问候,Peter Bucher

2 个答案:

答案 0 :(得分:1)

构建定义不受源代码控制。唯一的选择是依赖TFS数据库备份,可以在 Tfs_DefaultCollection 数据库中恢复或查看 tbl_BuildDefinition * 表。

此功能有用户语音,您也可以使用TFS API执行此操作。

在uservoice上添加投票:

provide a way to version-control build definitions

使用TFS API

How can I copy a TFS 2010 Build Definition?

答案 1 :(得分:1)

最后我决定不再触摸数据库,因为有许多其他表的引用。

我使用了TFS API v11(TFS2012)和一些C#代码,我根据我的需要从这个基础开始:How can I copy a TFS 2010 Build Definition?

它将所有构建定义从一个TFS2012服务器复制到另一个。对于这两个服务器,需要指定TeamCollection和TeamProject。

因此,复制任务必须按TeamProject完成。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;

namespace TFSBuildDefinitionCreator
{

internal class Program
{
    private static void Main(string[] args)
    {
        // Copies build definitions from one server to another.
        // Uses the TeamFoundation API V11 (TFS2012).
        // Code was used to copy b uild definitions from a test server to a productive.

        string sourceServer = "http://testTfs:8080/tfs/MyTeamCollection";
        string sourceTeamProject = "MyTeamProject";

        string targetServer = "https://productiveTfs:8080/tfs/MyTeamCollection";
        string targetTeamProject = "MyTeamProject";

        // DropLocation for defininitions: Share on which the build should be dropped.
        string defaultDropLocation = "\\\\MyBuildserver\\Builds$";

        // Change the DefaultProcessTemplate in the following method below:         GetDefaultProcessTemplateByServerPathFromBuildServer.

        CopyBuildDefinitions(sourceServer, sourceTeamProject, targetServer, targetTeamProject, defaultDropLocation);

        Console.Read();
    }

    private static IBuildServer GetBuildServerFromServerUrl(string serverUrl)
    {
        var tfs = TeamFoundationServerFactory.GetServer(serverUrl);
        return (IBuildServer)tfs.GetService(typeof(IBuildServer));
    }

    private static IBuildController GetDefaultBuildControllerFromBuildServer(IBuildServer buildServer)
    {
        return buildServer.QueryBuildControllers()[0];
    }

    private static IProcessTemplate GetDefaultProcessTemplateByServerPathFromBuildServer(IBuildServer buildServer, string teamProject)
    {
        var processTemplates = buildServer.QueryProcessTemplates(teamProject);
        var result = processTemplates.First(t => t.ServerPath.Contains("/BuildProcessTemplates/MyDefaultTemplate.xaml"));

        return result;
    }

    private static void CopyBuildDefinitions(string sourceServer, string sourceTeamProject, string targetServer,
                                             string targetTeamProject, string defaultDropLocation)
    {
        var sourceBuildServer = GetBuildServerFromServerUrl(sourceServer);
        var sourceBuildDetails = sourceBuildServer.QueryBuildDefinitions(sourceTeamProject);

        foreach (var sourceBuildDetail in sourceBuildDetails)
        {
            CopyBuildDefinition(sourceBuildDetail, targetServer, targetTeamProject, defaultDropLocation);
        }
    }

    private static void CopyBuildDefinition(IBuildDefinition buildDefinition, string targetServer, string targetTeamProject, string defaultDropLocation)
    {
        var targetBuildServer = GetBuildServerFromServerUrl(targetServer);

        var buildDefinitionClone = targetBuildServer.CreateBuildDefinition(targetTeamProject);

        buildDefinitionClone.BuildController = GetDefaultBuildControllerFromBuildServer(targetBuildServer);
        buildDefinitionClone.ContinuousIntegrationType = buildDefinition.ContinuousIntegrationType;
        buildDefinitionClone.ContinuousIntegrationQuietPeriod = buildDefinition.ContinuousIntegrationQuietPeriod;

        // Noch ändern.
        //buildDefinitionClone.DefaultDropLocation = buildDefinition.DefaultDropLocation;
        buildDefinitionClone.DefaultDropLocation = defaultDropLocation;

        buildDefinitionClone.Description = buildDefinition.Description;
        buildDefinitionClone.Enabled = buildDefinition.Enabled;

        //buildDefinitionClone.Name = String.Format("Copy of {0}", buildDefinition.Name);
        buildDefinitionClone.Name = buildDefinition.Name;

        //buildDefinitionClone.Process = buildDefinition.Process;
        buildDefinitionClone.Process = GetDefaultProcessTemplateByServerPathFromBuildServer(targetBuildServer, targetTeamProject);

        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);
        }

        buildDefinitionClone.Save();
    }
}

}

希望能帮助他人。

相关问题