Какой ваш любимый рабочий процесс развертывания веб-приложений с помощью SVN?
В настоящее время мы используем несколько сложную настройку развертывания, которая включает в себя удаленный сервер SVN, 3 ветки SVN для DEV, STAGE и PROD, продвижение кода между ними с помощью исправлений и т. Д. Интересно, что вы используете для развертывания в ситуации небольшой команды разработчиков ?
Ответов (11)11
ствол для разработки и филиал (производство) для производственного персонала.
На моем локальном компьютере у меня есть VirtualHost, который указывает на магистральную ветку, чтобы проверить мои изменения.
Любая фиксация в транке запускает ловушку фиксации, которая выполняет экспорт svn и синхронизируется с URL-адресом разработчика онлайн-сервера, поэтому, если сайт является stackoverflow.com, этот крючок автоматически обновляет dev.stackoverflow.com
Затем я использую svnmerge для слияния выбранных патчей из основной системы в производственную в моих локальных кассах. У меня снова есть VirtualHost на моем локальном компьютере, указывающий на производственную ветку.
Когда я фиксирую объединенные изменения в производственной ветке, снова ловушка экспорта SVN обновляет производственный (живой) экспорт, и сайт работает!
Простая магистральная ветка содержит самый последний код, а затем обрезает ветку, когда мы запускаем ее. Кажется, это работает довольно эффективно. Вы можете легко перейти к предыдущей ветке, если текущая ветка, которую вы вырезали для действующей системы, выйдет из строя. Кроме того, легко исправить ошибки в ветке, которая в настоящее время работает, и поскольку ветка фактически умирает, когда вы разрезаете новую, есть только одна реальная ветка, над которой вам нужно работать (а затем объединить исправления оттуда в живая ветка).
Когда я работал в небольшой команде разработчиков (небольшой имел в виду меня, другого программиста и начальника), это был настоящий хаос. Однако мы обнаружили, что назначение процесса «привратника» сработало для нас.
Привратник - это человек, который проделал большую часть работы над приложением (в данном случае у меня было 2 проекта, которые я разработал с нуля, а у него было около 4).
По сути, всякий раз, когда ему приходилось работать над моими проектами, он уведомлял меня, что выполняет работу, я проверял, что репозиторий обновлен и готов к сборке, затем он откладывал, вносил изменения, а затем фиксировал . Он сообщал мне, что это было сделано, я снимал, строил и развертывал. Если бы были изменения БД, у нас была бы папка «Изменения БД» со всеми скриптами, которые исправляли бы БД.
В нем явно много дыр, но этот процесс работал на нас и не позволял нам строить друг друга.
Три ветки звучат как дополнительная работа.
Различия в окружающей среде можно устранить, имея разные версии соответствующих файлов в магистрали. т.е. database.yml и database.yml.prod. Процесс развертывания должен быть экологически безопасным и просто копировать файлы среды вместо файлов по умолчанию.
Мы не используем ветки для размещения материалов, связанных с Интернетом; только для тестирования экспериментальных вещей, которые потребуют много времени (читай: больше суток), чтобы снова слиться в ствол. Ствол в стиле «непрерывной интеграции» представляет (надеюсь) рабочее текущее состояние.
Таким образом, большинство изменений фиксируются прямо в стволе. Сервер CruiseControl.NET будет автоматически обновляться на машине, на которой также запущены IIS и есть актуальные копии всех доступных дополнительных ресурсов сайта, поэтому сайт можно полностью и аккуратно протестировать внутри компании. После тестирования файлы загружаются на публичный сервер.
Я бы не сказал, что это идеальный подход, но он прост (и, следовательно, подходит для нашего относительно небольшого персонала), относительно безопасен и отлично работает.
Магистраль содержит текущую «первичную» кодовую базу разработки.
Разработчик часто создает отдельную ветвь для любого среднесрочного и долгосрочного проекта, которая может наполнить кодовую базу магистрали и помешать другим разработчикам. Когда он завершит, он снова сольется в багажник.
Мы создаем релиз с тегами каждый раз, когда запускаем код в продакшн. Папка в / tags - это просто номер версии.
Для развертывания в производственной среде мы выполняем SVN Export to Staging. Когда это удовлетворительно, мы используем простой rsync для развертывания в производственных кластерах.
Я работаю с ситуацией, аналогичной той, которая есть у вас сейчас. Мне было поручено найти «лучшее» решение, и в нем было что-то вроде следующего.
Живая ветвь представляет серверы в их текущем состоянии.
Любая разработка должна выполняться в ветке, взятой из live. Это может быть получасовая работа одного человека или годовой многопрофильный проект. В эти ветки разработки можно сколь угодно часто вносить изменения.
Перед тем, как часть работы будет запущена, изменения из живого снова объединяются и помечаются как потенциальный выпуск. Этот выпуск протестирован в тестовой среде, и, если он проходит тестирование, новая версия берется из тега.
Если это работает лучше, можно объединить несколько работ в один выпуск.
Это означает, что поддерживать ветки разработки в актуальном состоянии с помощью live довольно просто, и если часть работы в разработке упадет, потребуется минимальная уборка.
Чтобы перейти от работы над одним проектом к другому, разработчик может просто svn переключить свою локальную рабочую среду на другую ветку.
Одна из проблем, с которыми мы столкнулись с системой, которую вы описываете, заключается в том, что DEV может довольно быстро устареть с PROD, поэтому вы не ведете разработку в реальном времени, и до этапа нелегко обнаружить перекрестные зависимости. Вышеупомянутое решение решает эти проблемы, оставаясь при этом довольно легким.
У меня не было проблем с общими тегами / ветками / организацией ствола.
Общее непрерывное развитие происходит в стволе.
Сопровождение выпуска в производственной среде происходит в соответствующей ветке выпуска.
Изменения в ветке выпуска, которые все еще актуальны для магистрали, объединяются.
Когда новая версия готова к развертыванию, она помечается из ствола, затем из этого тега создается ветвь. Ветвь нового выпуска извлекается на сервер параллельно с текущим выпуском. Когда приходит время переключаться, пути меняются ("mv appdir appdir.old && mv appdir.new appdir").
Разработчики, поддерживающие производственную версию, затем svn переключают свою рабочую копию на новую ветку или производят новую проверку из нее.
Я настоятельно рекомендую книгу (в настоящее время в черновиках) « Непрерывная доставка» , в которой описывается полный процесс управления поставкой программного обеспечения, основанный, среди прочего, на принципах непрерывной интеграции.
Мне очень не нравится подход ветвления и слияния, поскольку он может стать очень беспорядочным и довольно расточительным, поскольку в конечном итоге вы тратите время на действия, которые на самом деле не приносят никакой новой ценности. Вы уже разработали, протестировали и исправили свой код один раз, зачем создавать ситуацию (копирование кода в другую ветку), которая требует от вас переделать эту работу?
В любом случае, способ избежать ветвления и слияния - создать свои развертываемые артефакты из ствола и продвигать созданные артефакты (а не источник), когда он проходит тестирование, постановку и т. Д. Таким образом вы на 100% уверены, что то, что вы запуск в производство - это то же самое, что вы тестировали.
Если у вас есть разные функции, которые, возможно, потребуется выпустить по разным графикам, изменение вашего подхода к реализации (сделать функциональность настраиваемой или, еще лучше, модульной) может помочь вам сохранить единый канал разработки.