将多个Maven目标组合到一个事务中(例如部署和站点部署,如果站点部署失败怎么办?)

时间:2017-07-07 07:18:50

标签: java maven deployment transactions

我将构建服务器配置为

clean javadoc:jar deploy site-deploy

现在,如果站点部署失败(因为站点未构建,或者某人使用了错误的父pom),则构建服务器显示构建失败,但部署已应用。

有没有办法以事务方式“合并”部署和站点部署?

或者我应该使用不同的目标/阶段链(例如install之前的site-deploy)?

3 个答案:

答案 0 :(得分:7)

我在这里提出了一个帮助bash &&运算符

的紧密解决方案
mvn clean javadoc:jar install site-deploy && mvn deploy:deploy-file {PARAM}

这会让你

    如果任何目标在install阶段期间失败,则
  • 会失败
  • 如果site-deploy失败,那么您的工件将不会被推送/部署到您的远程存储库
  • 如果site-deploy失败,则无需编写任何自定义回滚机制

唯一不会失败的情况是当您的deploy目标失败时,将不会回滚site-deploy。我认为deploy阶段的失败将非常罕见。

答案 1 :(得分:3)

deploysite-deploy通常通过HTTP完成并可能部署到不同的地方,因此实现事务语义可能是不可能的,您需要将其视为最终的一致性问题。

在CI上下文中(您提到的正在使用),如果site-deploy失败,您需要:

  • 回滚deploy;
  • 重试site-deploy目标。

我不熟悉quickbuild,但使用其他常见CI工具,您可以将任务拆分为单独的作业,以便轻松应用任何一种解决方案。

由于目标(双关语)似乎是在构建网站时捕获错误,因此选项可能是创建一系列工作:

  1. mvn install site运行常规测试并构建网站;
  2. 两个并行运行的作业,如果失败则可以重试:
    • mvn deploy;
    • mvn site-deploy
  3. 这可能或多或少复杂,具体取决于作业之间共享工作空间的方式。

答案 2 :(得分:2)

我使用Maven核心功能找到的唯一方法是通过Release Plugin的rollback目标。但这意味着您最好更改原始构建命令以使用Release Plugin,因为文档中的this page提到了以下内容:

  

要回滚版本,必须满足以下要求:

     
      
  • 您还没有在项目上运行release:clean。这意味着备份文件和先前版本命令中的发布描述符仍然存在
  •   

但是,似乎很容易做到这一点,因为Release Plugin的perform目标默认情况下已经执行deploy site-deploy,这正是您正在做的事情。至于javadoc:jar目标,可以将其附加到this FAQ中提到的发布配置文件中。

如果由于某种原因,无法使用Release Plugin,那么我认为解决这个问题的唯一方法就是通过构建环境本身。您可以将构建分为两个阶段:

  1. 第一阶段运行deploy目标。
  2. 第二阶段运行site-deploy
  3. 如果第二阶段失败,您可以通过执行第一阶段而不是SCM中的上一版本(上次成功部署的版本)来手动回滚。