Winforms ConnectionString и TeamCity

#winforms #continuous-integration #teamcity

#winforms #непрерывная интеграция #teamcity

Вопрос:

Мы запускаем новый проект WinForms и решили использовать TeamCity для создания сборок и запуска модульных и интеграционных тестов. Проект имеет дело с базой данных. У нас есть 3 базы данных (developDB (используется разработчиками при разработке =) ), testDB (используется teamcity для запуска тестов) и productionDB (используется клиентом)). TeamCity имеет 3 конфигурации сборки. Первая запускается, когда происходит фиксация. Вторая запускается каждую ночь для запуска интеграционных тестов. И третья запускается разработчиком, когда мы хотим выпустить релиз. Итак, я хочу, чтобы TeamCity мог изменять ConnectionString в зависимости от того, какой тип сборки происходит. Также я не хочу сохранять ConnectionString в app.config (я не хочу, чтобы клиент знал пользователя и пароль). Какие опции доступны для выполнения задачи?
Заранее спасибо!
Обновлено
Я использую NHibernate и FluentNHibernate для подключения к базам данных, если это имеет значение.

Ответ №1:

В этой ситуации я бы использовал TeamCity для запуска скрипта nant для выполнения сборки.

NAnt позволяет изменять значения файла конфигурации (например, строку подключения) во время сборки.

Пример использования TeamCity / NAnt для развертывания в различных промежуточных средах можно найти в этом сообщении в блоге: http://thecodedecanter.wordpress.com/2010/03/25/one-click-website-deployment-using-teamcity-nant-git-and-powershell/

Как предлагает @surfen, значения строки подключения для каждой среды должны быть зашифрованы, чтобы предотвратить сохранение учетных данных в виде обычного текста.

Комментарии:

1. Отрицательный ответ — пожалуйста, добавьте комментарий, чтобы объяснить, почему вы отклонили принятый ответ?

Ответ №2:

Я не использовал TeamCity, но я написал несколько приложений с динамически изменяющимися строками подключения во время процесса входа в систему (т. Е. во время выполнения), и это довольно просто.

Вы не сказали, как вы подключаетесь к своей базе данных. Поскольку вы упомянули app.config, я полагаю, что это ADO.NET Наборы данных или аналогичная технология, которая создает строку подключения, доступную только для чтения (getter), в ваших настройках.Designer.cs / app.config.

Что я сделал, так это создал метод настройки в Settings.cs (не Settings.Designer.cs) для свойства ConnectionString, подобного этому:

 public void setNorthwindConnectionString(String value) {
    this["NorthwindConnectionString"] = value;
}
  

Затем мой сгенерированный набор данных использует эту NorthwindConnectionString для доступа к данным.

Вы можете использовать директивы препроцессора для условной настройки вашей строки подключения:

 #if DEBUG
    Console.WriteLine("Mode=Debug"); 
    Settings.Default.setNorthwindConnectionString("(DebugDBConnectionString)");
#else
    Console.WriteLine("Mode=Release"); 
    Settings.Default.setNorthwindConnectionString("(ReleaseDBConnectionString)");
#endif
  

Вы также можете зашифровать свои строки подключения и скопировать правильный app.config во время события post build.

Ответ №3:

Я предполагаю, что вы будете использовать msbuild для создания своих проектов в Team city. Если это так, то вы можете отправить символ условной компиляции, в который вы можете передать любые символы, которые вам нужны.

Получив символы, вы можете делать такие вещи, как:

 #if DEVBUILD
//.... Your Connection String Code here
#endif

#if INTBUILD
.... Your Connection String Code here
#endif
  

Это ответ на ваш первый вопрос.

Что касается второй части вашего вопроса, где вы не хотите сохранять имя пользователя и пароль в app.config,

Опции:

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