我希望通过在本地Bamboo代理上运行一些与常春藤相关的Ant任务来释放并行功能。我们的Bamboo机器具有丰富的CPU马力和RAM。
如果我将构建任务拆分为并行作业,每个作业将根据ivy-retrieve
的结果生成不同的工件,我已经解决了理论中的问题。
实际上,遗憾的是,如果由于某种原因,两个Ant任务在同一台计算机和同一组织工件上同时运行,它们将发生冲突,并且会出现XML错误。
我没有与我的确切错误消息,因为1)问题是随机的重现和2)我已经做了很多工作将所有工作放入顺序工作。但我清楚地知道发生了什么。
当Ant运行下面的代码ivy-retrieve时,它将使用本地用户的缓存目录,恰好是/home/bamboo/.ivy2/cache
。在那里,我可以找到许多resolved-[org]-[artifact]-[version].xml
个文件(每个文件都是我项目的不同版本)。当我想运行两次ivy-retrieve任务时会出现问题,例如compile
配置,另一个runtime
。两个XML会发生冲突,Ivy会在读取其中一个文件时报告SAX错误,因为它看起来好像正在写入。
如果我在远程代理上运行该作业,我希望没有问题,但是我已经有5个本地代理,如果当地人有空,Bamboo将不会激活远程代理。
不幸的是,我的所有工作彼此独立,需要不同的常春藤检索。目前我按顺序运行它们。
是否有可能告诉在Bamboo代理上运行的Ivy使用临时唯一缓存目录来处理dependencies.xml文件而不是使用全局缓存?或者最多同步访问文件?
第二个选项将并行Ant进程读取并相互独占地写入缓存的dependencies.xml文件。所以他们阅读的内容总是一致的文件(同一个文件,我不在乎是否会覆盖另一个文件)
答案 0 :(得分:3)
Ivy有2个缓存 - 存储库缓存和解析缓存。第二个是覆盖每个分辨率,不应该同时由多个进程使用。
以下是ivysettings.xml的一个示例:
<ivysettings>
<properties environment="env" />
<caches resolutionCacheDir="${env.TEMP_RESOLUTION_CACHE}" />
<settings defaultResolver="local" />
<statuses default="development">
<status name="release" integration="false"/>
<status name="integration" integration="true"/>
<status name="development" integration="true"/>
</statuses>
...
</ivysettings>
或者您可以尝试lock-strategy。我没试过。