Объединение нескольких целей 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 (тот, который был успешно развернут последним).