11

我们将在 Ant 中使用 Ivy,并让 Jenkins 进行构建。我最初认为让 Jenkins<ivy:cleancache/>在运行构建之前做一个是个好主意。(这将是强制性“干净”目标的一部分)。

但是,我现在看到这<ivy:cleancache>并不仅仅是从 中清除内容<ivy:cachepath>,而是真正删除了整个$HOME/.ivy/cache目录。

我担心的是,如果 Jenkins<ivy:cleancache>在开始之前对所有构建进行了操作,它将干扰 Jenkins 可能正在执行的其他构建。

<ivy:cleancache>一个好主意,特别是如果单个用户可能同时进行多个构建?

实际上,当您<ivy:cachepath pathid="compile.path"/>在多个项目中执行 a 时会发生什么?这也会影响像詹金斯这样的东西吗?如果多个构建同时构建,詹金斯会感到困惑compile.cachepath吗?

4

3 回答 3

7

在我看来,每次构建都运行 ivy cleancache 任务是多余的,并且消除了使用 ivy 的主要好处之一,即智能下载 3rd 方依赖项。

话虽如此,如以下相关 Maven 问题中所述,所有缓存都可能变脏,应定期清除:

什么时候可以安全地删除本地 Maven 存储库?

几个建议:

使用专门的 Jenkins 作业清除 ivy 缓存

我的第一个建议是创建一个定期 Jenkins 作业,在您的构建中调用以下 clean-all 目标:

<target name="clean-all" depends="clean">
   <ivy:cleancache/>
</target>

这可确保 Jenkins 决定何时清除缓存,并且您可以将其安排在正常构建时间之外(例如每月 1 日凌晨 2 点)

使用多个缓存隔离每个项目

我的第二个建议增加了项目构建之间的隔离。使用caches指令将每个项目配置为拥有自己的私有缓存。在你的常春藤设置文件中。

于 2012-08-22T19:23:49.060 回答
3

这是我决定做的事情:

我已修改我的ivysettings.xml文件以具有以下内容:

<ivysettings>
    <properties environment="env." override="false"/>
    <caches
        defaultCacheDir="${ivy.default.ivy.user.dir}/cache-${env.EXECUTOR_NUMBER}"
        resolutionCacheDir="${ivy.dir}/../target/ivy.cache"/>
    <settings defaultResolver="default"/>
    <include file="${ivy.dir}/ivysettings-public.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
</ivysettings>

这做了两件事:

  • 它将 Ivy 本地缓存定义为Jenkins 执行程序的$HOME/.ivy/cache-$EXECUTOR_NUMBER位置。$EXECUTOR_NUMBER这意味着每个执行器都有自己的 Ivy 缓存。因此,如果 Jenkins 一次执行多个作业,则每个作业将由不同的执行器拾取,因此它将有自己的缓存。如果一个作业想要清理缓存,它可以直接进行。
  • 我已将解析缓存定义为${basedir}/target/ivy.cache. 这为每个作业提供了自己的解析器缓存,该缓存非常小。但是,如果 Jenkins 正在构建同一个 Ivy 项目的多个修订版,则这种方式 ivy 解析不会干扰其他工作。

唯一的缺点是调用了用户的默认缓存目录,$HOME/.ivy/cache-$env.EXECUTOR_NUMBER这不是一个漂亮的站点。我想让它更合理$HOME/.ivy/cache-0,但我还没有弄清楚。但是,它在这一点上并没有真正影响任何事情。

现在,开发人员拥有一个 Ivy 缓存,其中包含他们下载的所有 jar。这样,可以在项目之间共享 jar,从而加快开发人员的速度。

同时,Jenkins 可以按照配置的频率清理 Ivy 缓存。这可以针对每项工作进行,或者每天或每月一次。但是,由于缓存是按执行程序完成的,因此当另一个作业(将在另一个执行程序上运行)取决于该缓存时,我不会遇到缓存被清理的问题。

这应该解决所有特定问题。我唯一想做的就是弄清楚如何设置一个默认的 EXECUTOR_NUMBER 变量(如果尚未设置)。我已经尝试过这样的各种事情:

<ivysettings>
    <property name="env.EXECUTOR_NUMBER" value="0" override="false"/>
    <properties environment="env." override="false"/>
    <caches
        defaultCacheDir="${ivy.default.ivy.user.dir}/cache-${env.EXECUTOR_NUMBER}"
        resolutionCacheDir="${ivy.dir}/../target/ivy.cache"/>
    <settings defaultResolver="default"/>
    <include file="${ivy.dir}/ivysettings-public.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
</ivysettings>

但是,无济于事。我确实以不同的方式更改了和文件override上的参数,但它并没有完全达到我想要的效果。<property><properties>

于 2012-08-22T21:23:54.487 回答
2

只是我一直在做很多事情来解决你遇到的最后一个问题。

您可以将此添加到 Jenkins Ant Build Steps 的属性中

another.less.obtrusive.name=${EXECUTOR_NUMBER}

并添加到 ivysettings.xml。

因此,除了 Jenkins 之外,每个人都将是“0”,因为它会将这个属性注入 ANT。

关于主要问题的一些事情:关于詹金斯,我总是从新开始。CI 构建应该是健壮的、彻底的。快速是受欢迎的副产品,但不是动力。

于 2012-08-23T06:34:06.290 回答