我想通过在本地 Bamboo 代理上运行一些与常春藤相关的 Ant 任务来释放并行性的力量。我们的竹子机器具有大量的CPU马力和RAM。
如果我将构建任务拆分为并行作业,每个作业将根据ivy-retrieve
的结果生成不同的工件,我已经解决了理论上的问题。
不幸的是,在实践中,如果由于某种原因,两个 Ant 任务在同一台机器和同一个组织工件上同时运行,它们就会发生冲突,其中一个任务会出现 XML 错误。
我没有确切的错误消息,因为 1( 问题是随机重现的,2( 我已经做了很多工作将所有作业放入一个顺序作业中。但我很清楚正在发生的事情。
当 Ant 运行 ivy-retrieve,下面的代码时,它将使用本地用户的缓存目录,该目录恰好是/home/bamboo/.ivy2/cache
。在那里我可以找到很多resolved-[org]-[artifact]-[version].xml
文件(每个文件都是我项目的不同构建版本(。当我想运行两次 ivy-检索任务时,会出现此问题,例如一次用于compile
配置,另一次用于runtime
。这两个 XML 将发生冲突,Ivy 将在读取其中一个文件时报告 SAX 错误,因为它看起来正在写入。
如果我在远程代理上运行作业,我希望没有问题,但是嘿,我已经有 5 个本地代理,如果当地人有空,奔步不会解雇远程代理。
不幸的是,我所有的工作,彼此独立,都需要不同的常春藤检索。目前我按顺序运行它们。
问题是
是否可以告诉在奔步代理上运行的常春藤使用临时的唯一缓存目录来处理依赖项.xml文件,而不是使用全局缓存?还是最多同步对文件的访问?
第二个选项是并行 Ant 进程以互斥方式读写缓存的依赖项.xml文件。所以他们读取的内容将始终是一个一致的文件(完全相同的文件,我不在乎一个进程是否覆盖另一个进程(
Ivy 有 2 个缓存 - 存储库缓存和解析缓存。第二个分辨率被覆盖每个分辨率,并且不应同时由多个进程使用。
- 设置指向临时目录的环境变量您的竹子代理。
- 为您的项目创建一个单独的 ivysettings.xml 文件。
- 在项目的 ivysettings 中使用环境变量.xml以设置缓存目录。
下面是常春藤设置的示例.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>
或者您可以尝试锁定策略。我没试过。