代码之家  ›  专栏  ›  技术社区  ›  Steve Chambers

如何使maven自动重试(从失败的模块恢复)?

  •  18
  • Steve Chambers  · 技术社区  · 6 年前

    我正在研究一个大型Maven项目,该项目由许多不同的模块组成。maven构建在某些模块上间歇性失败,但如果一切正常,则可以手动调用一个简单的 --resume-from (有时在几个不同的模块上)将允许它继续成功。

    我故意省略了发生这种情况的确切原因的细节-怀疑可能是由于Windows文件锁定了目标文件夹中的文件-但这不是问题的关键。

    问题: 是否可以让Maven自动重试(可能仅一次,或最多三次),从故障模块中恢复?

    思想: 我目前唯一能想到的方法是通过一个批处理文件来完成,它读取最后一行,并以某种方式提取要恢复的模块名——但这看起来并不容易。不想重新发明轮子,想知道是否有一个好的Maven插件已经完成了任务?

    3 回复  |  直到 6 年前
        1
  •  5
  •   Vishnu M. D.    6 年前

    我有一个办法来解决你的问题,也许你不需要一个批处理文件来完成这项工作。您可以创建一个maven核心扩展,并创建一个要执行的eventspy库——当构建失败时从中恢复。 我已经测试了这个答案中的例子 Run a maven plugin when build fails

    根据这个答案,您可以使用Maven调用程序 Maven Invoker

    然而…我找到了安全并行构建的扩展 Maven Core Extensions Example for Safe Parallel Builds

    我知道你需要项目信息…所以往里面看 ExecutionEvent MavenProject 类,我们有当前建筑项目的所有信息。

    我希望它也能为你工作。

    编辑:

    我正在寻找一些扩展,当某些模块发生故障时,它实现了这种行为“自动重试”。如果我找不到任何东西,我们应该为它创建一个扩展。

        2
  •  2
  •   Steve Chambers    6 年前

    下面是对完全成熟的批处理文件的尝试-使用 Anitha.R's answer 作为起点。

    使用说明:

    1. 确保maven可执行文件位于 Windows path .
    2. 理想情况下,还要确保tee for windows的版本在windows路径中。 (例如,我使用作为 Git for Windows ,添加了Git's usr\bin 文件夹到我的路径)。
    3. 将批处理文件代码复制到新文件中。
    4. 改变 max_retries 根据需要设置值。
    5. 在Windows路径的文件夹中另存为“mvnretry.bat”。
    6. 以同样的方式运行 Maven ,例如 mvnretry clean install -Pmyprofile -DskipTests .

    批处理文件代码:

    @echo off
    set max_retries=3
    set retry_count=0
    set output_file=%date:/=%%time::=%
    set output_file=%output_file: =0%
    set output_file=%temp%\mvn%output_file:.=%.out
    set mvn_command=call mvn %*
    set tee_found=true
    where /q tee
    if not errorlevel 1 goto retry
      set tee_found=false
      echo tee.exe not found in system path^^! Build will continue but output will be delayed...
    
    :retry
      echo %mvn_command%
      if %tee_found%==true (
        %mvn_command% | tee %output_file%
      ) else (
        %mvn_command% > %output_file%
        type %output_file%
      )
      echo Parsing output...
      set "resume_from="
      for /f "tokens=2 delims=:" %%i in ('type %output_file% ^| find "mvn <goals> -rf"') do (
        set resume_from=%%i
      )
      if %retry_count% LSS %max_retries% if not [%resume_from%] == [] (
        echo Resuming from %resume_from%...
        set /a retry_count=retry_count+1
        set /a retries_remaining=max_retries-retry_count
        echo Retrying... [retries used: %retry_count%, retries remaining: %retries_remaining%]
        set mvn_command=call mvn -rf :%resume_from% %*
        goto retry
      )
    
    del /q %output_file%
    
        3
  •  1
  •   Anitha.R    6 年前

    我相信使用批处理脚本实现这一点看起来很容易。希望下面的脚本适用于您。

    @echo off
    setlocal enabledelayedexpansion
    for /f "tokens=2 delims=:" %%i in ('call mvn clean install ^| find "mvn <goals> -rf"') do (
        call mvn clean install -e -rf : %%i
    )
    endlocal
    

    很遗憾我没有测试过。