Конфигурация CMS Deployer
CMS Deployer - это агент развертывания (deployment agent) DC CMS.
Администрирование
Запуск/остановка CMS Deployer
Если DC CMS установлено на сервере, запуск и остановка CMS Deployer - достаточно простой процесс. Просто перейдите в {env-directory}
из командной строки (в папку delivery- или authoring-окружения). Внутри папки bin
выполните команду ./cms.sh start_deployer
, чтобы начать работу CMS Deployer, или ./cms.sh stop_deployer
, чтобы завершить его операцию.
Конфигурация
Глобальная конфигурация
CMS Deployer включает в себя два основных конфигурационных файла, расположенных в {env-directory}/bin/cms-deployer/config
:
-
application.yaml
: этот файл включает в себя глобальные настройки приложения, такие как порт сервера и пути к другим конфигурационным файлам. -
base-target.yaml
: этот файл содержит общие свойства, применимые ко всем целям (targets). В нем содержатся конфигурации для задач, таких как индексация с использованием CMS Search и настройка уведомлений по электронной почте о развертывании.
Загрузка файла application.yaml
автоматизирована Spring Boot. Его свойства можно изменять, переопределяя их в стандартных внешних местах, определенных Spring Boot:
application.yaml
в папкеconfig
в текущей директорииapplication.yaml
в текущей директорииapplication.yaml
в директорииconfig
в classpathapplication.yaml
в корне classpath
Кроме того, у вас есть возможность переопределить свойства application.yaml
, указав их как системные свойства, например, -Dserver.port=7171
.
Ниже расположен образец файла application.yaml
:
deployer:
main:
config:
environment:
active: ${CMS_ENVIRONMENT}
targets:
config:
folderPath: ${targets.dir}
deployments:
folderPath: ${deployments.dir}
output:
folderPath: ${logs.dir}
processedCommits:
folderPath: ${processedCommits.dir}
logging:
folderPath: ${logs.dir}
management:
# Deployer management authorization token
authorizationToken: ${DEPLOYER_MANAGEMENT_TOKEN}
security:
encryption:
# The key used for encryption of configuration properties
key: ${CMS_ENCRYPTION_KEY}
# The salt used for encryption of configuration properties
salt: ${CMS_ENCRYPTION_SALT}
ssh:
# The path of the folder used for the SSH configuration
config: ${CMS_SSH_CONFIG}
Обработка файла base-target.yaml
немного отличается. Каждый раз, когда добавляется новая цель (target), CMS Deployer загружает этот файл и объединяет его с конкретными свойствами цели, придавая приоритет свойствам цели. Местоположение по умолчанию для переопределения этого файла конфигурации - ./config/base-target.yaml
, но его можно изменить, используя свойство deployer.main.targets.config.baseYaml.overrideLocation
в файле application.yaml
.
Ниже расположен образец файла base-target.yaml
:
target:
localRepoPath: ${deployer.main.deployments.folderPath}/${target.siteName}
engineUrl: ${env:ENGINE_URL}
engineManagementToken: ${env:ENGINE_MANAGEMENT_TOKEN}
studioUrl: ${env:STUDIO_URL}
studioManagementToken: ${env:STUDIO_MANAGEMENT_TOKEN}
translation:
# Indicates if the translation features should be enabled for the target
enable: false
search:
elasticSearch:
# Single Cluster
urls:
- ${env:SEARCH_URL}
username: ${env:SEARCH_USERNAME}
password: ${env:SEARCH_PASSWORD}
timeout:
# The connection timeout in milliseconds, if set to -1 the default will be used
connect: -1
# The socket timeout in milliseconds, if set to -1 the default will be used
socket: -1
# The number of threads to use, if set to -1 the default will be used
threads: -1
# Indicates if keep alive should be enabled for sockets used by the search client, defaults to false
keepAlive: false
# Multiple Clusters
# readCluster:
# urls:
# username:
# password:
# writeClusters:
# - urls:
# username:
# password:
# - urls:
# username:
# password:
# Settings used for all indices
indexSettings:
- key: "index.mapping.total_fields.limit"
value : 3000
- key: "index.mapping.depth.limit"
value: 40
notifications:
mail:
server:
host: ${env:MAIL_HOST}
port: ${env:MAIL_PORT}
где:
- переменные
engineURL
иengineManagementToken
используются для вызова API CMS Engine, и их значения задаются в переменных окружения - переменные
studioURL
иstudioManagementToken
необходимы для вызова API CMS Studio, и их значения задаются в переменных окружения
Настройка цели (target)
Каждая цель развертывания (deployment target) имеет свой файл конфигурации в формате YAML, который содержит сведения о свойствах данной цели и всей цепочке развертывания. В случае отсутствия этого файла CMS Deployer не будет знать о существовании данной цели. Обычно эти файлы конфигурации расположены в ./config/targets
. Для установок DC CMS на сервере они могут быть найдены в CMS_HOME/data/deployer/targets
.
Конфигурации целей имеют значительные различия в зависимости от окружения (delivery или authoring). Authoring-цель работает с локальным репозиторием, в то время как delivery-цель извлекает файлы из удаленного репозитория. Однако конфигурации целей в одном и том же окружении остаются относительно постоянными. Следующие два примера можно взять за основу для большинства целевых конфигурационных файлов для authoring или delivery:
- пример конфигурации authoring-цели
target:
# Environment name
env: preview
# Site name
siteName: editorial
# CMS Engine base URL
engineUrl: http://localhost:8080
# Path to the sandbox repository of the site
localRepoPath: /opt/cms/authoring/data/repos/sites/editorial/sandbox
deployment:
scheduling:
# Scheduling is disabled since Studio will call deploy on file save
enabled: false
pipeline:
# Calculates the Git differences with the latest commit processed
- processorName: gitDiffProcessor
# Performs CMS Search indexing
- processorName: searchIndexingProcessor
# Calls Rebuild Context when a file under /scripts is changed
- processorName: httpMethodCallProcessor
includeFiles: ["^/?scripts/.*$"]
method: GET
url: ${target.engineUrl}/api/1/site/context/rebuild.json?cmsSite=${target.siteName}
# Calls Clear Cache
- processorName: httpMethodCallProcessor
method: GET
url: ${target.engineUrl}/api/1/site/cache/clear.json?cmsSite=${target.siteName}
# Generates a deployment output file
- processorName: fileOutputProcessor
- пример конфигурации delivery-цели
target:
# Environment name
env: dev
# Site name
siteName: editorial
# CMS Engine base URL
engineUrl: http://localhost:9080
deployment:
pipeline:
# Pulls the remote Git repository of the site
- processorName: gitPullProcessor
remoteRepo:
# URL of the remote repo
url: /opt/cms/authoring/data/repos/sites/editorial/published
# Live of the repo to pull
branch: live
# Calculates the Git differences with the latest commit processed
- processorName: gitDiffProcessor
# Performs CMS Search indexing
- processorName: searchIndexingProcessor
# Calls Rebuild Context when a file under /scripts is changed
- processorName: httpMethodCallProcessor
includeFiles: ["^/?scripts/.*$"]
method: GET
url: ${target.engineUrl}/api/1/site/context/rebuild.json?cmsSite=${target.siteName}
# Calls Clear Cache
- processorName: httpMethodCallProcessor
method: GET
url: ${target.engineUrl}/api/1/site/cache/clear.json?cmsSite=${target.siteName}
# Generates a deployment output file
- processorName: fileOutputProcessor
Из примеров выше видно, что большая часть конфигурации относится к разделу pipeline-а развертывания. Каждая запись в списке YAML представляет собой экземпляр прототипа bean-а DeploymentProcessor
в Spring, который предопределен в файле base-context.xml
. Если вы хотите определить собственный набор bean-ов DeploymentProcessor
, вы можете включить их в новый файл контекста Spring на основе имени YAML-файла цели. На основе примера, упомянутого ранее, где YAML-файл назван editorial-preview.yaml
, соответствующий файл контекста Spring будет называться editorial-preview-context.xml
.
По умолчанию в CMS Deployer включены следующие bean-процессоры (bean processors):
-
gitPullProcessor
: клонирует удаленный репозиторий в локальный путь. Если репозиторий уже был клонирован, выполняется Git pull. Он особенно полезен для delivery-целей, которым необходимо извлекать изменения из сервера authoring-контента во время развертывания. Он должен быть первым процессором в списке, так как последующие процессоры работают с локальным репозиторием. -
gitDiffProcessor
: вычисляет разницу между последним коммитом в локальном репозитории и последним обработанным коммитом, обычно сохраненным в./processed-commits
(в папкеCMS_HOME/data/deployer/processed-commits
). Вычисленная разница затем используется для построения набора изменений для развертывания. Следовательно, этот процессор должен быть вторым в списке. -
searchIndexingProcessor
: извлекает файлы из набора изменений и передает их в CMS Search для индексации. Он выполняет обработку XML перед отправкой файлов, включая такие задачи, как выравнивание (рекурсивное включение компонентов), объединение унаследованных XML и извлечение метаданных для структурированных документов, таких как PDF и Word Docs. -
httpMethodCallProcessor
: выполняет вызов HTTP-метода по указанному URL-адресу. -
fileOutputProcessor
: генерирует вывод развертывания и сохраняет его в CSV-файле. -
mailNotificationProcessor
: Этот процессор отправляет уведомление по электронной почте в случае успешного развертывания с изменениями файлов или в случае сбоя развертывания.
Управление целью (target)
Создание цели (target)
Есть два метода создания конфигурационного файла цели:
- Использование конечной точки API createTarget, которая генерирует новую цель с использованием предопределенного шаблона. По умолчанию CMS Deployer включает два встроенных шаблона: один для локальных репозиториев (подходит для authoring-окружения), а другой для удаленных репозиториев (подходит для delivery-окружения). Кроме того, у вас есть возможность определить свои собственные шаблоны, расположенные в
./config/templates/targets
. Та же конечная точка API может использоваться для создания целей на основе этих пользовательских шаблонов. - Размещение файла конфигурации цели в формате YAML в папке
./config/targets
илиCMS_HOME/data/deployer/targets
, как уже упоминалось выше. CMS Deployer автоматически загрузит файл в соответствии с расписанием, и он будет обновляться при каждом изменении.
Обновление цели (target)
Обновление цели напоминает процесс её создания:
- Используйте тот же API-эндпоинт, что и в процессе создания, но установите параметру
replace
значениеtrue
. - Внесите изменения напрямую в файл конфигурации цели. При следующем запланированном сканировании целей CMS Deployer обнаружит изменения файла и автоматически перезагрузит его.
Удаление цели (target)
Существует два способа удаления цели:
- Вызовите эндпоинт API deleteTarget.
- Удалите файл конфигурации цели в файловой системе.
Запуск развертывания
CMS Deployer обеспечивает возможность выполнения запланированных развертываний для указанной цели через опцию deployment.scheduling.enabled
, которая по умолчанию включена. Однако, если вы хотите инициировать развертывание вручную, вы можете просто вызвать эндпоинт API deployTarget (или deployAllTargets). Это действие запустит развертывание, при условии, что запрос сформулирован правильно. Для отслеживания хода выполнения как запланированного, так и вручную запущенного развертывания обратитесь к логам CMS Deployer. По завершении развертывания, если цель включает fileOutputProcessor
в pipeline-е развертывания, будет создан и сохранен CSV-файл, содержащий окончательный результат конкретного развертывания, по пути ./logs
(или CMS_HOME/logs/deployer
).
Обработанные коммиты
CMS Deployer сохраняет запись о идентификаторе последнего коммита, обработанного во время предыдущего развертывания, для каждой цели (target). Во время развертывания он использует этот идентификатор коммита для получения списка измененных файлов в репозитории. По умолчанию обработанные коммиты сохраняются в папке (CMS_HOME/data/deployer/processed-commits
) с отдельными файлами для каждой цели (например, editorial-preview.commit
). Каждый файл содержит только идентификатор коммита для отслеживания изменений во время развертывания. Например: 0be0d2e52283c17b834901e9cda6332d06fb05b6
.
Если репозиторий изменяется вручную с помощью команд Git вместо обновления файлов через CMS Studio, существует потенциальная возможность конфликтов во время развертывания, например, если определенный коммит удален из репозитория. В большинстве случаев CMS Deployer спроектирован для обнаружения и автоматического разрешения таких конфликтов. Однако, если развертывание не удается успешно завершиться, можно использовать шаги устранения неполадок, описанные в разделе "Устранение неполадок с CMS Deployer".
Изменение или удаление файла обработанного коммита следует осуществлять осторожно, так как это может привести к переиндексации неизмененных файлов.
Процессоры CMS Deployer
CMS Deployer обладает обширным набором процессоров развертывания, которые могут быть легко интегрированы в любую цель (target) для удовлетворения конкретных потребностей. Несколько примеров сценариев, которые можно обработать с использованием этих процессоров развертывания:
- Передача контента, созданного или измененного в CMS Studio, во внешний сервис.
- Получение контента, созданного или отредактированного из внешнего сервиса.
- Выполнение действий после каждого успешного или неудачного развертывания.
При внедрении процессоров или настройке последовательности развертывания для цели порядок выполнения определяется конфигурационным файлом. Кроме того, определенные процессоры требуют определенных позиций в pipeline-е развертывания.
Основные процессоры развертывания
Основные процессоры развертывания способны выполнять различные задачи, связанные с выявлением измененных файлов или обработкой файлов, выявленных другими процессорами как измененные. Для обработки измененных файлов процессор может взаимодействовать с любым необходимым внешним сервисом по мере необходимости.
Все процессоры развертывания поддерживают следующие свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
processorLabel |
Необязательно | None | Лейбл, что другие процессоры могут перейти к данному |
jumpTo |
Необязательно | None | Лейбл процессора, к которому нужно перейти, после успешного выполнения |
includeFiles |
Необязательно | None | Список регулярных выражений для проверки файлов, которые следует включить |
excludeFiles |
Необязательно | None | Список регулярных выражений для проверки файлов, которые следует исключить |
alwaysRun |
Необязательно | false | Указывает, следует ли запускать процессор даже в случае отсутствия изменений в текущем развертывании |
failDeploymentOnFailure |
Необязательно | false | Включает возможность прерывания развертывания в случае сбоя процессора |
Процессор Git Pull
Процессор, осуществляющий копирование или извлечение удаленного репозитория Git в локальный путь файловой системы.
Должен быть первым процессором в pipeline-е.
Свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
remoteRepo.url |
Обязательно | URL-адрес удаленного Git репозитория для извлечения | |
remoteRepo.name |
Необязательно | origin |
Имя, которое будет использоваться для удаленного репозитория при извлечении из него |
remoteRepo.branch |
Необязательно | Ветвь по умолчанию в репозитории | Ветвь удаленного Git-репозитория для извлечения |
remoteRepo.username |
Необязательно | Имя пользователя для аутентификации в удаленном Git-репозитории. Не требуется, если используется SSH с аутентификацией по паре ключей RSA | |
remoteRepo.password |
Необязательно | Пароль для аутентификации в удаленном Git-репозитории. Не требуется, если используется SSH с аутентификацией по паре ключей RSA | |
remoteRepo.ssh.privateKey.path |
Необязательно | Путь к закрытому ключу SSH, если используется SSH с аутентификацией по паре ключей RSA | |
remoteRepo.ssh.privateKey.passphrase |
Необязательно | Фраза-пароль закрытого ключа SSH, если используется SSH с аутентификацией по паре ключей RSA | |
failDeploymentOnFailure |
Необязательно | true |
Включает сбой развертывания при сбое процессора |
Примеры:
- Процессор Git Pull, использующий базовую аутентификацию
- processorName: gitPullProcessor
remoteRepo:
url: https://github.com/myuser/mysite.git
branch: live
username: myuser
password: mypassword
- Процессор Git Pull, использующий SSH с парой ключей RSA
- processorName: gitPullProcessor
remoteRepo:
url: https://github.com/myuser/mysite.git
branch: live
ssh:
privateKey:
path: /home/myuser/myprivatekey
passphrase: mypassphrase
Процессор Git Diff
Процессор, который, используя ранее обработанный сохраненный коммит, сравнивает его с текущим коммитом развертывания для определения набора изменений. Если ранее обработанный коммит отсутствует, весь репозиторий считается набором изменений.
Этот процессор должен быть размещен после gitPullProcessor
и перед любым другим процессором, таким как searchIndexingProcessor
.
Свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
includeGitLog |
Небязательно | false |
Указывает, следует ли включать сведения логов git в набор изменений |
updateCommitStore |
Необязательно | true |
Указывает, следует ли изменить значение обработанного коммита |
failDeploymentOnFailure |
Необязательно | true |
Включает сбой развертывания при сбое процессора |
Пример:
- processorName: gitDiffProcessor
includeGitLog: true
Процессор Git Push
Процессор, который отправляет локальный репозиторий в удаленный репозиторий Git.
Свойста:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
localRepoBranch |
Обязательно | Ветвь локального репозитория для отправки | |
remoteRepo.url |
Обязательно | URL-адрес удаленного Git-репозитория, в который нужно отправить | |
remoteRepo.branch |
Необязательно | Ветвь удаленного Git-репозитория, в который нужно отправить | |
remoteRepo.username |
Необязательно | Имя пользователя для аутентификации в удаленном Git-репозитории. Не требуется, если используется SSH с аутентификацией по паре ключей RSA | |
remoteRepo.password |
Необязательно | Пароль для аутентификации в удаленном Git-репозитории. Не требуется, если используется SSH с аутентификацией по паре ключей RSA | |
remoteRepo.ssh.privateKey.path |
Необязательно | Путь к закрытому ключу SSH, если используется SSH с аутентификацией по паре ключей RSA | |
remoteRepo.ssh.privateKey.passphrase |
Необязательно | Фраза-пароль закрытого ключа SSH, если используется SSH с аутентификацией по паре ключей RSA | |
force |
Необязательно | false |
Устанавливает предпочтение использования принудительной (force) передачи данных при отправке |
pushAll |
Необязательно | false |
Указывает, все ли локальные ветви должны быть отправлены в удаленный репозиторий |
Пример:
- Git Push-процессор, использующий базовую аутентификацию
- processorName: gitPushProcessor
remoteRepo:
url: https://github.com/myuser/mysite.git
branch: deployed
username: myuser
password: mypassword
- Git Push-процессор, использующий SSH с парой ключей RSA
- processorName: gitPushProcessor
remoteRepo:
url: https://github.com/myuser/mysite.git
branch: deployed
ssh:
privateKey:
path: /home/myuser/myprivatekey
passphrase: mypassphrase
Процессор обновления идентификатора коммита в Git
Процессор, который обновляет значение обработанных коммитов текущим коммитом.
Пример:
- processorName: gitUpdateCommitIdProcessor
Процессор Groovy Script
Процессор, который может обрабатывать опубликованный контент.
Свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
scriptPath |
Обязательно | Относительный путь к исполняемому скрипту |
Путь по умолчанию, по которому загружаются скрипты, - $CMS_HOME/bin/cms-deployer/processors/scripts
Пример:
- processorName: scriptProcessor
scriptPath: 'myscripts/mychanges.groovy'
Следующие переменные доступны для использования в ваших скриптах:
Имя переменной | Описание |
---|---|
logger |
Логгер (logger) процессора: http://www.slf4j.org/api/org/slf4j/Logger.html |
applicationContext |
Контекст приложения текущей цели (target): https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationContext.html |
deployment |
Текущее развертывание |
execution |
Выполнение этого процессора |
filteredChangeSet |
Подмножество исходного набора изменений, которое соответствует шаблону includeFiles и не соответствует шаблону excludeFiles для данного процессора |
originalChangeSet |
Начальный набор изменений, возвращенный предыдущими процессорами в pipeline-е |
Рассмотрим пример скрипта для использования в процессоре Groovy Script. Вот скрипт, который добавляет файл из набора изменений только в случае, если в развертывании присутствует определенный параметр:
import ru.dc.cms.deployer.api.ChangeSet
logger.info("starting script execution")
def specialFile = "/site/website/expensive-page-to-index.xml"
// if the file has been changed but the param was not sent then remove it from the change set
if (originalChangeSet.getUpdatedFiles().contains(specialFile) && !deployment.getParam("index_expensive_page")) {
originalChangeSet.removeUpdatedFile(specialFile)
}
// return the new change set
return originalChangeSet
Процессор событий развертывания на основе файлов
Процессор, который отвечает за запуск события развертывания, на которое могут подписаться пользователи репозитория (CMS Engines) путем чтения файла из репозитория.
Свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
deploymentEventsFileUrl |
Необязательно | deployment-events.properties |
Относительный путь к файлу событий развертывания |
eventName |
Обязательно | Имя события для запуска |
Пример:
- processorName: fileBasedDeploymentEventProcessor
eventName: 'events.deployment.rebuildContext'
Процессор командной строки
Процессор, который запускает процесс командной строки.
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
workingDir |
Небязательно | Директория CMS Deployer | Директория, из которой будет запущен процесс |
command |
Обязательно | Полная команда, которую будет выполнять процесс | |
processTimeoutSecs |
Необязательно | 30 |
Количество секунд, в течение которых необходимо дождаться завершения процесса |
includeChanges |
Необязательно | Добавлены дополнительные параметры Пример: script.sh SITE_NAME OPERATION (CREATE/UPDATE/DELETE) FILE (относительный путь к файлу) |
Пример:
- processorName: commandLineProcessor
workingDir: '/home/myuser/myapp/bin'
command: 'myapp -f --param1=value1'
Процессор индексирования поиска
Процессор, осуществляющий индексацию файлов в наборе изменений с использованием одного или нескольких BatchIndexer. После завершения процесса индексации, процессор осуществляет отправку коммита.
Свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
ignoreIndexId |
Небязательно | false |
Указывает на то, должен ли быть проигнорирован ID индекса |
indexId |
Необязательно | Значение siteName |
Конкретный ID индекса для использования |
reindexItemsOnComponentUpdates |
Необязательно | true |
Флаг, определяющий, что при обновлении компонента также необходимо обновить все другие страницы и компоненты, которые его включают |
Пример:
- processorName: searchIndexingProcessor
Процессор вызова HTTP-метода
Выполняет вызов HTTP-метода.
Свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
url |
Обязательно | URL-адрес для вызова | |
method |
Обязательно | HTTP-метод |
Пример:
- processorName: httpMethodCallProcessor
method: GET
url: 'http://localhost:8080/api/1/site/cache/clear.json?cmsSite=mysite'
Процессор задержки
Процессор, который останавливает выполнение pipeline-а на заданное количество секунд.
Свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
seconds |
Необязательно | 5 |
Количество секунд ожидания |
Пример:
- processorName: delayProcessor
seconds: 10
Процессор поиска и замены
Процессор, заменяющий шаблон в содержимом созданных или обновленных файлов.
Файлы, измененные этим процессором, не будут зафиксированы в репозитории Git и будут удалены при следующем запуске развертывания.
Свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
textPattern |
Обязательно | Регулярные выражения для поиска в файле | |
replacement |
Обязательно | Выражение для замены совпадений | |
failDeploymentOnFailure |
Необязательно | true |
Включает сбой развертывания при сбое процессора |
Пример:
- processorName: findAndReplaceProcessor
textPattern: (/static-assets/[^"<]+)
replacement: 'http://mycdn.com$1'
Процессоры AWS
Все процессоры развертывания, связанные со службами AWS, поддерживают следующие свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
region |
Необязательно | Если не предоставлено, будут использоваться значения AWS SDK по умолчанию | Регион AWS |
accessKey |
Необязательно | Если не предоставлено, будут использоваться значения AWS SDK по умолчанию | Ключ доступа AWS |
secretKey |
Необязательно | Если не предоставлено, будут использоваться значения AWS SDK по умолчанию | Секретный ключ AWS |
url |
Обязательно | URL-адрес S3 бакета AWS для загрузки файлов | |
failDeploymentOnFailure |
Необязательно | true |
Включает сбой развертывания при сбое процессора |
Процессор синхронизации S3
Процессор, который синхронизирует файлы с S3 бакетом AWS.
Пример:
- processorName: s3SyncProcessor
url: s3://serverless-sites/site/mysite
Процессор событий развертывания S3
Процессор, который загружает события развертывания в S3 бакет AWS.
Свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
deploymentEventsFileUrl |
Необязательно | deployment-events.properties |
URL-адрес файла событий развертывания, относящийся к локальному репозиторию git |
Пример:
- processorName: s3DeploymentEventsProcessor
region: ${aws.region}
accessKey: ${aws.accessKey}
secretKey: ${aws.secretKey}
url: {{aws.s3.url}}
Процессор аннулирования Cloudfront
Процессор, который делает недействительными измененные файлы в данных дистрибутивах AWS Cloudfront.
Свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
distributions |
Обязательно | Список идентификаторов дистрибутивов |
Пример:
- processorName: cloudfrontInvalidationProcessor
distributions:
- E15UHQPTKROC8Z
Процессоры постразвертывания
Процессоры постразвертывания работают основываясь на предположении о том, что все измененные файлы были обработаны, и результат развертывания известен (либо успешный, либо неудачный). Следовательно, эти процессоры должны находиться после всех основных процессоров развертывания для эффективной работы, так как они реагируют в соответствии с установленными результатами.
Процессор вывода файлов
Постпроцессор, сохраняющий результат развертывания в выходной CSV-файл в директории CMS_HOME/logs/deployer
, предназначен для последующего доступа в случае сбоя развертывания или обработки файлов.
Пример:
- processorName: fileOutputProcessor
Процессор почтовых уведомлений
Постпроцессор, предназначенный для отправки уведомления по электронной почте с результатом развертывания, активируется в случае сбоя развертывания или успешной обработки файлов. Если присутствует выходной файл, созданный fileOutputProcessor
, он прикрепляется к электронному письму.
Свойства:
Название | Обязательно/необязательно | Значение по умолчанию | Описание |
---|---|---|---|
templateName |
Необязательно | default |
Название шаблона Freemarker, используемого для создания электронного письма |
from |
Необязательно | noreply@example.com |
Значение поля “Отправитель” в электронных письмах |
to |
Обязательно | Значение поля “Получатель” в электронных письмах | |
subject |
Необязательно | Deployment Report |
Значение поля “Тема” в электронных письмах |
html |
Необязательно | true |
Указывает, являются ли письма HTML |
serverName |
Необязательно | Текущее имя локального хоста | Имя хоста почтового сервера |
dateTimePattern |
Необязательно | MM/dd/yyyy hh:mm:ss.SSS a z |
Шаблон даты и времени, который следует использовать при указании даты в электронном письме |
status |
Необязательно | ON_ANY_STATUS |
Указывает, для какого статуса развертывания следует отправлять электронные письма. Возможные значения:
|
Пример:
- processorName: mailNotificationProcessor
to:
- admin@example.com
- author@example.com
status: ON_ANY_FAILURE
Пример полного pipeline
В примере ниже показано, как процессоры развертывания работают вместе для бессерверного сайта с использованием сервисов AWS.
pipeline:
# -------------------- START OF MAIN PIPELINE --------------------
# First clone or update the local repository from github
- processorName: gitPullProcessor
remoteRepo:
url: https://github.com/myuser/mysite.git
branch: live
username: myuser
password: my_secret_password
# Then find the added/changed/deleted files since the previous pull (if any)
- processorName: gitDiffProcessor
# Change all references to static-assets to use a CDN URL instead of the local URL
- processorName: findAndReplaceProcessor
includeFiles: ['^/site/.*$', '^/templates/.*$', '^/static-assets/.*(js|css|html)$']
textPattern: (/static-assets/[^"<]+)
replacement: 'http://d111111abcdef8.cloudfront.net$1'
# Index the changes in search
- processorName: searchIndexingProcessor
# Sync the changes in a S3 bucket
- processorName: s3SyncProcessor
url: s3://serverless-sites/site/mysite
# Add a small delay to allow the S3 changes to propagate
- processorName: delayProcessor
# Invalidate the changed files in the CDN
- processorName: cloudfrontInvalidationProcessor
includeFiles: ['^/static-assets/.*$']
distributions:
- E15UHQPTKROC8Z
# Trigger deployment events so any CMS Engine listening can update accordingly:
# Rebuild the site context if any config or script has changed
- processorName: fileBasedDeploymentEventProcessor
includeFiles: ["^/?config/.*$", "^/?scripts/.*$"]
excludeFiles: ['^/config/studio/content-types/.*$']
eventName: 'events.deployment.rebuildContext'
# Clear the cache if any static-asset has changed
- processorName: fileBasedDeploymentEventProcessor
excludeFiles: ['^/static-assets/.*$']
eventName: 'events.deployment.clearCache'
# Rebuild the GraphQL schema if any content-type has changed
- processorName: fileBasedDeploymentEventProcessor
includeFiles: ['^/config/studio/content-types/.*$']
eventName: 'events.deployment.rebuildGraphQL'
# Push the updated events to the S3 bucket
- processorName: s3SyncProcessor
includeFiles: ['^/?deployment-events\.properties$']
url: s3://serverless-sites/site/mysite
# -------------------- END OF MAIN PIPELINE --------------------
# Only Post Processors can be in this section
# Record the result of the deployment to a CSV file
- processorName: fileOutputProcessor
# Notify the site admin & an author if there were any failures during the deployment
- processorName: mailNotificationProcessor
to:
- admin@example.com
- author@example.com
status: ON_ANY_FAILURE
Кастомные процессоры
CMS Deployer можно легко настроить на соответствие различным требованиям. Если возникает потребность в расширении функциональности, вы также можете внедрить пользовательские библиотеки, следуя этим инструкциям:
Шаг 1: Создайте кастомный процессор
Пользовательские процессоры могут использовать любую библиотеку или набор инструментов от сторонних разработчиков. Единственное требование - определить класс, реализующий интерфейс DeploymentProcessor
.
Настоятельно рекомендуется расширять либо AbstractDeploymentProcessor
, либо AbstractMainDeploymentProcessor
, а не только реализовывать интерфейс.
Для доступа к этим классам просто добавьте зависимость в ваш проект:
<dependency>
<groupId>ru.dc.cms</groupId>
<artifactId>cms-deployer</artifactId>
<version>${dccms.version}</version>
</dependency>
Шаг 2: Добавьте кастомный процессор
Пользовательские процессоры интегрируются в CMS Deployer путем размещения всех необходимых JAR-файлов в папке INSTALL_DIR/bin/cms-deployer/lib
.
Обязательно внимательно проверьте все зависимости в вашем проекте, чтобы избежать конфликтов с библиотеками, используемыми CMS Deployer или другими пользовательскими процессорами.
Шаг 3: Настройте кастомный процессор
После размещения пользовательского процессора в classpath остается всего лишь один шаг — создать или обновить цель (target) для его включения. Все файлы конфигурации для целей будут храниться в папке INSTALL_DIR/data/deployer/targets
.
Для начала необходимо создать или обновить файл контекста, который определяет все bean-ы, необходимые для пользовательского процессора. Файл должен иметь имя {site}-{env}-context.xml
.
<bean id="externalService" class="com.example.Service">
<property name="url" value="${service.url}"/>
<property name="port" value="${service.port}"/>
</bean>
<bean id="myCustomProcessor" class="com.example.CustomProcessor" parent="deploymentProcessor">
<property name="service" ref="externalService"/>
</bean>
Родительский bean предоставляется CMS Deployer и включает общие конфигурации, используемые классами AbstractDeploymentProcessor
и AbstractMainDeploymentProcessor
.
После того как bean определен, его можно добавить в конвейер цели в файле YAML с соответствующим именем {site}-{env}.yaml
.
target:
env: preview
siteName: mySite
deployment:
scheduling:
enabled: false
pipeline:
- processorName: myCustomProcessor
username: john
password: passw0rd!
service:
url: http://www.example.com
port: 8080
Любые изменения в classpath потребуют перезапуска CMS Deployer, в то время как изменения в файлах конфигурации будут применены при перезагрузке цели.
Шаблоны цели (target)
При создании цели в CMS Deployer можно воспользоваться одним из встроенных шаблонов, который легко настраивается с использованием дополнительных параметров при его создании.
Встроенные шаблоны
Все шаблоны целей поддерживают следующие параметры:
Название | Обязательно/необязательно | Описание |
---|---|---|
env |
Обязательно | Окружение цели (например, dev) |
site_name |
Обязательно | Название сайта цели (например, website) |
repo_url |
Обязательно | URL-адрес репозитория цели |
Authoring-цель
Этот шаблон используется CMS Studio при создании нового проекта или сайта. Он настраивает цель, специально предназначенный для функционала поиска CMS Studio, включая индексацию XML-файлов, бинарных файлов, а также дополнительных метаданных Git из репозитория сайта.
Эта цель предназначена для:
- Определения измененных файлов на основе истории локального Git-репозитория.
- Индексации всего контента сайта для поиска.
Для этого целевого объекта не требуется дополнительных параметров.
При использовании этой цели необходимо установить значение repo_url
как локальный путь к файловой системе.
Локальная цель
Это второй шаблон, используемый CMS Studio при создании нового проекта. Этот шаблон настраивает цель для предварительного просмотра проекта.
Цель предназначена для:
- Определения измененных файлов на основе истории локального Git-репозитория.
- Индексации всего содержимого проекта для поиска.
- Пересборки контекста сайта CMS Engine при изменениях в файлах конфигурации или Groovy-скриптах.
- Очистки кэша CMS Engine.
- Пересборки схемы GraphQL проекта CMS Engine при изменениях в определениях типов контента.
- Отправки уведомлений по электронной почте, если это включено.
Параметры:
Название | Обязательно/необязательно | Описание |
---|---|---|
disable_deploy_cron |
Необязательно | Отключает запланированное задание (cron job), которое выполняет развертывание с определенной периодичностью |
notification_addresses |
Необязательно | Адреса электронной почты, на которые должны приходить уведомления о развертывании |
Когда используется эта цель, значение repo_url
должно быть путем к локальной файловой системе.
Удаленная цель
Это шаблон по умолчанию, используемый CMS Engine в delivery-окружении. Он напоминает локальную цель, но поддерживает удаленные Git-репозитории.
Эта цель настроена на:
- Клонирование удаленного репозитория при необходимости.
- Извлечение последних изменений из удаленного репозитория (с удалением всех локальных незафиксированных или конфликтующих файлов).
- Определение измененных файлов на основе истории Git-репозитория.
- Индексацию всего содержимого проекта в соответствующем поисковом механизме.
- Пересборку контекста сайта CMS Engine при изменениях в файлах конфигурации или Groovy-скриптах.
- Очистку кэша CMS Engine.
- Пересборку схемы GraphQL проекта CMS Engine при изменениях в определениях типов контента.
- Отправку уведомлений по электронной почте (если включено).
Параметры:
Название | Обязательно/необязательно | Описание |
---|---|---|
disable_deploy_cron |
Необязательно | Отключает запланированное задание (cron job), которое выполняет развертывание с определенной периодичностью |
repo_branch |
Необязательно | Имя ветви удаленного Git-репозитория, из которого нужно извлечь |
repo_username |
Необязательно | Имя пользователя для доступа к удаленному репозиторию |
repo_password |
Необязательно | Пароль для доступа к удаленному репозиторию |
ssh_private_key_path |
Необязательно | Путь к закрытому ключу для доступа к удаленному репозиторию |
ssh_private_key_passphrase |
Необязательно | Фраза-пароль к закрытому ключу для доступа к удаленному репозиторию ( если ключ защищен парольной фразой) |
notification_addresses |
Необязательно | Адреса электронной почты, на которые должны приходить уведомления о развертывании |
Когда используется эта цель, значение repo_url
должно быть поддерживаемым Git URL (HTTP или SSH).
Цель AWS S3
Этот шаблон используется для CMS Engine в бессерверном delivery-окружении. Он напоминает удаленную цель, но поддерживает синхронизацию файлов с бакетом AWS S3 и также управляет инвалидациями AWS Cloudfront.
Эта цель настроена для:
- Клонирования удаленного репозитория при необходимости.
- Извлечение последних изменений из удаленного репозитория (с удалением всех локальных незафиксированных или конфликтующих файлов).
- Определения измененных файлов на основе истории Git-репозитория.
- Индексации всего содержимого проекта для поиска.
- Синхронизации всех новых, обновленных и удаленных файлов с бакетом AWS S3.
- Выполнения инвалидации для всех обновленных файлов в одном или нескольких дистрибутивах AWS Cloudfront.
- Отправки событий развертывания для всех экземпляров CMS Engine:
- Пересборки контекста сайта при изменениях в файлах конфигурации или Groovy-скриптах.
- Очистки кэша проекта.
- Пересборки схемы GraphQL сайта при изменениях в определениях типов контента.
- Отправки уведомлений по электронной почте (если включено).
Параметры:
Название | Обязательно/необязательно | Описание |
---|---|---|
aws.region |
Необязательно | Регион AWS для использования |
aws.access_key |
Необязательно | Ключ доступа AWS для использования |
aws.secret_key |
Необязательно | Секретный ключ AWS для использования |
aws.distribution.ids |
Необязательно | Массив идентификаторов распределения AWS Cloudfront для выполнения инвалидаций |
aws.s3.url |
Обязательно | Полный AWS S3 URI папки для синхронизации файлов |
disable_deploy_cron |
Необязательно | Отключает запланированное задание (cron job), которое выполняет развертывание с определенной периодичностью |
local_repo_path |
Необязательно | Локальный путь, по которому следует поместить удаленный клон Git-репозитория |
repo_branch |
Необязательно | Имя ветви удаленного Git-репозитория, из которого нужно извлечь |
repo_username |
Необязательно | Имя пользователя для доступа к удаленному репозиторию |
repo_password |
Необязательно | Пароль для доступа к удаленному репозиторию |
ssh_private_key_path |
Необязательно | Путь к закрытому ключу для доступа к удаленному репозиторию |
ssh_private_key_passphrase |
Необязательно | Фраза-пароль к закрытому ключу для доступа к удаленному репозиторию (если ключ защищен парольной фразой) |
notification_addresses |
Необязательно | Адреса электронной почты, на которые должны приходить уведомления о развертывании |
Когда используется эта цель, значение repo_url
должно быть поддерживаемым Git URL (HTTP или SSH).
Дополнительные сведения о настройке бессерверного delivery-процесса можно найти здесь.
Цель AWS CloudFormation
Этот шаблон упрощает создание серверного delivery-окружения без необходимости вручную создавать ресурсы в AWS. Он работает аналогично цели AWS S3, но использует шаблон AWS CloudFormation для создания основных ресурсов AWS во время создания цели. Эти ресурсы включают в себя S3-бакет, предназначенный для хранения контента сайта, и дистрибутив CloudFront, отвечающий за обслуживание балансировщика нагрузки CMS Engine и прямую доставку статических активов из S3-бакета. При удалении цели эти ресурсы автоматически удаляются.
Данная цель настроена для:
- Клонирования удаленного репозитория при необходимости.
- Извлечение последних изменений из удаленного репозитория (с удалением всех локальных незафиксированных или конфликтующих файлов).
- Определения измененных файлов на основе истории Git-репозитория.
- Индексации всего содержимого проекта для поиска.
- Синхронизации всех новых, обновленных и удаленных файлов с бакетом AWS S3.
- Выполнения инвалидации для всех обновленных файлов в дистрибутиве AWS Cloudfront.
- Отправки событий развертывания для всех экземпляров CMS Engine:
- Пересборки контекста сайта при изменениях в файлах конфигурации или Groovy-скриптах.
- Очистки кэша проекта.
- Пересборки схемы GraphQL сайта при изменениях в определениях типов контента.
- Отправки уведомлений по электронной почте (если включено).
Параметры:
Название | Обязательно/необязательно | Описание |
---|---|---|
aws.region |
Необязательно | Регион AWS для использования |
aws.default_access_key |
Необязательно | Ключ доступа AWS для использования в S3 и CloudFront |
aws.default_secret_key |
Необязательно | Секретный ключ AWS для использования в S3 и CloudFront |
aws.cloudformation.namespace |
Обязательно | Префикс, используемый для имен ресурсов CloudFormation |
aws.cloudformation.deliveryLBDomainName |
Обязательно | Доменное имя Engine delivery LB |
aws.cloudformation.cloudfrontCertificateArn |
Необязательно | RN SSL-сертификата CloudFront |
aws.cloudformation.alternateCloudFrontDomainNames |
Необязательно | Альтернативные доменные имена для использования CloudFront (должны совпадать с действительными доменными именами сертификатов) |
aws.cloudformation.access_key |
Необязательно | Ключ доступа AWS для использования в CloudFormation |
aws.cloudformation.secret_key |
Необязательно | Секретный ключ AWS для использования в CloudFormation |
local_repo_path |
Необязательно | Локальный путь, по которому следует поместить удаленный клон Git-репозитория |
repo_branch |
Необязательно | Имя ветви удаленного Git-репозитория, из которого нужно извлечь |
repo_username |
Необязательно | Имя пользователя для доступа к удаленному репозиторию |
repo_password |
Необязательно | Пароль для доступа к удаленному репозиторию |
ssh_private_key_path |
Необязательно | Путь к закрытому ключу для доступа к удаленному репозиторию |
ssh_private_key_passphrase |
Необязательно | Фраза-пароль к закрытому ключу для доступа к удаленному репозиторию (если ключ защищен парольной фразой) |
notification_addresses |
Необязательно | Адреса электронной почты, на которые должны приходить уведомления о развертывании |
Когда используется эта цель, значение repo_url
должно быть поддерживаемым Git URL (HTTP или SSH).
Конфигурация поиска
CMS Deployer предлагает два способа использования поиска.
Единый поисковый кластер
Это наиболее часто используемая конфигурация, все операции будут выполняться в одном поисковом кластере:
target:
search:
elasticSearch:
# Single cluster
urls:
- ${env:SEARCH_URL}
username: ${env:SEARCH_USERNAME}
password: ${env:SEARCH_PASSWORD}
timeout:
# The connection timeout in milliseconds, if set to -1 the default will be used
connect: -1
# The socket timeout in milliseconds, if set to -1 the default will be used
socket: -1
# The number of threads to use, if set to -1 the default will be used
threads: -1
# Indicates if keep alive should be enabled for sockets used by the search client, defaults to false
keepAlive: false
Множественные поисковые кластеры
При использовании данной конфигурации все операции чтения будут осуществляться на одном поисковом кластере, тогда как операции записи будут выполняться на нескольких поисковых кластерах:
target:
search:
elasticSearch:
# Global auth, used for all clusters
username: search
password: passw0rd
# Cluster for read operations
readCluster:
urls:
- 'http://read-cluster-node-1:9200'
- 'http://read-cluster-node-2:9200'
# This cluster will use the global auth
# Clusters for write operations
writeClusters:
- urls:
- 'http://write-cluster-1-node-1:9200'
- 'http://write-cluster-1-node-2:9200'
# This cluster will use the global auth
- urls:
- 'http://write-cluster-2-node-1:9200'
- 'http://write-cluster-2-node-2:9200'
# Override the global auth for this cluster
username: search2
password: passw0rd2
Файлы конфигурации
Конфигурацию поиска можно изменить в двух местах:
-
В глобальном файле конфигурации, расположенном по пути
$CMS_HOME/bin/cms-deployer/config/base-target.yaml
, изменения будут применены ко всем загруженным целям. -
В файле конфигурации индивидуальной цели по пути
$CMS_HOME/data/deployer/targets/{siteName}-{environment}.yaml
.