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

Java 将多个Maven目标组合到一个事务中(例如部署和站点部署,如果站点部署失败怎么办?),java,maven,deployment,transactions,Java,Maven,Deployment,Transactions,我将构建服务器配置为 cleanjavadoc:jar部署站点部署 现在,如果站点部署失败(因为站点没有生成,或者有人使用了错误的父pom),则生成服务器将显示失败的生成,但部署已经应用 是否有一种方法可以以事务方式“组合”部署和站点部署 或者我应该使用不同的目标/阶段链(例如在站点部署之前安装) 使用Maven核心功能的唯一方法是通过发布插件的目标。但是,这意味着您最好将原始的build命令更改为使用Release插件,因为文档中提到了以下内容: 要回滚发布,必须满足以下要求: 您尚未对项目

我将构建服务器配置为

cleanjavadoc:jar部署站点部署

现在,如果站点部署失败(因为站点没有生成,或者有人使用了错误的父pom),则生成服务器将显示失败的生成,但部署已经应用

是否有一种方法可以以事务方式“组合”部署和站点部署


或者我应该使用不同的目标/阶段链(例如
站点部署之前安装

使用Maven核心功能的唯一方法是通过发布插件的目标。但是,这意味着您最好将原始的build命令更改为使用Release插件,因为文档中提到了以下内容:

要回滚发布,必须满足以下要求:

  • 您尚未对项目运行
    release:clean
    。这意味着先前版本命令中的备份文件和版本描述符仍然存在
然而,这似乎很容易做到,因为发布插件的目标在默认情况下已经执行了
deploysite deploy
,这正是您正在做的。至于
javadoc:jar
目标,它可以附加到中提到的发布概要文件中

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

  • 第一阶段运行
    deploy
    目标
  • 第二阶段运行
    站点部署

  • 如果第二个阶段失败,您可以通过执行第一个阶段手动回滚,但要与SCM中的上一个版本(上次成功部署的版本)相对应。

    在这里,我通过帮助bash
    和&
    操作员提出一个解决方案

    mvn clean javadoc:jar install site-deploy && mvn deploy:deploy-file {PARAM}
    
    这会让你

    • 如果任何目标在
      安装
      阶段失败,则生成失败
    • 如果站点部署失败,那么您的工件将不会被推送到/部署到远程存储库
    • 如果
      站点部署失败,则无需编写任何自定义回滚机制

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

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

    在CI上下文中(您提到您正在使用的),如果
    站点部署失败,您需要:

    • 回滚
      部署
    • 重试
      站点部署
      目标
    我不熟悉quickbuild,但使用其他常用CI工具,您可以将任务拆分为单独的作业,以便于应用任一解决方案

    由于目标(双关语)似乎是在构建站点时捕捉错误,因此可以选择创建一个作业链:

  • mvn安装站点
    运行定期测试并构建站点
  • 两个并行运行且在失败时可以重试的作业:
    • mvn部署
    • mvn站点部署

  • 根据作业之间共享工作区的方式,这可能会或多或少复杂。

    因此,如果这是某种与构建服务器相关的问题,那么您应该用服务器名称标记它。我想知道答案的人都不会这么看。这只是一个Maven命令链,我们从构建服务器(Quickbuild)调用它,但Jenkins、Bambor等也会这样。我想,然后,您必须编写回滚方法并根据maven命令退出代码触发它。我可能不是第一个希望在一个构建中进行部署和站点部署的人。按照下面的bash脚本进行部署怎么样<代码>mvn清理安装站点部署和mvn部署
    。但是,如果发布工件时出现网络错误,则此操作将失败。发布:clean仅还原项目和SVN上的更改。它无法将部署恢复到Nexus(这在Maven中可能是不可能的)。第二种方法的问题是相同的:无法轻松恢复部署。我知道真正的交易行为可能是不可能的。也许我应该使用
    install site deploy site deploy
    ,这样在大多数情况下,构建会在部署之前失败。@JFMeier这很奇怪。我认为当我们执行
    release:rollback
    时,Maven也应该回滚远程repo。也许有人应该请求此功能。对于第二种方法,是的,它肯定更难实现。但正如我所提到的,部署恢复可以通过重新部署在Nexus上成功部署的最后一个版本来手动完成(它本身不是“恢复”,更多的是在较旧的SCM版本上重新部署)。但这需要将构建拆分为多个阶段,以便对构建步骤进行细粒度控制(这是IMO更好的做法)。“部署阶段的失败将非常罕见”我们怎么知道?如果
    deploy
    失败并且
    站点部署
    正常工作,该怎么办?这只解决了事务性问题的一个特定示例。据我所知,部署可能由于以下原因而失败(可能更多,但我首先想到的是)1)远程存储库不可访问2)网络问题3)网络安全规则(上载大小)。我已经在上面清楚地提到过,这是
    关闭解决方案
    ,如果在我的解决方案中
    部署
    失败,那么
    站点部署
    将不会有
    回滚
    。如果错误不是网络,重试站点部署通常是没有意义的,但是站点的创建由于问题而失败