Объединение нескольких целей Maven в одну транзакцию (например, развертывание и развертывание сайта, что произойдет, если сбой развертывания сайта)?
Я настроил сервер сборки для выполнения
clean javadoc:jar deploy site-deploy
Теперь, если сбой для сайта (из-за того, что сайт не создавался, или кто-то использовал неправильный родительский pom), сервер сборки показывает неудачную сборку, но развертывание уже было применено.
Есть ли способ "объединить" развертывание и развертывание сайта транзакционным способом?
Или я должен использовать другую цепочку целей/фаз (например, install
до site-deploy
)?
Ответы
Ответ 1
Здесь я предлагаю близкое решение с помощью оператора bash &&
mvn clean javadoc:jar install site-deploy && mvn deploy:deploy-file {PARAM}
Это позволит вам
- не удалось выполнить сборку, если какая-либо из целей завершится неудачно во время фазы
install
- Если сбой при развертывании сайта, то ваш артефакт не будет перенесен/развернут в ваш удаленный репозиторий
- не нужно писать какой-либо пользовательский механизм отката, если
site-deploy
не работает
Единственный случай, когда это не удастся, - это когда ваша цель deploy
не удалась, откат site-deploy
не будет. Я думаю, что отказ фазы deploy
будет очень редок.
Ответ 2
deploy
и site-deploy
обычно выполняются через HTTP и потенциально развертываются в разных местах, поэтому достижение транзакционной семантики, вероятно, невозможно, и вам нужно подходить к этому как к возможной проблеме согласованности.
В контексте CI (о котором вы упоминали, что используете), если site-deploy
завершается сбой, вам нужно либо:
- откат
deploy
;
- повторите попытку
site-deploy
.
Я не знаком с quickbuild, но с другими распространенными инструментами CI вы можете разделить задачи на отдельные задания, чтобы упростить применение любого решения.
Поскольку цель (предназначенная для каламбура), по-видимому, состоит в том, чтобы ловить ошибки при создании сайта, возможно, это может создать цепочку заданий:
-
mvn install site
для запуска регулярных тестов и сборки сайта;
- два задания, которые выполняются параллельно и могут быть повторены в случае неудачи:
-
mvn deploy
;
-
mvn site-deploy
.
Это может быть более или менее сложным в зависимости от того, как рабочее пространство делится между заданиями.
Ответ 3
Единственный способ, который я смог найти с помощью основных функций Maven, - это выполнить плагин Release <плагин rollback. Это, однако, означает, что вам лучше изменить исходную команду сборки, чтобы использовать плагин Release, так как эта страница в документации упоминает следующее
Чтобы отменить выпуск, необходимо выполнить следующее требование:
- Вы не выполнили
release:clean
в проекте. Это означает, что сохраняются резервные файлы и дескриптор выпуска из предыдущей команды выпуска.
Однако, похоже, это легко сделать, поскольку по умолчанию плагин Release <плагин perform уже выполняет deploy site-deploy
, который это именно то, что вы делаете. Что касается цели javadoc:jar
, ее можно привязать к профилю выпуска, как указано в этот FAQ.
Если по какой-то причине плагин Release не может быть использован, я думаю, что единственный способ обойти это можно через среду сборки. Вы можете разбить сборку на два этапа:
- На первом этапе выполняется цель
deploy
.
- Выполняется второй этап
site-deploy
.
В случае неудачи второго этапа вы вручную откатываетесь, выполняя первый этап, но против предыдущей ревизии в своем SCM (тот, который был успешно развернут последним).