Мы используем Phing для развертывания, аналогичного тому, что вы описали. Мы также используем инфраструктуру Symfony для наших проектов (что не так важно для этого, но Symfony поддерживает концепцию различных сред, поэтому это плюс).
Однако нам все еще нужно создать различные файлы конфигурации для базы данных, фронт-контроллеров и т. Д.
Таким образом, мы получили папку с build.properties, которая определяет конфигурацию для разных сред (и в нашем случае также для разных клиентов, которым мы отправляем наш продукт). Эта папка связана с файловой структурой с помощью svn externals (опять же не обязательно).
Затем файл Phing build.xml принимает файл свойств в качестве параметра в командной строке, получает из него значения и создает все необходимые файлы конфигурации, контроллеры и другие файлы, специфичные для среды.
Мы сохраняем конфигурацию в файлах шаблонов, а затем используем функцию копирования / фильтрации в Phing, чтобы заменить заполнители в шаблонах конкретными значениями.
Тогда вся задача настройки данной среды может быть такой простой:
phing configure-environment -DpropertyFile=./build_properties/build.properties.prod
В вашем файле сборки вы проверяете, определено ли свойство propertyFile
, которое определяет файл свойств, и загружаете файл, используя <property file="./build_properties/build.properties.prod" override="true" />
. Тогда вы просто делаете любую магию со значениями, которые вам нужны.
Вы по-прежнему можете использовать svn checkout / update и поместить все полученные файлы конфигурации в svn ignore (они будут сгенерированы с помощью phing). Мы фактически используем дополнительные шаги в Phing. Эти шаги в конце приводят к самораспаковывающемуся пакету установки оболочки Linux. Это производится автоматически в Дженкинс. Затем мы отправляем пакет нашим клиентам, или группа поддержки может получить пакет от Jenkins, и они могут выполнить все развертывание, просто выполнив его (мы по-прежнему предпочитаем развертывание вручную на производственных серверах), или Jenkins может развернуть его автоматически (например, для тестирования серверы).
Я буду рад написать больше информации, если это необходимо.