Веб-разработка SVN
Я прочитал многие вопросы здесь, касающиеся SO, касающиеся этой проблемы, но я не могу найти хороший совет, который бы соответствовал нашей ситуации. Я унаследовал этот рабочий поток, и я стараюсь сделать его лучше.
Наша настройка
- База кода PHP (в частности, Kohana)
- Кодовые базовые полномочия ~ 60 сайтов, каждая из которых имеет уникальные шаблоны (например, 60 QA [Quality Assurance]).
- каждый сайт имеет A-записи для разных активов и ресурсов (т.е. 8 записей A для каждого домена)
- 3 разработчиков
- 3 дизайнера
- разработчики имеют VMware-образ производственного сервера для локального развития.
- дизайнеры не
- общий сервер физического развития, используемый для QA, пост-фиксированное обновление постоянно держит этот сервер в текущем HEAD соединительной линии
- производственный сервер, обновленный до сочетания и соответствия различных версий в зависимости от того, какие функции живут.
Наш рабочий поток
- Разработчики работают локально, пока данная функция не будет завершена, а затем передаст всю функцию в магистраль для внутреннего QA.
- Дизайнеры делают небольшие изменения только для CSS/изображений/шаблонов. Они непосредственно передают ствол, QA свои собственные изменения и обновляют соответствующие файлы на производственном сервере, вообще говоря, сразу после их QA.
- Когда функции готовы к работе в прямом эфире, производственный сервер вручную обновляется до нужных номеров версий для каждого файла, связанного с этой функцией. Иногда это просто, иногда это довольно волосатое (много вызовов
svn log
для поиска зависимостей выше по течению).
Наши проблемы
- С тремя разными разработчиками, работающими с различными функциями, которые нуждаются в различном количестве QA, мы регулярно сталкиваемся с проблемами зависимостей восходящей линии.
- В любой момент времени у нас нет способа программно определить, какие функции находятся на рабочем сервере, а какие нет.
svn status -u
покажет нам, какие файлы не обновлены, но это, как правило, не четкое изображение функций.
Что я знаю
- Некоторые из наших проблем можно было бы устранить, имея производственную ветвь. Мы могли бы, по крайней мере, контролировать, какие функции были добавлены в производство, и когда, хотя это не решит проблемы с обратной связью по потоку.
- Функциональные ветки - это опция, и мы пробовали это в прошлом. В связи с тем, что для нашего программного обеспечения требуется 60 доменов QA для каждой ветки, мы сталкиваемся с проблемами управления процессом. Например, создание 480 (60 доменов x 8 записей на домен) A-записи для каждой ветки признаков.
- Отрасль разработчика также является опцией, но время нашей функции QA меняется. Я не могу точно сказать, что предыдущая функция будет вне QA, прежде чем мне нужно будет что-то сделать.
Пример зависимостей в потоке
- Разработчик A добавляет новую функцию слайд-шоу как для администратора, так и для интерфейса.
- Разработчик B добавляет новую функцию обратной связи как в админе, так и в интерфейсе.
- Обе эти функции переплетаются с логикой модели местоположения/контроллера, поэтому для этих связанных с ними файлов внесены изменения для учета обеих новых функций.
- Функция слайд-шоу входит в QA, но поддерживается некоторой надзором за развитием или областью видимости.
- Функция обратной связи вводит QA и проходит без проблем.
- Мы хотим следить за временной шкалой и использовать функцию обратной связи для производства, но мы не можем сделать это напрямую, потому что обе функции требуют изменений в модели местоположения/контроллере. То есть мы не можем просто сделать
svn update file1 file2 file3
.
- Примечание.. Это простой пример, и его можно обойти, сделав некоторое обратное слияние. Зачастую наши проблемы сложны, чем это.
Информация о нескольких сайтах
- У нас есть несколько заранее определенных структурных тем, состоящих из представлений, изображений, файлов CSS, JS файлов и т.д.
- Каждому сайту назначается тема.
- Для целей брендинга и расширяемости каждый сайт может переопределять представление темы с помощью настраиваемого представления или включать дополнительные файлы CSS/JS для сайта.
Я уверен, что есть некоторые другие люди, которые боролись с подобными проблемами, и я надеюсь получить представление о вас умных людей в Интернете. Пожалуйста, не стесняйтесь задавать вопросы, если что-то, что я сказал, кажется ясным как грязь!
Ответы
Ответ 1
Ваш рабочий процесс может быть улучшен, вот список моих рекомендаций:
- Начать использование ветвей SVN и выпускать сборки/развертывания в регулярном цикле.
- Определите, как долго должен длиться цикл развертывания, оставляя время для QA. Так, например, если вы собираетесь выпускать сборку каждый месяц, у вас есть 3 недели разработки и 1 неделя QA. Завершить разработку для этой сборки через 3 недели, кроме исправлений ошибок.
- Определите схему нумерации для ваших сборников, которая позволяет комнате расти
- Используйте систему билетов (ActiveCollab, JIRA, Mantis... и т.д.) и применяйте правило, согласно которому любое обязательство должно быть связано с билетом. Выберите тот, где вы можете сделать свои коммиты автоматически отображаемыми в билете.
- Если вы начнете документировать свои требования перед началом разработки, не собирайте свои требования в системе билетов (ради бога)
- Выполнение этого поможет вам определить, какие функции находятся в данной сборке. Поэтому сделайте какие-то заметки о выпуске со списком номеров билетов или общее описание билетов для каждой сборки.
- Вставьте свои номера сборки в приложение, чтобы вы могли отслеживать развертывание в любой заданной системе.
- Начните работать с инструментами автоматического тестирования PHPUnit для модульных тестов и Selenium для функциональных тестов, чтобы ускорить QA и повысить качество/стабильность веб-приложения, уменьшив вероятность того, что повседневные изменения вносят новые ошибки.
- Хадсон и Финг могут быть спасателями для автоматизации ваших сборных версий и автоматизации тестирования.
Ответ 2
Хорошо, пару мыслей:
Для такого рабочего процесса вы бы лучше сделали с SCM с моделью потока, например Accurev или ClearCase. В потоковой модели работа перетекает из каждого потока разработчиков в потоки интеграции, затем в потоки QA, затем выдает потоки (или все, что работает лучше всего). Только работа, готовящаяся к продвижению на следующий этап, продвигается вверх, и интеграция может быть выполнена только с этими путями работы.
Как сказал deceze, вам нужно разбить вещи более модульно, но вам также необходимо объединить его с системой локализации, где специфические для клиента функции могут переопределять определенные части кода. Один из способов, который я сделал в PHP, - это внедрить обертку импорта файлов PHP, которая сначала ищет версию файла PHP для конкретного клиента, а если она не существует, загрузите общий вариант.
function importModule($module, $clientId){
if(is_file("${clientRootDir}/${clientId}/${module}.php")) {
import("${clientRootDir}/${clientId}/${module}.php");
} else {
import("${defaultRootDir}/${module}.php");
}
}
Используя эту технику, вы можете изящно переписать части того, как работает сайт именно для этого клиента, а человек, работающий над этой функциональностью для этого клиента, работает в совершенно другом файле, поэтому они не сталкиваются друг с другом.
Я не уверен, что вы уже делаете это, и то, что вы называете своей "моделью местоположения"
Наконец, с помощью этого множества различных "виртуальных веб-сайтов" для тестирования вам будет очень выгодно добавлять автоматическое модульное тестирование (a la PHPUnit) в сочетании с непрерывной интеграцией, чтобы автоматически запускать тесты, когда программное обеспечение работает до стадии интеграции.