Как вы обновляете живые веб-сайты с изменениями кода?

21

Я знаю, что это очень простой вопрос. Если бы кто-то мог меня развеселить и сказать, как они справятся с этим, я был бы очень рад.

Я решил опубликовать это, потому что я собираюсь установить SynchToy, чтобы устранить проблему ниже, и я чувствую себя немного непрофессионально, используя «Игрушку», но я не могу придумать лучшего способа.

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

  • ASP.NET веб-приложение, разработанное на моем компьютере на работе
  • Решение имеет 2 проекта:
    • Сайт (файлы)
    • WebsiteLib (C # / dll)
  • Использование Git-репозитория
  • Развернуто на веб-сервере GoGrid 2008R2

Развертывание:

  1. Внесите изменения в код.
  2. Нажмите, чтобы Git.
  3. Удаленный рабочий стол на сервер.
  4. Вытащить из Git.
  5. Перезапишите живые файлы, перетаскивая их с помощью проводника Windows.

На шаге 5 я удаляю все файлы из корня сайта .. это не очень хорошая вещь. Вот почему я собираюсь установить SynchToy ...

ОБНОВЛЕНИЕ: СПАСИБО за все полезные ответы. Я не могу выбрать, какой из них пометить ответ - между использованием веб-развертывания - похоже, у меня есть несколько полезных предложений:

  1. Веб-проект = весь сайт, упакованный в одну DLL - недостаток для меня, я не могу пускать простые обновления - будучи одиноким разработчиком в компании из 50, это иногда бывает проще.
  2. Вытягивание прямо из SCM в корень веб-сайта - я изначально не делал этого из страха, что мой скрытый каталог SCM может оказаться разоблаченным, но ответы здесь помогли мне преодолеть это (хотя мне все еще не нравится иметь один побольше беспокоиться о том, чтобы забыть, чтобы убедиться, что все еще верно со временем)
  3. Использование веб-фермы и систематическое развертывание на узлах - это идеальное решение для нулевого времени простоя, что на самом деле меня беспокоит, поскольку сайт является источником дохода для моей компании в реальном времени - мне может быть трудно убедить их удвоить стоимость серверов.

-> И наконец, повторное применение основного принципа, что для сайта необходимо выполнить развертывание одним щелчком ИЛИ ЛИБО ЧТО-ТО НЕПРАВИЛЬНО, вероятно, самая полезная вещь, которую я получил из ответов.

ОБНОВЛЕНИЕ 2: Я подумал, что вернусь к этому и обновлю свое реальное решение, которое существует уже много месяцев и работает отлично (для моего решения с одним веб-сервером).

Процесс, который я использую:

  1. Внести изменения в код
  2. Нажмите, чтобы Git
  3. Удаленный рабочий стол на сервер
  4. Вытащить из Git
  5. Запустите следующий пакетный скрипт:

    cd C: \ Users \ Администратор

    % systemroot% \ system32 \ inetsrv \ appcmd.exe остановка сайта "/site.name:Default Web Site"

    robocopy Documents \ code \ da \ 1 \ work \ Tree \ LendingTreeWebSite1 c: \ inetpub \ wwwroot / E / XF connectionsconfig Web.config

    % systemroot% \ system32 \ inetsrv \ appcmd.exe стартовый сайт "/site.name:Default Web Site"

Как вы можете видеть, это приводит к падению сайта, использует robocopy для интеллектуального копирования файлов, которые изменились, а затем восстанавливает сайт. Обычно он выполняется менее чем за 2 секунды. Поскольку максимальный трафик на этом сайте составляет около 2 запросов в секунду, пропущено 4 запроса на обновление сайта.

Так как я стал более опытным с Git, я обнаружил, что первые четыре шага, описанные выше как «ручной процесс», также приемлемы, хотя я уверен, что мог бы свернуть все это в один клик, если бы захотел.

Документация для AppCmd.exe находится здесь . Документация по Robocopy находится здесь .

Аарон Анодид
источник
6
Лучше подходит для отказа сервера.
Карл Билефельдт
Вы должны рассмотреть возможность использования SSHing на своем сервере, а не использовать удаленный рабочий стол, чтобы вы могли написать сценарий развертывания, если хотите.
Малфист
5
Я думаю, что этот вопрос хорошо, чтобы остаться здесь. Развертывание веб-сайта кажется мне скорее заботой разработчика, чем работой системного администратора, хотя я думаю, что это может варьироваться в зависимости от компании. Тем не менее, все ответы, насколько ориентированы на разработчиков.
Адам Лир
1
@Malfist - как именно один SSH в Windows-сервер?
Уайетт Барнетт
@Wyatt Запустив SSH-сервер на удаленной машине (почти), как на Linux-компьютере.
Адам Лир

Ответы:

3

Вы должны проверить веб-развертывание VS 2010. Если GoGrid поддерживает это, пакет веб-развертывания является хорошим решением.

http://weblogs.asp.net/scottgu/archive/2010/07/29/vs-2010-web-deployment.aspx

Nate
источник
когда вы используете веб-развертывание, вы теряете возможность исправления, нет? Я знаю, что есть много людей, которые не хотят делать что-то вне формального процесса, но мне нравится иметь возможность для чрезвычайных ситуаций ...
Аарон Анодид
Вы делаете, хорошая мысль. Я знаю, что в моей компании мы не хотим, чтобы люди это делали, потому что мы не можем отслеживать изменения. Для личных сайтов мне действительно очень нравится иметь такую ​​возможность.
Nate
3

У моего предыдущего работодателя для развертывания изменений кода мы установили балансировщик нагрузкипрекратить обслуживание одного веб-сервера. Истечение срока действия сеансов на первом веб-сервере может занять 20 минут. Мы обновили бы код на этом веб-сервере, разархивировав zip-файл развертывания, а затем проверили, что все работает нормально, нажав прямой IP-адрес для этого первого веб-сервера. Когда мы убедимся, что все работает нормально, тогда мы установим балансировщик нагрузки для запуска обновленного веб-сервера и дождемся окончания сеансов на другом сервере, а затем обновим его (и так далее, пока все они не будут обновлены). После того, как они все проверили, мы установили балансировщик нагрузки, чтобы вернуться к выполнению своей работы. Это усложнялось, когда к пиковым сезонным нагрузкам подключалось до 10 веб-серверов, подключенных к балансировщику нагрузки (поэтому их обновление по отдельности может занять несколько часов, поскольку мы не можем закрыть работающий веб-сайт - клиенты должны иметь возможность получить на сайт).

В ASP.NET, если вы удаляете какой-либо файл с именем App_Offline.htmв корневой каталог веб-сайта, этот веб-сайт выгружается, что позволит вам затем обновить DLLS (и все, что угодно). IIS откроет страницу под названием «Приложение не в сети». Когда файл будет удален, переименован или удален, веб-приложение будет перезапущено, и IIS будет обслуживать веб-страницы для этого веб-сайта. Это то, что Visual Studio делает, когда вы публикуете веб-сайт из VS.

Tangurena
источник
2

Обычно я храню все в хранилище SVN. Когда я закончу с некоторыми изменениями, я фиксирую на сайте разработчика, а затем проверяю производство. Все синхронизируется, это быстро и просто. Если проверка слишком сложна, вы можете настроить Apache с WebDAV, и он сделает это за вас.

Malfist
источник
Вы беспокоитесь о таких вещах, как каталог .svn, присутствующий на вашем живом сайте?
Аарон Анодид
Не совсем, apache обычно настроен так, чтобы запретить доступ к этим папкам.
Malfist
IIS по умолчанию также запрещает .svn (или .git или .hg).
Уайетт Барнетт
Если злоумышленник получит доступ к каталогу, он / она получит доступ ко всему коду в открытом состоянии.
Алексей
5
Если злонамеренный пользователь получает доступ к вашей файловой системе, вам есть о чем беспокоиться.
Малфист
2

Для каждого из моих веб-приложений у меня есть настройка репозитория git с тремя ветками. Live, Beta, Особенности. Live - это, конечно, живой сайт. Бета-версия сайта используется для исправления ошибок или для окончательного тестирования функций непосредственно перед внедрением. Затем, как вы сказали, я делаю простой git push, git pull on live, чтобы получить информацию. Функции используются для улучшений "следующей версии".

Ominus
источник
То же самое работает практически со всеми системами контроля версий.
Deadalnix
2

Вы пытаетесь решить проблему непрерывной доставки . Изначально вы начинаете с ручных шагов, но вскоре вы поймете проблемы. Это самые распространенные из них:

  1. Код работает на вашем ПК, не работает на производстве
  2. Новое изменение ломает старый код
  3. Инкрементные изменения будут усложнять развертывание, вы будете добавлять новые библиотеки, устанавливать патчи и т. Д.

Посмотрите на TeamCity (или любой подобный инструмент).

алексей
источник
2

Используйте сценарий автоматической сборки и развертывания

Лучший способ сделать это - использовать сценарий автоматической сборки и развертывания, такой как MsBuild или Nant.

Причина в том, что вы можете просто набрать 1 команду, чтобы развернуть сайт, а затем просто набрать 1 команду, чтобы откатить его. И если вы достаточно тщательны, это будет включать в себя миграцию схемы базы данных. (Migrator.Net)

Одна из главных причин не использовать SVN или GIT для развертывания заключается в том, что среда может меняться между производством и подготовкой. В вашем сценарии NANT он может создавать ваши файлы .config специально для среды, на которую вы нацелены. Это избавляет от необходимости забывать вводить настройки конфигурации в производство.

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

Джастин Шилд
источник
1

Во-первых, вы должны использовать веб-проект. Какие различия вы спрашиваете?

Веб-проект объединит все файлы класса C # (включая фрагмент кода) в одну DLL (что лучше для безопасности, и тот факт, что это один файл для перемещения)

Во-вторых, вы должны опубликовать приложение, а затем вы по-прежнему можете использовать удаленный рабочий стол, перетащить все файлы в папку публикации и просто перезаписать его (новые файлы заменят старые файлы).

Публикация поместит все необходимые файлы для приложения в одну папку.

Маффин Человек
источник
1

Мой нынешний работодатель использует марионетку . (Вот больше пакетов программного обеспечения, которые решают ту же проблему.)

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

У моего предыдущего работодателя были собственные сценарии для копирования данных из Subversion на серверы и повторного запуска.

В нескольких местах, которые я видел ранее, создавались файлы для управления развертыванием. Обычно они использовали такую ​​стратегию, как вырубка половины веб-серверов из балансировщика нагрузки, ожидание, остановка этой половины, выкатывание кода, перезапуск их, затем перестановка балансировщика нагрузки, ожидание, остановка другой половины, перезапуск их и возврат балансировщика нагрузки обратно. вверх.

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

btilly
источник
1

Обычно для решения этой проблемы на наших веб-сайтах используется инструмент, входящий в состав Internals Systems, который называется junction.

Используя этот инструмент, мы можем создавать ссылки из одного каталога в другой. Корень приложения на сервере содержит 3 папки. Красный, Синий, Текущий. IIS настроен так, чтобы всегда просматривать Current для своих файлов.

Вы можете выполнить команду junction current, которая скажет вам, на какую папку в данный момент указывает текущая папка. Скажем, например, что он в настоящее время указывает на синий. Что бы мы сделали, это поставили в очередь файлы в красном для нового развертывания и убедились, что вся конфигурация была готова к работе.

Как только мы будем готовы, мы можем выполнить команду, junction current redчтобы она снова указала.

Есть две вещи, которые делают это решение таким замечательным

1) У вас есть все время в мире, чтобы поставить в очередь свои изменения в папке. Нет спешки, и единственное время простоя - это когда пул приложений набирает обороты. (Есть способ предварительно скомпилировать этот шаг.)

2) Если с вашим развертыванием что-то пошло не так, все, что вам нужно сделать, чтобы откатиться, - это выполнить команду вместо попытки отменить изменения. Команда в нашем случае будетjunction current blue

Надеемся, наш способ ведения дел может пролить свет на новое решение для вас.

Майк
источник
0

Что я сделал, и я не уверен, есть ли у вас возможности для этого, но здесь идет. Разработчик проверяет код в ветви QA, который затем загружается в среду QA системным инженером; после прохождения QA он будет переведен в производственную ветку. По крайней мере 2 из каждого сайта, подключенного к серверу, имеют коэффициент балансировки нагрузки, и в этом случае один из двух серверов будет переведен в автономный режим, если будет остановлен сайт будет заархивирован, а новый сайт будет развернут вместе с Любые необходимые изменения в iis После этого iis будет перезапущен, и вы перейдете на следующий сервер. В нашем случае все это было написано с использованием C #, но в прошлом это делалось с использованием скрипта vb. Надеюсь, это поможет. ура

Alos
источник