#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,
Опции:
- попробуйте интегрированную защиту, она будет использовать учетную запись вашего домена
- если опция не может быть использована, попробуйте сохранить строку подключения в качестве раздела реестра, чтобы она не была очевидной или переменной среды.