
Динамические конфигурации AppEngine с использованием Gradle, часть 2
В предыдущем рассказе Динамические конфигурации AppEngine с использованием Gradle, часть 1 мы обсуждали, как мы можем легко выполнить развертывание в различных средах, таких как (prod, stag, test), с использованием простого аргумента gradle. Если вы не читали раньше, рекомендую прочитать, прежде чем продолжить.
Теперь давайте посмотрим, как мы можем иметь несколько файлов конфигурации (cron.xml, appengine-web.xml, queue.xml) для каждой из этих сред.
Дополнительные файлы конфигурации
Эти файлы конфигурации управляют дополнительными функциями, которые применяются ко всем службам в приложении:
dispatch.xml (routing)queue.xml (task processing)datastore-indexes.xml (querying)cron.xml (scheduling)
Чтобы иметь разные конфигурации для каждой среды, мы собираемся создать одну папку с именем gaeconfigs в корневой папке, а затем создать одну папку для каждой среды, как показано ниже:

Теперь добавьте эти файлы конфигурации для каждой среды, и это будет выглядеть примерно так:

Теперь вы можете редактировать или оптимизировать конфигурации в соответствии со средой, например
- для очередей скорость обработки составляет 10 / с для постановки, а для производства - 100 / с.
- Обработка данных Cron должен запускаться каждые 5 минут в производственной среде, но для постановки это может быть каждый час.
А как насчет общих конфигураций для всех сред?
Иногда определенные конфигурации не меняются для каждой среды, например datastore-indexes.xml, или у вас одинаковые настройки для всех сред, в таком случае поместите эти конфигурации непосредственно в папку gaeconfigs, мы будем обрабатывать их как хорошо. Нравиться,

Все готово, теперь нам нужно использовать эти конфигурации во время развертывания. Мы собираемся сделать это с помощью задачи gradle,
Давайте разберемся, что происходит. Во-первых, мы объявляем необходимый путь к каталогу:
def configDir = "${project.projectDir}/gaeconfigs"
def targetDir = "${buildDir}/exploded-" + project.name + "/WEB-INF"
def envName = getDeployConfig().mode //live or stag etc
configDir: указывает на папку gaeconfigs
envName: значение среды например live, stag или alpha
targetDir: указывает на appengine Каталог WEB-INF explodedWar, который будет иметь форму build/exploded-{your-project-name}/WEB-INF
Затем мы копируем общие конфигурации из папки gaeconfigs, например (datastore-indexes.xml, dos.xml), в каталог WEB-INF, и это игнорирует папки среды со следующим кодом :
from configDir include '*.xml' into targetDir
Затем, в зависимости от флага режима, который передается во время выполнения задачи, мы копируем конфигурации из каталога среды конкретного режима в каталог WEB-INF,
// copying env based configs from fileTree(configDir + "/" + envName) include '*.xml' into targetDir
Например, если установлен режим -Pmode=live, копируются файлы из gaeconfigs/live. Наконец, мы связываем эту задачу с задачей explodedWar, которая будет вызываться во время локального запуска или во время развертывания.
explodeWar.finalizedBy copyGaeConfig
Вот и все. Легко, правда? Теперь для развертывания просто выполните следующую команду, которая автоматически копирует необходимые конфигурации
gradle appengineDeploy -Pmode=live
Давайте посмотрим на еще один важный файл конфигурации, который мы еще не рассмотрели.
Appengine-web.xml
Это основной файл для указания информации о вашем приложении и определения того, какие файлы в WAR приложения являются статическими (например, изображениями), а какие - файлами ресурсов, используемыми приложением.
В отличие от других конфигураций, этот файл специфичен для отдельного модуля (службы). Давайте посмотрим на образец файла appengine-web.xml,
Здесь мы определили сервисные, статические файлы и конфигурации масштабирования. Проблема в том, что, если нам нужно изменить конфигурацию масштабирования в зависимости от среды, в которой мы находимся.
Для этого сначала изменим файл appengine-web.xml, как показано ниже:
Ничего не заметили? проверь это,
<instance-class>@INSTANCE_CLASS@</instance-class> @SCALING_CONFIG@
мы просто заменили статические значения на имена заполнителей @ INSTANCE_CLASS @ и @ SCALING_CONFIG @ который будет заменен во время развертывания с помощью следующей задачи,
Итак, в функции getGaeWebXmlConfig() на основе флага режима мы устанавливаем значения для INSTANCE_CLASS и SCALING_CONFIG , обратите внимание на масштабирование, мы добавили целую кучу настроек только для live и alpha, но для постановки используются значения по умолчанию (что также помогает снизить затраты на постановку).
И в задаче explodeWar мы читаем файл appengine-web.xml и заменяем свойства заполнителя на сгенерированный, и, наконец, он записывается в каталог сборки.
Примечание. Исходный
appengine-web.xmlфайл останется нетронутым
Это все. Теперь каждый раз, когда вы запускаете следующую команду
gradle appengineDeploy -Pmode=live
все конфигурации, основанные на среде, автоматически настраиваются и копируются в каталог сборки. Дополнительные сведения см. в демонстрационном приложении на GitHub
Заключение
Вот и все уловки для этой истории. Используя эти методы, вы также можете выполнять другие виды конфигурации и подготовки, такие как копирование настроек приложения, флагов, учетных данных и т. Д. И если вы посмотрите на это, мы просто значительно упростили развертывание.
Спасибо за прочтение! Удачного развертывания…
Вот еще одна полезная ссылка,
- Динамические конфигурации AppEngine с использованием Gradle, часть 1
- Автоопределение среды в Google AppEngine
- Многомодульные проекты с Google AppEngine и IntelliJ

Эта история опубликована в The Startup, крупнейшем предпринимательском издании Medium, за которым следят +393 714 человек.
Подпишитесь, чтобы получать наши главные новости здесь.
