Използване на персонализирана задача в конфигурацията на CC.net

Създадох следната персонализирана задача за Cruise Control .net, но не мога да намеря нито една препратка за това как добавяте персонализирана задача към конфигурацията на проекта. Някой има ли полезен пример за това как да добавите препратка към персонализирана задача в 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;
    }
}

person Nathan Tregillus    schedule 16.07.2012    source източник


Отговори (2)


Не споменахте версията, която използвате, така че отговарям на това с предположението, че потребителите ще използват по-нови версии. Създадох това въз основа на опит в разработването на персонализирани задачи за cruisecontrol.net 1.8.3.0

Можете да намерите някои от api документация за създаване и използване на плъгини тук: 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.

    • If you have setup a plugins directory by supplying a value for PluginLocation in your ccnet.exe.config, you will need to place your assembly there instead.
    • Всяка сглобка, на която се позовавате във вашия проект, която все още не е в сървърната папка на 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()].

person SomeInternetGuy    schedule 25.06.2014

Така че основно хвърлих това, защото никъде няма примери за това как да добавите персонализирана задача към конфигурацията на 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;
person Nathan Tregillus    schedule 17.07.2012
comment
Това наистина не е отговор на въпроса, който сте публикували - person SomeInternetGuy; 16.10.2014