java CI系统上使用共享本地存储库的多Maven进程并发构建

bweufnob  于 2023-02-11  发布在  Java
关注(0)|答案(1)|浏览(103)

我最近正在构建一个CI系统,其中几个项目将与共享的本地存储库同时构建。
为了找到解决方案并使其简单化,我编写了一个脚本来模拟在Mac OS上本地跨多个Maven进程并发构建的情况,如下所示。

task(){
    cd "$1"; pwd;
    mvn -gs /Users/xx/settings-pre.xml clean package -Dmaven.repo.local=/Users/xx/.m2/repository -DskipTests -e -U
}

## clean local repo before concurrent build
rm -rf /Users/xx/.m2/repository

## set maven env
source  ~/newwork/script/set_maven_3.5.0.sh

## I've got 10 project with same code in current dir
## so mvn clean package will be executed in project1, project2.... project10
for d in ./*/;  do
    ## task will be exec concurrently
    task "$d" &
done

我已经尝试了使用Maven-3.5.0的Takari扩展(http://takari.io/book/30-team-maven.html),但并发构建失败。x1c 0d1x
我尝试过Maven-3.9.0和命名锁(https://maven.apache.org/resolver/maven-resolver-named-locks/index.html),但仍然失败。

mvn -gs /Users/ninan/work/apache-maven-3.8.5/conf/settings-pre.xml clean package -Dmaven.repo.local=/Users/ninan/.m6/repository -DskipTests -e -U -Daether.syncContext.named.factory=file-lock -Daether.syncContext.named.nameMapper=file-gav -Daether.syncContext.named.time=120

1我想知道我的本地测试方法是否有问题,比如我用错了方法使用了named lock等等。
如果没有,我能做些什么来解决这个问题。
谢谢。

osh3o9ms

osh3o9ms1#

我认为让maven做任何级别的并发都是个坏主意,原因如下:

  • 较高故障风险
  • 管道反馈不清楚

你想要的正好相反:稳定的测试和清晰的结果,你没有时间去玩和实验。让其他人来测试新的Maven特性。
因此,您应该尽可能地将所有需要的并发性从Maven转移到管道本身:

  • 如果需要并发生成,请创建单独的作业
  • 如果有公共的Maven存储库,您只需要为每个存储库创建单独的Maven存储库(这只对1.time比较麻烦,在此之后Maven使用更新策略,因此存储库更新很便宜);或者,您必须按顺序运行作业
  • 如果您需要构建多模块项目,不要让Maven来做,而是在管道中将其拆分,以便每个父模块作为单独的阶段运行(一个父模块一个Maven调用)
  • 不要让Maven一次运行构建和测试:将构建和测试分开到不同的阶段,这样你就可以在构建阶段之后拥有工件。这些工件应该在所有后续阶段重用,这些阶段完成所有的测试等。(记住你只需要POM和工件在所有测试阶段-不再需要代码)等。

所以总结一下,不要给予Maven太多的工作要做,而是把它切成小块。我认为你不应该朝着你所描述的方向去。

相关问题