Управление базой данных SQL Server с непрерывной интеграцией

Скажем, у нас есть сервер непрерывной интеграции. Когда я регистрируюсь, пост-крючок вытягивает последний код, запускает тесты, все пакеты. Каков наилучший способ автоматизировать изменения базы данных?

В идеале я бы построил установщик, который мог бы либо создавать базу данных с нуля, либо обновлять существующую, используя какой-то автоматизированный метод синхронизации.

Ответ 1

Если у вас есть возможность определить и контролировать все управление базой данных и процесс создания db, серьезно взгляните на DB Ghost - it больше, чем просто инструмент - это процесс.

Если вам это нравится и вы можете его реализовать, вы получите большую отдачу от него, но это немного похоже на "все или ничего". Рекомендуется.

Ответ 2

Недавно я столкнулся с статьей, которая может быть полезной.

Автор объяснил некоторые из лучших методов непрерывной интеграции, включая тестирование, обработку и автоматизацию.

Вот некоторые из ключевых выводов:

  • Во многих магазинах код проверяется модулем в точке фиксации. Для баз данных предпочтительнее запускать все модульные тесты сразу и последовательно в отношении базы данных QA, а также разработки, в качестве части шага тестирования.
  • Шаг теста является важной частью любого процесса CI/CD. Тест-скрипты, в том числе сами тесты, также должны быть версией в исходном управлении, извлечены в точке этапа сборки и выполнены
  • Вытягивание данных из производства привлекательно, так как это выгодно, но никогда не является хорошей идеей.
  • Лучшим подходом является использование инструмента или script для быстрого, многократного и надежного создания синтетических тестовых данных для ваших транзакционных таблиц.
  • Выполнение модульных тестов для получения сводных результатов вручную для потребления человеком поражает цель автоматизации. Нам нужны машиночитаемые результаты, которые могут позволить автоматическому процессу прервать, разветкить и/или продолжить.
  • Запуск процесса CI, который требует 100% всех пройденных тестов, сродни отсутствию CI вообще, если конвейер рабочего процесса настроен атомарно, чтобы остановиться при ошибке, что и должно быть. Чтобы направить иглу, тесты должны иметь встроенные пороговые значения, что приведет к возникновению ошибки, основанной либо на том, что в случае неудачных тестов, либо в некоторых случаях, если определенные высокоприоритетные тесты потерпят неудачу.
  • Все процессы должны в конечном итоге генерировать логический результат прохода или сбоя, но некоторые неавтоматизированные процессы могут легко найти свой путь в конвейере рабочего процесса CI (например, модульное тестирование). Программное обеспечение должно быть plug-n-play в любом конвейере рабочего процесса, принимая известные входы и создавая ожидаемые результаты - например, pass, fail.
  • Процесс CI/CD должен быть прерван при сбое, и электронное письмо с уведомлением должно быть немедленно отправлено против продолжения цикла конвейера.
  • Процесс CI не должен циклически повторяться до тех пор, пока не будут исправлены ошибки в последней сборке. При сбое вся команда должна получить уведомление об отказе, включая как можно больше сведений о том, что не удалось.
  • Если конвейер занимает 1 час, от начала до конца, для завершения, включая все тестирование, то все интервалы сборки должны быть установлены не менее одного часа, а все новые коммиты должны быть поставлены в очередь и применяться к следующему построить.
  • В сценариях автоматизации нет текстовых паролей.

Ответ 3

Я бы предостерег от использования резервной копии db как артефакта развития, большинство передовых методов CI предполагают, что вы управляете схемой, процедурами, триггерами и представлениями в качестве артефактов разработки первого класса. Побочные эффекты - это то, что вы можете сделать этот шаг дальше и использовать их для создания новой базы данных всякий раз, когда захотите, в идеале у вас также есть некоторые данные, которые можно вставить в базу данных.

Вот версия нот утеса, чтобы получить ваши ноги влажными, но там есть много в этом пространстве:  http://www.infoq.com/news/2008/02/versioning_databases_series

Мне нравятся некоторые идеи, которые есть у Скотта Амблера, сайт хорош, но книга удивительно глубока для такого сложного набора проблем. http://www.agiledata.org/ http://www.amazon.com/exec/obidos/ASIN/0321293533/ambysoftinc

Ответ 4

Подход Red Gate с использованием SQL Source Control и командной строки SQL Compare Pro подробно описан здесь: http://downloads.red-gate.com/HelpPDF/ContinuousIntegrationForDatabasesUsingRedGateSQLTools.pdf

Трой Хант написал статью о Simple Talk под названием "Непрерывная интеграция для баз данных SQL Server": http://www.simple-talk.com/content/article.aspx?article=1247

Ответ 5

Red Gate - довольно надежное решение, и оно работает из коробки. Но самое лучшее, что вы можете интегрировать в процесс непрерывной интеграции. Я использую его с Msbuild и Hudson. быстро объясняя, как это работает: http://blog.vincentbrouillet.com/post/2011/02/10/Database-schema-synchronisation-with-RedGate

если вам нужно больше узнать об этом, не стесняйтесь спрашивать

Ответ 6

Посмотрели ли вы на FluentMigrator? Загрузка по умолчанию включает сценарии Nant, которые легко добавить в CI. Свободный, с открытым исходным кодом и простой в использовании. Работает для самых разных баз данных.

Ответ 7

Последняя версия (5.0) DB Ghost не страдает от проблемы "без символа ASCII" (это просто означает, что файл закодирован в кодировке UTF8), и он должен иметь возможность делать именно то, что вам нужно.

Кроме того, инструменты могут фактически использоваться автономно для выполнения различных функций (сценариев, построения, сравнения, обновления и упаковки), если вы хотите, просто, используя все это вместе, обеспечивает полный сквозной процесс, что делает общее значение больше, чем сумма его частей.

По сути, чтобы внести изменения в схему, вы обновляете сценарии создания отдельных объектов и скрипты вставки для таблицы (для справочных данных), которые хранятся под контролем источника, точно так же, как вы разрабатывали базовую базу данных "первый день". Инструменты DB Ghost используются для обеспечения всего этого, создавая эти сценарии в совершенно новую базу данных (используя непрерывную интеграцию, если необходимо), а затем сравнивая и обновляя целевую базу данных, которая может быть копией производственной базы данных. Этот процесс создает дельта script, который может использоваться в реальной производственной базе данных во время go-live.

Вы даже можете создать проект базы данных Visual Studio и добавить его в любые решения, которые у вас есть.

Malc

Ответ 8

Я знаю, что этот пост старый, но у нас есть новое решение, которое использует следующий подход:

  • Разработчики script индивидуальные изменения SQL и передают их источнику контроль.
  • Наша программа (OneScript) вытаскивает файлы изменений script из   источника, фильтрует и сортирует их, и генерирует один   релиз script.
  • Этот выпуск script файл затем применяется к       для создания выпуска.

Наша домашняя страница здесь объясняет этот процесс более подробно и имеет ссылку на пример, который делает эти шаги автоматически из крюка Subversion. Так вскоре после фиксации разработчик получает сообщение по электронной почте, если выпуск был успешным или имел ошибки. Код PowerScript включен.

Отказ от ответственности - я работаю в компании, которая делает OneScript.