为常春藤分开缓存文件夹

时间:2016-02-16 16:25:25

标签: ant continuous-integration ivy bamboo

我希望通过在本地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文件。所以他们阅读的内容总是一致的文件(同一个文件,我不在乎是否会覆盖另一个文件)

1 个答案:

答案 0 :(得分:3)

Ivy有2个缓存 - 存储库缓存和解析缓存。第二个是覆盖每个分辨率,不应该同时由多个进程使用。

  1. 设置指向临时目录的环境变量 你的竹子代理商。
  2. 为您的项目创建单独的ivysettings.xml文件。
  3. 在项目的ivysettings.xml中使用环境变量来设置缓存目录。
  4. 以下是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。我没试过。