Вопрос или проблема
Я пытаюсь найти инструмент, который поможет нам развернуть наш сайт на ASP.NET/IIS7 на нескольких машинах.
У нас есть параллельное производственное окружение, куда мы сначала развертываем наше программное обеспечение после обычного QA. Это развертывание производится через предоставленный msi (msi не изменяет конфигурации). Предоставляется файл readme для развертывания, который содержит инструкции по обновлению конфигурации (если требуется). Когда мы уверены, что в новой версии нет проблем, мы копируем веб-сайт на несколько (сейчас около 5, но их количество может увеличиться) производственных серверов. Конфигурационные файлы не копируются полностью, а обновляются на основе измененных настроек и инструкций readme.
В настоящее время этот процесс копирования выполняется вручную. Я ищу инструмент, который может выполнять это копирование для нас, не изменяя никаких конфигурационных файлов, чтобы операторы могли сосредоточиться только на обновлении конфигурационных файлов.
Некоторые интересные аспекты проблемы
- Все файлы, представляющие интерес, находятся в корневой папке определенного веб-сайта. Она содержит несколько подкаталогов, конфигурационных файлов, dll, exe, javascript и другие файлы asp.net
- Файловая система на всех серверах доступна для чтения/записи с использованием файловых общих ресурсов
- Корневая папка веб-сайта не всегда находится по одному и тому же пути на всех серверах
- Простое копирование имеет проблему, что оно также перезаписывает конфигурационные файлы. Мы не смогли найти простой способ исключить конфигурационные файлы.
- Инструмент должен делать резервное копирование существующей корневой папки
- Было бы здорово, если бы инструмент также мог объединять web.config и подобные xml-конфиги — не уверен, возможно ли это вообще.
Как я представляю себе этот инструмент: он будет иметь конфигурационный файл, в котором будет список исключений (файлы, которые не нужно копировать) и другая конфигурация для указания всех целевых папок, куда должна быть скопирована задача.
Лучшая идея для этого — использовать скрипт PowerShell. С помощью скрипта PowerShell у вас будет полный контроль для развертывания сайта на нескольких машинах. Просто используйте Copy-Item и выберите все необходимые вам файлы. Это можно сделать, например, как пост-сборочный процесс.
Я ответил на подобный вопрос здесь. Вы можете рассмотреть Web Deploy, который является официальной системой Microsoft для развертывания на IIS и кажется соответствующей вашим требованиям.
Мы используем комбинацию Octopus и Jenkins для сборки и развертывания. Jenkins собирает код и сжимает его, сохраняя в Octopus. Octopus развертывает его на различные машины. Мы можем выбрать, на какие машины развертываться в зависимости от канала — для начала мы развертываем на одну машину, предназначенную для тестирования, и затем, если все работает, развертываем на другие 3 рабочие машины, используя тот же самый сжатый код, так что мы уверены, что он будет работать так же.
Потребуется некоторое время для настройки этой системы, но как только она будет готова, это окупится с лихвой. Вся система очень настраиваемая, и Octopus может выполнять трансформации web.config, так что разные машины могут иметь разные настройки, хотя код тот же самый.
Вы также можете рассмотреть альтернативу, которую мы используем для некоторых наших небольших сайтов — Kudu. Это система развертывания и базового управления для сайтов IIS, и в нашем случае мы подключили ее к контролю версий BitBucket (она может подключиться к другим местам, таким как GitHub или в любое место, откуда можно отправить веб-запрос при отправке кода), так что изменение кода в определенной ветке, например “production”, вызовет развертывание. Это BitBucket делает магию; URL для Kudu настраивается в BB, и отправка в любую ветку в репозитории вызывает “эта ветка обновлена” вызов для всех подключенных Kudu, и каждый Kudu знает имя ветки, за которой он должен следить. В вашем случае я предполагаю, что может быть ветка для тестирования, которая вызовет развертывание первого сайта и ветка для производства, которая вызовет развертывание остальных 5 сайтов. Развертывание, вызванное отправкой в ветку, просто и удобно для программистов.
В этой последней системе мы управляем различными конфигурациями на различных машинах с помощью переменных окружения;
- для наших .net core приложений мы в основном загружаем
"appsettings.json"
затем пытаемся загрузить"appsettings."+Environment.MachineName+".json"
– общие настройки идут в первом, а настройки специфичные для машины – во втором. Добавление новой конфигурации для новой машины сводится к копированию уже существующей и добавлению ее в репозиторий - для не core приложений мы используем более старую систему (которая может быть использована и для core), где пользовательский exe запускается как пост-сборочное событие, и он ищет файл под названием
"web."+Environment.MachineName+".config"
и копирует его поверх web.config. это простой (около 5 строк консольного приложения) способ избавиться от головной боли трансформаций — не все в команде любят их
Kudu используется на тысячах сайтов, многие (я бы сказал) в основном размещены в Azure – его создатель работает в Microsoft и Kudu является предпочтительной системой Azure для развертывания через CI. У него также есть удобные функции управления, такие как список запущенных процессов и эмулятор командной строки, чтобы вам не нужно было входить на сервер для настройки (потому что вы не можете войти в веб-сервис Azure).
.
Ответ или решение
Для успешного развертывания ASP.NET сайтов на нескольких серверах вам потребуется надежный инструмент или метод, способный упростить и автоматизировать процесс копирования файлов с минимальными вмешательствами в конфигурацию. Существуют несколько решений, которые могут удовлетворить вашим требованиям, учитывая предоставленный контекст. Рассмотрим ключевые из них.
1. PowerShell Script:
PowerShell предлагает широкие возможности для автоматизации процессов, и его использование может значительно облегчить процедуру развертывания. Скрипт PowerShell позволяет выбрать нужные файлы для копирования, избегая изменения конфигурационных файлов. Например, командлет Copy-Item
может использоваться для выборочного копирования:
$sourcePath = "C:\Path\To\Website\Root"
$destinationPaths = @("Server1Path", "Server2Path", "Server3Path")
$excludeFiles = @("web.config", "anotherConfig.config")
foreach ($destination in $destinationPaths) {
Copy-Item -Path $sourcePath\* -Destination $destination -Recurse -Exclude $excludeFiles
}
2. Web Deploy:
Web Deploy
— это официальный инструмент от Microsoft, предназначенный для развертывания на IIS. Он поддерживает такие функции, как синхронизация и преобразование конфигураций, что может быть полезно в вашем случае. Программа также поддерживает бэкап папок, что отвечает вашему требованию.
3. Octopus и Jenkins:
Сочетание Octopus и Jenkins предлагается как мощное решение для развертывания. Jenkins может осуществлять сборку и упаковку проекта, в то время как Octopus обеспечивает развертывание по различным серверам. Особенностью Octopus является возможность конфигурирования развертываний, поддержка трансформаций конфигураций, и удобство управления каналами развертывания.
4. Kudu:
Kudu особенно полезен для интеграции с системами управления версиями (такими как BitBucket и GitHub), что позволяет автоматизировать процесс развертывания через коммиты в определенные ветки. Kudu поддерживает управления через переменные среды, что будет полезно для ведения конфигураций на различных машинах.
Выбор подходящего инструмента или метода будет зависеть от специфики ваших требований, инфраструктуры и уровня автоматизации, который вы хотите достичь. PowerShell предоставляет максимальную гибкость, однако требует написания скриптов. Web Deploy, Octopus и Jenkins предлагают более структурированные и масштабируемые решения, но их начальная настройка может занять больше времени. Выбор остается за вами, исходя из возможностей вашей команды и бизнес-процессов.
С учетом всего вышесказанного, советую тщательно протестировать выбранное решение в вашем производственном окружении, чтобы убедиться в его надежности и удобстве.