1

次のカスタム タスクを Cruise Control .net 用に作成しましたが、カスタム タスクをプロジェクト構成に追加する方法についてのリファレンスが 1 つも見つかりません。cc.net でカスタム タスクへの参照を追加する方法の役立つ例はありますか?

(以下は私の新しいタスクです)

public class RestoreDb : TaskBase
{
    #region Parameters

    [Required]
    public string ServerName { get; set; }
    [Required]
    public string DbName { get; set; }

    public string BackupFileName { get; set; }

    #endregion

    protected override bool Execute(ThoughtWorks.CruiseControl.Core.IIntegrationResult result)
    {
        bool returnResult = false;
        try
        {
            SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder();
            connectionStringBuilder.IntegratedSecurity = true;
            connectionStringBuilder.DataSource = ServerName;
            SqlConnection connection = new SqlConnection(connectionStringBuilder.ToString());
            connection.Open();

            Server server = new Server(new ServerConnection(connection));

            if (server.Databases[DbName] != null)
            {
                Log.Info("Dropping existing " + DbName + " on " + ServerName);
                server.Databases[DbName].Drop();
            }
            else
            {
                Log.Info(DbName + " on " + ServerName + " doesn't exist.");
            }

            Log.Info("Restoring " + DbName + " on " + ServerName);
            Database newDb = new Database(server, DbName);

            Restore rs = new Restore();
            rs.NoRecovery = false;

            FileInfo fi = new FileInfo(server.Settings.BackupDirectory + "\\" + BackupFileName);
            rs.Devices.AddDevice(fi.FullName, DeviceType.File);
            rs.Database = DbName;
            rs.Action = RestoreActionType.Database;
            rs.ReplaceDatabase = true;

            DataTable fileContents = rs.ReadFileList(server);
            string originalDbName = fileContents.Rows[0][0].ToString();
            string originalLogFileName = fileContents.Rows[1][0].ToString();
            rs.RelocateFiles.Add(new RelocateFile(originalDbName, 
            string.Format(@"C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\{0}.mdf", DbName)));

            rs.RelocateFiles.Add(new RelocateFile(originalLogFileName,
            string.Format(@"C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\{0}_1.ldf", DbName)));

            rs.SqlRestore(server);
            Log.Info("Restoring done.");
            returnResult = true; // success!
        }
        catch (Exception ex)
        {
            Log.Error(ex);
            returnResult = false;
        }
        return returnResult;
    }
}
4

2 に答える 2

1

使用しているバージョンについて言及していないので、ユーザーが新しいバージョンを使用することを前提として回答しています。 1.8.3.0のカスタム タスクを開発した経験に基づいて作成しました。

の作成と使用に関する の一部は、http : //www.cruisecontrolnet.org/projects/ccnet/wiki/DevInfo_MakingPlugins にあります。

編集:提供されたリンクの CruiseControl.NET ドキュメントが更新され、ここに含まれる情報の多くが含まれていることに注意してください。

ただし、このドキュメントはかなり軽量であり、独自のタスクを作成しようとするときに最終的に疑問を抱くトピックの範囲を実際にはカバーしていません。

プロセスは、私が言うことができるのと同じくらい簡単です。

  • カスタム タスクのプロジェクトは、ルートの CruiseControl.NET サーバー フォルダーにある次のアセンブリを参照する必要があります。

    • NetReflector.dll
    • ThoughtWorks.CruiseControl.Core.Dll
    • .NET 3.5 Framework の一部ではない、参照するその他のアセンブリ
  • カスタム タスクを作成するときは、ccnet.config で利用できるように、リフレクター属性で公開したいクラスまたはプロパティをマークする必要があります。

  • CruiseControl.NET がカスタム ライブラリを使用できるようにするには、次の規則に従ってアセンブリに名前を付ける必要があります: ccnet.WhateverYouWantHere.plugin.dll

  • このアセンブリを CruiseControl.NET Server フォルダーに配置する必要があります。

    • ccnet.exe.config で PluginLocation の値を指定してプラグイン ディレクトリをセットアップした場合は、代わりにアセンブリをそこに配置する必要があります。
    • プロジェクトで参照するアセンブリのうち、まだ CruiseControl.NET サーバー フォルダーにないアセンブリは、サーバーまたはプラグイン フォルダーにも追加する必要があります。
namespace MyTasks
{
    [ReflectorType("MyCustomTask")]
    public class MyCustomTaskClass : ITask 
    {
        [ReflectorProperty("MyCustomTaskProperty")]
        public string CustomProperty { get; set; }

        public string MyInternalPublicProperty { get; set; }

        public void Run(IIntegrationResult result){}
    }
}

注:プロパティの名前と ccnet.config に公開する名前は一致する必要はありません。

作成されたタスク、ラベラーなどを参照するには、Reflector 属性で指定された文字列を使用するだけです。

<project>
    <tasks>
        <MyCustomTask MyCustomTaskProperty="This is an example"/>
    </tasks>
</project>

このコードを使用しようとして、タグに MyInternalPublicProperty への参照も追加しようとすると、機能しません。

<project>
    <tasks>
        <MyCustomTask MyInternalPublicProperty="This is will throw an exception in the service and not reload the ccnet config until the invalid content is removed from the config"/>
    </tasks>
</project>

これは、独自の [ReflectorProperty()] 属性でプロパティを装飾しなかったためです。

于 2014-06-25T14:43:23.733 に答える
0

カスタムタスクをcc.net構成に追加する方法の例がどこにもないため、基本的にこれを投げました。以下は、まったく同じ手順を実行する、私が書いたpowershellスクリプトです。

$ServerName = 'servernamehere';
$DatabaseName = 'newDbNameHere';
$BackupFile = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\backupFileHere.bak';
if($args[0])
{
    $ServerName = $args[0];
}
if($args[1])
{
    $DatabaseName = $args[1];
}
if($args[2])
{
    $BackupFile = $args[2];
}

[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended")
try 
{
    $Server = new-object ("Microsoft.SqlServer.Management.Smo.Server") $ServerName

    If ($Server.Databases.Contains($DatabaseName))
    {
        write-host "Dropping existing " $DatabaseName " on " $ServerName;
        #$Server.Databases[$DatabaseName].SetOffline();
        $Server.Databases[$DatabaseName].Drop();
    }
    else
    {
        write-host $DatabaseName " on " $ServerName " doesn't exist.";
    }
    $Database = new-object ("Microsoft.SqlServer.Management.Smo.Database") ($Server, $DatabaseName);

    $restore = new-object ('Microsoft.SqlServer.Management.Smo.Restore');
    $restore.NoRecovery = $false;

    $fil=new-object "Microsoft.SqlServer.Management.Smo.BackupDeviceItem";
    $fil.DeviceType='File';
    $fil.Name= $BackupFile;
    $restore.Action="Database";
    $restore.Devices.Add($fil);
    $restore.Database=$DatabaseName;
    $restore.ReplaceDatabase = $true;

    #retrieving the backup file's original database values so we can replace them
    $FileContents = $restore.ReadFileList($Server);
    $originalDbName =  $FileContents.Rows[0][0].ToString();
    $originalLogFileName = $FileContents.Rows[1][0].ToString();

    #replacing the bak files original file names with the new file names
    $mdf = new-object "Microsoft.SqlServer.Management.Smo.RelocateFile" ($originalDbName,
        "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\$DatabaseName.mdf");
    $restore.RelocateFiles.Add($mdf);
    $ldf = new-object "Microsoft.SqlServer.Management.Smo.RelocateFile" ($originalLogFileName,
        "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\$DatabaseName_Log.mdf");
    $restore.RelocateFiles.Add($ldf);


    write-host "Restoring database $DatabaseName  on  $ServerName from file $BackupFile";

        $restore.SqlRestore($Server);
        write-host "Restore Complete";
}
catch [System.Exception] {
  # $_ is set to the ErrorRecord of the exception
  $currentException = $_.Exception;
  write-host "Root Exception: " $currentException.Message;
  While($currentException.InnerException)
  {
    $currentException = $_.Exception.InnerException;
    write-host "Inner Exception: " $currentException.Message;
  }
  write-host "Restore Failed.";
  exit 0; #failure
}    
exit 1;
于 2012-07-17T14:22:50.557 に答える