Непрерывная интеграция с ssdt

Итак, я смотрел на инструменты данных sql server (ssdt) и видел некоторую информацию, предполагающую возможность непрерывной интеграции с проектами баз данных Microsoft, и мне просто интересно, действительно ли кто-то делает это на практике.

Подход dacpac выглядит действительно привлекательно, и на первый взгляд кажется возможным, но не уверенным. Глядя на Visual Studio 2013 с последней версией ssdt.

Спасибо!


person Shaunt    schedule 12.03.2015    source источник


Ответы (1)


Да, это возможно, и в настоящее время я делаю это и настроил его в нескольких средах.

Если у вас есть какие-то конкретные вопросы, задавайте их!

Основные подходы:

  • Создать dacpac при сборке
  • Используйте sqlpackage.exe для отправки в базу данных Sql
  • Запустите модульные тесты tSQLt
  • Возможно создание сценариев для развертывания в других средах или развертывания в других средах.

Вы можете переключить sqlpackage для таких вещей, как redgate sql compare или посмотреть на инструменты Redgate CI, если вам нужно более простое время установки - я предпочитаю запускать sqlpackage как часть сборки и контролировать его самостоятельно, но это личное предпочтение.

Какой бы подход вы ни выбрали для создания сценариев / развертывания баз данных (sqlpackage или redgate), инструменты являются инструментами командной строки, поэтому их можно интегрировать с msbuild или любым скриптом / сервером ci.

Ed

person Ed Elliott    schedule 12.03.2015
comment
Спасибо! У меня был готовый прототип. У меня возникли проблемы с некоторыми настройками публикации. Какие настройки вы используете. В идеале вы просто позволяете dacpac выполнять всю миграцию схемы, правильно? - person Shaunt; 12.03.2015
comment
Я использовал комбинацию получения sqlpackage для развертывания, а также создания сценариев и их развертывания позже - это просто зависит от того, что вы действительно хотите. Я разрешаю отбрасывать все объекты, не входящие в исходный код, иначе вы оставите старые объекты - я также отфильтровываю некоторые вещи, такие как файловые группы и безопасность, поэтому я не получаю предупреждений и мне не нужно включать их в проект. При развертывании в базе данных CI я всегда разрешаю потерю данных - в производственной среде я обычно этого не делаю! - person Ed Elliott; 12.03.2015
comment
да, это было частью проблемы, с которой я столкнулся на самом деле ... dba хотел управлять безопасностью, и если бы я отбросил все объекты, не входящие в исходный код, мне казалось, что я не могу игнорировать безопасность ... звучит так, как будто вы говорите, что это возможно ... возможно, мне нужно еще раз взглянуть на настройки. Я не мог заставить его выполнять только сохраненные процессы, представления, таблицы, схемы, функции, индексы ... и т. Д. Есть ли шанс, что вы можете опубликовать свои настройки? Я хотел бы увидеть, что на самом деле работает, чтобы я мог сравнить с тем, что использовал. Несколько демонстраций, которые я видел, о том, как это настроить, на самом деле не касались каких-либо подробностей о настройках. - person Shaunt; 12.03.2015
comment
Быстрое добавление к комментариям Эда - у нас (команда SSDT) ​​есть презентация и технический документ о непрерывной интеграции с использованием Team Foundation Server в нашем блоге: blogs.msdn.com/b/ssdt. В техническом документе описаны подходы к использованию в зависимости от вашей общей настройки. Также обратите внимание, что самый простой способ интеграции tSQLt находится здесь: zogamorph.blogspot.co.uk/2014/07/ - person Kevin Cunnane; 13.03.2015
comment
Привет, Шон, если у вас установлена ​​последняя версия SSDT, есть флажки для исключения пользователей и т. Д .: blogs.msdn.com/b/ssdt/archive/2015/02/23/ - до этого я написал фильтр, и это то, что я использую, но перейду на новый SSDT, когда в следующий раз сделаю что-нибудь со сборкой (/ p: AdditionalDeploymentContributorArguments = SqlPackageFilter = IgnoreSecurity - the.agilesql.club/Blogs/Ed-Elliott/) - person Ed Elliott; 13.03.2015
comment
Другой вопрос ... Бывают случаи, когда вам нужно выполнить одно развертывание, чтобы, возможно, разбить таблицу на основные детали. Как бы вы это сделали через ci? Я бы подумал, что сценарий перед развертыванием для хранения данных и удаления данных, выполнения стандартных изменений схемы и выполнения сценария после развертывания для загрузки данных. Теперь, как получить это, пытаясь запускать это каждый раз? Есть ли способ использовать версию сборки # или вы просто создаете оператор if для таблицы, которую вы разделяете, с полями a, b, c? (это было бы отстойно). Или вы бы добавили данные в специальную таблицу, чтобы отметить, что вы это уже сделали? - person Shaunt; 31.03.2015
comment
Привет, Шон, я делаю такие вещи, это сценарии до / после развертывания и удаляю их после каждого основного выпуска, когда я знаю, что они были развернуты повсюду (но вы можете оставить их навсегда) - просто запустите запрос, который проверяет, действительно ли он был запущен, т.е. если вы переместите столбец b из таблицы a в таблицу c - сделайте, если существует (выберите * из sys.columns, где name = 'b' и object_id = object_id ('a')) - это будет только уволено когда столбец все еще находится в исходной таблице, из которой вы хотите его переместить - все идемпотентно! - person Ed Elliott; 31.03.2015
comment
Понятно ... как вы управляете заданиями SQL? Я просматривал эту статью в блоге. sqlconcepts.co.nz/2012/09/ ... выглядит довольно многообещающе, хотя я не уверен, как мне проверить, нужно ли обновлять задания или нет - Есть мысли? - person Shaunt; 16.04.2015
comment
@Shaunt: мы создали собственные процедуры, которые принимают параметры для создания заданий, шагов и расписаний. Они всегда выполняют, а в основном отбрасывают и воссоздают задания, шаги и расписания при каждом развертывании. Таким образом, вам не нужно определять, нужно ли их обновлять. Они всегда будут отражать то, что находится в системе контроля версий. Чтобы ответить на ваш предыдущий вопрос, делают ли люди это на практике, мы, финансовая компания, развертываем таким образом около 75+ баз данных в 5 средах. Наша команда бизнес-аналитики также использует это для склада и ETL в трех средах. Мы используем Jenkins, TeamCity и PowerShell для CI. - person Eugene Niemand; 19.05.2016