1

テストシステムとしてTFS2012をインストールし、生産性を上げる前にいくつかのテストを行いました。これには、多くの作業であった多くのBuildDefinitionsを定義することも含まれます。

テストが成功すると、TFS2012を搭載した新しいサーバーがインストールされます。

この新しいサーバー(当時は生産的なシステムとして動作します)の場合、テストシステムからBuildDefinitionsを復元したいと思います。ただし、TeamCollection全体ではなく、BuildDefinitionsのみです。テストチェックインを実行しましたが、本番サーバーでこれらを実行したくないためです。

さて、BuildDefinitionsのみをバックアップおよび復元することは可能ですか?

Sqlデータベースを介して直接可能かもしれませんが、他のいくつかのテーブルを指して、そこでの参照に少し不安を感じています。

よろしく、ピーターブッチャー

4

2 に答える 2

1

ビルド定義はソース制御されません。唯一のオプションは、 Tfs_DefaultCollectionデータベースのtbl_BuildDefinition*テーブルを復元または表示できるTFSデータベースのバックアップに依存することです。

この機能にはユーザーの声があり、TFSAPIを使用してそれを行うこともできます。

uservoiceに投票を追加します。

ビルド定義をバージョン管理する方法を提供する

TFSAPIの使用

TFS 2010ビルド定義をコピーするにはどうすればよいですか?

于 2013-01-31T04:26:00.233 に答える
1

最後に、他の多くのテーブルへの参照があるため、データベースには触れないことにしました。

TFS API v11(TFS2012)とビットC#コードを使用しました。これは、このベースからのニーズに適合しました。TFS2010ビルド定義をコピーするにはどうすればよいですか?

すべてのビルド定義を1つの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();
    }
}

}

それが他の人を助けることを願っています。

于 2014-01-13T10:11:11.563 に答える