Intereting Posts
Перенести подпапки SVN в Git Есть ли хороший клиент php git с поддержкой HTTP? Насколько опасно совершать код с помощью текстовых паролей в общедоступной / незащищенной сети? Как правильно обрабатывать пароли в коде? Несколько подпозиций в одном репозитории github Любая опасность при связывании каталога `.git` для сборки? Gradle – импортировать репозиторий GitHub и сделать его зависимым от подпроекта? svn: это «trunk» просто каталог? NodeGit: переместить указатель перехода на другую фиксацию без проверки С svn Как добавить сообщение журнала в соединительную линию при создании тега? "TestNG ERROR Не удается найти класс в классеpath: filename" ошибка отображается при попытке запустить testng.xml из командной строки для проекта maven Использование git для выполнения рискованных изменений git разрешение предыдущих конфликтов слияния Проверка подлинности SVN в Active Directory с использованием SASL и OpenLDAP Git Как зафиксировать после закрытия редактора? Visual Studio: изменение пути по умолчанию для репозиториев для плагина GIT

Какое лучшее решение для работы с мультиплатформенной (dev / integ / valid / prod …) разработкой? Процесс доставки

Я не настолько опытен, но я работал над некоторыми крупными проектами Java EE (используя maven2) с очень четкими способами обработки установки / доставки на разных платформах.

1) Один из них состоял в том, чтобы использовать моментальные снимки для разработки, а затем сделать выпуск maven, компонентов и основных веб-приложений. Таким образом, доставка:

  • файлы войны / ушей
  • Элемент списка
  • файлы свойств
  • Файлы sgdb
  • некоторые другие

И команды будут использовать эти файлы для размещения новых версий приложений на разных платформах. Я считаю, что этот процесс является строгим и позволяет вам всегда легко сохранять различные конфигурации, переданные в производстве, но это не очень гибко, процесс немного тяжелый, и он вел нас иногда, чтобы иногда делать какие-то грязные вещи, такие как переориентация класса войны на исправление регрессии … Это веб-сайт электронной коммерции с 10 миллионами уникальных посетителей в месяц и доступностью 99,89%.

2) Еще один, который я видел, – проверить источники на каждой платформе, а затем установить артефакты моментальных снимков в локальном репозитории. Затем сервер приложений будет использовать эти снимки в папке .m2. С момента создания новой версии нет реального процесса доставки, нам просто нужно обновить источники компонентов / webapps, выполнить некоторую чистую установку maven и перезапустить сервер приложений. Я думаю, что это более гибко, но я вижу некоторые недостатки, и этот подход кажется мне опасным. На этом веб-сайте есть фаворит, я не знаю цифры, но это намного меньше, чем первый. У этого также есть большой backoffice, доступный для большинства сотрудников 130 000 человек компании.

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

Я не здесь, чтобы спросить, какое решение лучше, но интересно, видели ли вы разные вещи и какую стратегию вы использовали бы в этом случае?

Не имея дело с веб-сайтами, мне пришлось участвовать в процессе управления выпуском для различных крупных (Java) проектов в гетерогенной среде:

  • разработка на «ПК», что означает в нашем случае Windows – к сожалению, все еще Windows Xp – (и модульное тестирование)
  • непрерывная интеграция и тестирование системы на Linux (потому что они дешевле в настройке)
  • предварительная подготовка и производство на Solaris (например, Sun Fire)

Общим методом я видел:

  • бинарная зависимость (каждый проект использует двоичные файлы, созданные другим проектом, а не их источники)
  • нет перекомпиляции для тестирования интеграции (банки, созданные на ПК, непосредственно используются на фермах linux)
  • полная перекомпиляция на предварительном производстве (что означает двоичный файл, хранящийся на Maven repo), по крайней мере, чтобы убедиться, что все перекомпилировано с тем же JDK и опциями продажи.
  • VCS (система управления версиями, например SVN, Perforce, Git, Mercurial, …) в производственной системе: все развертывается из pre-prod через rsynch.

Таким образом, различные параметры для учета процесса управления выпуском:

  • Когда вы разрабатываете свой проект, вы напрямую зависите от источников или двоичных файлов других проектов?
  • где вы сохраняете свои значения настроек?
    Вы их параметризируете и, если да, когда вы заменяете переменные на их конечные значения (только при запуске или во время выполнения?)
  • перекомпилируете ли вы все в финальной (предпроизводственной) системе?
  • Как вы получаете доступ / копирование / развертывание в своей производственной системе?
  • Как остановить / перезапустить / исправить свои приложения?

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

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

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

  • Внесите любую конфигурацию, чтобы тот же встроенный артефакт мог работать во всех ваших средах. Затем создавайте артефакты только один раз для каждой версии. Восстановление в разных средах требует много времени и рискованности, например, это не то же приложение, которое вы тестировали
  • Централизовать место, где будут построены артефакты. – например, все войны для производства должны быть упакованы на сервере CI (использование плагина релиза maven на hudson хорошо работает для нас).
  • Все изменения для выпуска должны быть прослеживаемыми (контроль версий, таблица аудита и т. Д.), Чтобы обеспечить стабильность и обеспечить быстрый откат и диагностику. Это не должно означать тяжеловесный процесс – см. Следующий пункт
  • Автоматизировать все, строить, тестировать, выпускать и откатывать. Если процесс является надежным, автоматизированным и быстрым, тот же процесс можно использовать для всего: от быстрых исправлений до аварийных изменений. Мы используем тот же процесс для быстрого 5-минутного аварийного исправления и для основного выпуска, потому что он автоматизирован и быстр.

Некоторые дополнительные указатели:

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

http://wiki.hudson-ci.org/display/HUDSON/M2+Release+Plugin Если вы используете этот плагин и убедитесь, что только сервер CI имеет правильные учетные данные для выполнения выпусков maven, вы можете гарантировать, что все выпуски выполняются последовательно.

http://decodify.blogspot.com/2010/10/how-to-build-one-click-deployment-job.html Простой способ развертывания ваших выпусков. Хотя для больших сайтов вам, вероятно, потребуется что-то более сложное, чтобы не было простоев – например, развертывание до половины кластера за раз и флип-flopping веб-трафик между двумя половинами – http://martinfowler.com/bliki/BlueGreenDeployment.html

http://continuousdelivery.com/ Хороший сайт и книга с очень хорошими шаблонами для выпуска.

Надеюсь это поможет. Удачи.

Чтобы добавить к моему предыдущему ответу, с чем вы сталкиваетесь, в основном проблема CM-RM:

  • CM (Управление изменениями)
  • RM (Управление выпуском)

Другими словами, после первого выпуска (т. Е. Основная начальная разработка завершена), вам нужно продолжать выпуск, и именно CM-RM должен управлять.

Реализация RM может быть 1) или 2) в вашем вопросе, но я хотел бы добавить к этому механизму:

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

Не претендуя на то, что это лучшее решение, так моя команда в настоящее время занимается организацией и развертыванием.

  • Разработчики изначально разрабатываются на своей локальной машине, ОС свободно выбирать, но мы настоятельно рекомендуем использовать тот же JVM, который будет использоваться в производстве.
  • У нас есть сервер DEV, где часто выкладываются моментальные копии кода. Это просто scp из бинарной сборки, созданной из среды IDE. Мы планируем строить непосредственно на сервере, хотя.
  • Сервер DEV используется для того, чтобы заинтересованные стороны постоянно заглядывали вместе с разработкой. По самой своей природе он неустойчив. Это хорошо известно всем пользователям этого сервера.
  • Если код достаточно хорош, он разветвлен и помещен на сервер BETA . Опять же, это scp двоичной сборки из среды IDE.
  • Тестирование и общий QA происходит на этом сервере BETA .
  • Среднее время, если какие-либо изменения в чрезвычайной ситуации должны быть необходимы для программного обеспечения, находящегося в производстве, у нас есть третий промежуточный сервер, называемый сервером UPDATE .
  • Сервер UPDATE изначально используется только для установки очень небольших исправлений. Здесь также мы используем scp для копирования двоичных файлов.
  • После завершения тестирования в UPDATE мы скопируем сборку с UPDATE на LIVE . Ничто никогда не выходит на прямые серверы напрямую, оно всегда идет через сервер обновлений.
  • Когда все тестирование завершено в BETA , тестируемая сборка копируется с бета-сервера на сервер UPDATE и выполняется последний раунд проверки работоспособности. Поскольку это точная сборка, которая была протестирована на бета-сервере, очень маловероятно, что на этом этапе обнаружены проблемы, но мы поддерживаем правило, согласно которому все развертывание на реальном сервере должно проходить через сервер обновлений и что все в обновлении сервер должен быть протестирован перед его переносом.

Эта скользящая стратегия позволяет нам разрабатывать для трех версий параллельно. Версия N, которая в настоящее время находится в стадии производства и поставлена ​​через сервер обновлений, версия N + 1, которая станет следующей крупной версией, которая должна быть выпущена и поставлена ​​на бета-сервере, а версия N + 2 – следующий следующий основной выпуск для которого разработка в настоящее время ведется и выполняется на dev-сервере.

Некоторые из решений, которые мы сделали:

  • Полное приложение (EAR) обычно зависит от артефактов из других проектов. Мы решили включить двоичные файлы этих других проектов вместо того, чтобы строить все это из источника. Это упрощает построение и дает большую уверенность в том, что тестируемое приложение поставляется с правильными версиями всех его зависимостей. Стоимость заключается в том, что исправление в такой зависимости должно быть распределено вручную для всех приложений, которые зависят от него.
  • Конфигурация для каждой стадии встроена в EAR. В настоящее время мы используем соглашение об именах, и скрипт копирует правильную версию каждого файла конфигурации в нужное место. В настоящее время рассматривается параметризация пути для каждого файла конфигурации, например, с помощью одного заполнителя {stage} в корневом файле конфигурации. Причина, по которой мы храним конфигурацию в EAR, заключается в том, что разработчики – это те, кто вводит и зависит от конфигурации, поэтому они должны быть ответственными за ее поддержку (добавление новых записей, удаление неиспользуемых, настройка существующих и т. Д.).
  • Мы используем стратегию DevOps для команды развертывания. Он состоит из человека, который является исключительно разработчиком, двух человек, которые являются как разработчиками, так и операциями, и двумя лицами, которые являются чисто операциями.

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

Параллельно со стадией у нас есть сервер сервера непрерывной сборки, выполняющий сборку сценариев (ANT) после каждой регистрации (максимум один раз в 5 минут) и запускает модульные тесты и некоторые другие тесты целостности.

По-прежнему трудно сказать, является ли это лучшим в своем классе подходом, и мы постоянно пытаемся улучшить наш процесс.

Я большой сторонник единого развертывания, содержащего все (Code, Config, DB Delta, …) для всех сред , построенных и выпущенных централизованно на сервере CI.

Основная идея заключается в том , что Code, Config & DB Delta тесно связаны друг с другом. Код зависит от определенных свойств, заданных в конфигурации, и некоторых объектов (таблиц, представлений, …), присутствующих в БД. Итак, зачем раскладывать это и тратить свое время на отслеживание всего, чтобы убедиться, что он подходит друг к другу, когда вы можете просто отправить его вместе в первую очередь.

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

Более подробно о моих разговорах о непрерывной доставке в Parleys: http://parleys.com/#id=2443&st=5