Анонс AutoPatch .Net
От: Enox Россия http://yuryskaletskiy.blogspot.com/
Дата: 28.08.09 09:46
Оценка: 193 (8)
Всем привет! Хочу рассказать о системе AutoPatch .Net.

Сначала немного о причинах, вынудивших меня взяться за проект — я довольно долго пытался найти систему обновления баз данных для наших .Net проектов. Эти поиски отражены в моем блоге (1) и (2). Для Java проектов у нас в компании мы используем AutoPatch. Отчаявшись найти себе идеальную систему обновлений для .net, я решил закончить историю с портированием autopatch.

Я доработал и выложил на Google Code исходники и инсталлятор пре-пре-альфа версии 0.0.1 .Net-овского порта AutoPatch. Авторы начали портирование оригинальной Java-версии, но забросили его в лохматом году. Кроме того, я добавил к нему консольный и WinForm-овские frontend-ы.

Порт сейчас доведен до состояния, когда он уверенно патчит SQLServer-ные базы
Кроме того, я попробовал использовать AutoPatch как довесок к юнит-тестам, который отвечает за то, чтобы перед стартом тестов приводить базу данных в некоторое известное изначально состояние.

Ссылка на страницу проекта: http://code.google.com/p/autopatchnet
Оригинальная статья в моем блоге: http://yuryskaletskiy.blogspot.com

Что позволяет AutoPatch

AutoPatch сканирует каталог с патчами в поиках файлов вида "patchNNNNN_xxxxx.sql" где NNNN — уникальный порядковый номер патча, а xxxxx — произвольное имя.

Например, первые каталог со скриптами обновления БД может выглядеть так:


dir DatabasePatches /w

patch00001_IS_DB_STATUS.sql
patch00002_IS_DB_STATUS.sql
patch00003_sp_DBVersion.sql
patch00004_sp_GetGlobalFeaturePermissions.sql
patch00005_sp_SetDBVersion.sql
patch00006_sp_SetGlobalFeaturePermissions.sql
patch00007_EFS_DistributedEmail.sql
patch00008_EFS_DistributedEmail.sql
patch00009_EfsGetDistributedEmails.sql
patch00010_sp_EfsAddDistributedEmails.sql
patch00011_sp_CalcVar.sql
patch00012_sp_CalcVarsCorellation.sql


Номера патчей

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

Заметим, что номера патчей не обязательно могут идти по порядку — практика использования AutoPatch говорит, что имеет смысл создавать патчи с шагом 5 или 10 на случай, если по результатам тестирования в систему понадобится вставить новый патч перед существующим. Нумерация патчей с шагом 5 или больше позволит не перенумеровывать уже созданные патчи.

Подробная информация об архитектуре и принципе действия AutoPatch размещена на оригинальном сайте: http://autopatch.sourceforge.net/documentation-1.2b.php

Как пользоваться

Для обновления БД сейчас можно использовать утилиту командной строки AutoPatch.exe. У этой утилиты два параметра: /info и /patchtolatest. Если набрать /info, то вам покажут следующую информацию


AutoPatch\bin>AutoPatch.exe /info
AutoPatch Shell v0.1
Getting information about latest patch level

*** System DatabaseCore
        Current Database patch level is        : 376
        Current number of unapplied patches is : 1
        The next patch to author should be     : 378
Highest patch level for system is 377


На этом примере мы видим, что база данных, на которую настроен AutoPatch, обновлена не полностью (Current number of unapplied patches is 1) а текущий patchlevel базы — 376. Последний номер патча в каталоге патчей — 377.

Для обновления базы необходимо использовать команду /patchtolatest. AutoPatch будет накладывать все неналоженные патчи по очереди до окончания списка патчей или до появления первой ошибки (в этом случае база останется в состоянии, предыдущем перед накатом ошибочного скрипта)


AutoPatch\bin>AutoPatch.exe /patchtolatest
AutoPatch Shell v0.1
Patching to latests patch level
Applying patch patch00377_sp_DBVersion_patchlevel...

c:\>AutoPatch.exe /info
AutoPatch Shell v0.1
Getting information about latest patch level

*** System DatabaseCore
        Current Database patch level is        : 377
        Current number of unapplied patches is : 0
        The next patch to author should be     : 378
Highest patch level for system is 377


Имя системы (System Name)

AutoPatch позволяет накладывать на одну базу несколько различных типов патчей с различными номерами patchlevels. Например, отдельно могут накатываться скрипты основного ядра базы данных, и отдельно — какого-нибудь прикладного направления. Каждое такое направление в AutoPatch называется "системой". Для каждой системы требуется указать ее имя.

AutoPatch не накладывает ограничений на количество систем. Скрипты разных систем естественно не должны конфликтовать, но это уже задача разработчика.



AutoPatch UI
Чтобы облегчить процесс ручного развертывания или обновления базы данных на сервере, я написал небольшую утилиту AutoPatchUI, которая в этом помогает. Несколько скриншотов, из которых понятно, как работает AutoPatchUI

1 — Выбор патчей и базы для обновления





2 — окно подтверждения



3 — наложение патчей




AutoPatch.Net как помошник в создании unit-тестов

AutoPatch.Net может загружать патчи не только из каталога ОС, но и из ресурсной сборки .net. Это позволяет нам встраивать патчи, например, в юнит-тесты и таким образом для тестов, работающих с базой данных, получать перед стартом тестов некое заранее известное состояние базы.

По собственному опыту — код, инициализирующий базу, можно расположить в [FixtureStartUp], а скрипты обновления создать таким образом, чтобы повторный прогон скриптов переинициализировал базу.

К примеру, для инициализации БД можно использовать следующие скрипты


-- patch001_cleanupdb.sql
delete from groups
delete from users

-- patch002_defaultUser.sql
insert into Users (userid, username) values (1, 'test user')

-- patch002_defaultGroup.sql
insert into Groups (groupid, groupname) values (1, 'test group')


Эти скрипты добавляются в сборку юнит тестов как embedded resources

В дальнейшем, если понадобятся другие объекты в БД, дописываются новые патчи.

Чтобы проинициализировать базу, используется API из библиотеки AutoPatch:


using com.tacitknowledge.util.migration.ado;
using com.tacitknowledge.util.migration.ado.conf;

...
[TestFixtureSetUp]
public void SetupDb()
{
  // reset unit test db patch level
  DbUtils.ExecuteNonQuery("DELETE FROM patches WHERE system_name='UnitTests'");

  // update to latest patch level
  EnsureTestObjectsIsUpToDate();

}

public static void EnsureTestObjectsIsUpToDate()
{
   AdoMigrationLauncherFactory launcherFactory = AdoMigrationLauncherFactoryLoader.createFactory();
   var smc = new SimpleMigrationConfiguration();

   smc.PatchAssembly = Assembly.GetExecutingAssembly().Location;
   smc.PatchPath = "MyUnitTests.Tests.DatabaseInitPatches";
   smc.SystemName = "UnitTests";

   var launcher = launcherFactory.createMigrationLauncher(smc);
   launcher.MigrationProcess.MigrationFailed += MigrationProcess_MigrationFailed;
   launcher.DoMigrations();
}

static void MigrationProcess_MigrationFailed(
    com.tacitknowledge.util.migration.IMigrationTask task, 
    com.tacitknowledge.util.migration.IMigrationContext context, 
    com.tacitknowledge.util.migration.MigrationException e)
{
     throw new ApplicationException("Database update failed on step " + task.Name, e);
}


Скачать исходники и инсталлятор AutoPatch.Net: http://code.google.com/p/autopatchnet/downloads/list
Спасибо!
--
[R], Enox
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.