Автоматическое развертывание с использованием CI-сервера - PullRequest
12 голосов
/ 18 января 2012

В нашем проекте развертывание - это всегда боль, в основном из-за ошибок, допущенных командой управления релизами.Либо они испортили конфигурацию, либо установили неверную версию.Мы используем teamcity в качестве нашего CI-сервера, и он создает артефакты в виде zip-файлов (dll и exe), которые обычно передаются команде разработчиков.У меня вопрос, есть ли способ автоматизировать весь процесс развертывания?

Есть ли коммерческий инструмент, который поддерживает это?

Мы хотим сделать следующее:

  • Обновите конфигурационные файлы со значениями, специфичными для среды.

  • Установите службы windows на сервер.

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

  • Изменение строк подключения к БД.

Выполните все вышеперечисленное для различных сред (например, int, uat и prod).

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

Спасибо, -Майк

Ответы [ 6 ]

9 голосов
/ 18 января 2012

Я использовал TeamCity для некоторых довольно крупных проектов и автоматизировал каждый аспект развертывания, кроме базы данных. Основные шаги, которые я использую для каждого проекта:

  1. Установите агент TeamCity на производственном сервере
  2. У сборки получено все из системы контроля версий (у вас все есть в системе контроля версий?).
  3. Создайте шаг сборки и опубликует ваше решение. Это может быть достигнуто путем добавления следующего аргумента командной строки к вашему вызову MSBuild:

    / p: конфигурация = [ваша конфигурация]; DeployOnBuild = True; PackageAsSingleFile = False

    Ваши опубликованные файлы (и преобразованные файлы конфигурации) будут записаны в следующий каталог:

    [Каталог вашего проекта] \ obj \ [Ваша конфигурация] \ Package \ PackageTmp

  4. Использование языка сценариев (в моем случае Powershell) для копирования опубликованных артефактов в каталог развертывания и внесения упомянутых вами изменений в конкретной среде. Например. извлечение архивов, копирование файлов, запуск / остановка веб-сайтов и т. д.

  5. Запускать любое автоматическое тестирование (например, nUnit, Selenium и т. Д.) *

Я считаю, что лучшая стратегия состоит в том, чтобы иметь событие .Net после сборки, которое вызывает соответствующий сценарий powershell, передающий соответствующие детали, такие как путь к решению и имя конфигурации (в качестве альтернативы, я также использовал TeamCity для передачи имени среды в Powershell сценарий), чтобы он знал, что ему нужно сделать (например, постановка, производство и т. д.). Вы должны обнаружить, что язык сценариев, такой как Powershell, может делать все , что может делать человек (и примерно в 100 раз быстрее и на 100% надежнее).

На Powershell так много контента, что вы можете просто погуглить все, что вам нужно сделать в Powershell, и вы получите пример. Например. "powershell deploy WPF", "powershell upload FTP" и т. д ...

В предыдущей работе мне нужно было удаленно развертывать службы Windows, и я обнаружил, что, проведя достаточное количество исследований, я смог получить MSI для службы, чтобы удалить существующую службу и установить новую совершенно бесшумно (т.е. нет диалогов). Это очень поможет в ваших поисках автоматизации. Я могу уточнить это, если хотите.

Ниже приведен пример сценария пост-сборки Powershell, который я обычно использую:

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

param(
    [string]$configurationName="Debug",
    [string]$sourceDirectory="C:\SVN\<Your local solution location>")
Set-StrictMode -v latest
$ErrorActionPreference = "Stop"

# Load required functions
$private:scriptFolder = & { (Split-Path $MyInvocation.ScriptName -Parent) }
. (Join-Path $scriptFolder DebugBuild.ps1)
. (Join-Path $scriptFolder StagingBuild.ps1)
. (Join-Path $scriptFolder ProductionBuild.ps1)
. (Join-Path $scriptFolder CommonBuildFunctions.ps1)

#Execute appropriate build
switch ($configurationName) {
    "Debug" { RunDebugBuild $sourceDirectory }
    "Staging" { RunStagingBuild $sourceDirectory }
    "Production" { RunReleaseBuild $sourceDirectory }
}

Чтобы выполнить публикацию на машинах разработки, я настроил профиль публикации VS для решения, предназначенного для SVN, чтобы другие разработчики могли его использовать. Этот профиль публикуется непосредственно в локальном каталоге развертывания.

3 голосов
/ 18 января 2012

Мы используем TeamCity для наших развертываний в дополнение к CI, и это работает очень хорошо. Вот пара вещей, которые могут помочь:

  • Если вы используете VS2010, проверьте плагин SlowCheetah . Он может выполнять преобразования файла конфигурации, чтобы сделать то, что вам нужно, чтобы заменить строки подключения к БД и другие переменные, чувствительные к окружающей среде. Эти преобразования происходят автоматически при сборке на основе выбранной конфигурации сборки.
  • Проверить MSDeploy . Хотя он уделяет основное внимание развертыванию веб-приложений, он может выполнять множество других задач, таких как установка служб Windows и синхронизация файлов с целевым каталогом. Хотя большинство людей устанавливают его как надстройку IIS, его можно установить как отдельную службу, которая не зависит от IIS.

Если вы не используете VS2010 (или не хотите использовать SlowCheetah), вот как мы можем обработать настройки конфигурации:

  • Создание конфигурации приложения для каждой отдельной среды (я полагаю, вы иметь конфигурацию сборки, настроенную для каждой среды). Добавить Имя конфигурации до конца файла конфигурации, поэтому в Prod мы имеем App.config.Prod и QA у нас есть App.config.QA.
  • Поместите вашу полную конфигурацию для каждой среды в соответствующий файл конфигурации для эта среда.
  • Как часть вашей сборки (мы используем цель "BeforeBuild" в файле проекта), используйте msbuild для копирования специфичного для окружающей среды app.config поверх действующего. Вот пользовательская цель msbuild, которую мы используем для этого:

    <PropertyGroup>
        <EnvironmentAppConfig>App.config.$(Configuration)</EnvironmentAppConfig>
    </PropertyGroup>
    
    <Target Name="ReplaceAppConfig">
        <Message    Condition="Exists('$(ProjectDir)$(EnvironmentAppConfig)')" 
                    Text="Copying $(EnvironmentAppConfig) -> App.config" Importance="high" />
    
        <Message    Condition="!Exists('$(ProjectDir)$(EnvironmentAppConfig)')"
                    Text="No $(EnvironmentAppConfig) found. Leaving App.config as is." Importance="high" />
    
        <Copy   SourceFiles="$(ProjectDir)$(EnvironmentAppConfig)"
                DestinationFiles="$(ProjectDir)App.config"
                Condition="Exists('$(ProjectDir)$(EnvironmentAppConfig)')" />
    
    </Target>
    

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

1 голос
/ 17 июня 2016

Teamcity + Octopus развертывания

Автоматическое развертывание Octopus для Windows Service

0 голосов
/ 18 января 2012

Вы упомянули Коммерческий инструмент ...

TFS или, в частности, Team Build, полностью поддерживает сборку и развертывание кода. Всякий раз, когда мы создаем веб-приложение, оно автоматически развертывается на наших серверах Dev и QA. После развертывания он проходит набор веб-тестов, чтобы убедиться, что все работает. Тогда настоящее веселье начинается с нашей командой QA;)

Хотя мы не выполняем автоматическое развертывание в производство, мы, безусловно, можем это сделать.

0 голосов
/ 18 января 2012

Я неравнодушен к TeamCity, который является продуктом Jetbrains, компанией, которая делает основной ReSharper (нет, я не работаю на них, принесу удачу) TeamCity, по крайней мере в прошлый раз, когда я проверял, является бесплатным продуктом для 20 пользователей и 20 конфигураций сборки. У этого есть некоторые хорошие функции автоматического построения и обвинения. Отлично, правда.

0 голосов
/ 18 января 2012

Наша команда релизов использует Anthill Pro - у него также есть возможность делать CI, но они просто используют его для развертывания пакетов (в нашем случае в основном это код веб-сайта).Крутая вещь в Anthill - это полная настройка клиента (агента) -сервер, поэтому он с некоторой нагрузкой пересекает брандмауэры, NAT и т. Д.И у него есть рабочий процесс утверждения и планирования.

Что касается конфигов, то это другой зверь - к сожалению, и разработчики, и команда разработчиков должны изменить их и каким-то образом объединить результат.Учтите, что вы хотите добавить новый ключ конфигурации, но команда релиза должна добавить производственные настройки для соединения с БД.Хитрость в том, что разработчики не должны знать строку подключения к производственной БД.Так что это не автоматизировано (в нашем случае в любом случае).

...