Ivy,Ant,Jenkins - 在Jenkins构建中使用<ivy:cleancache>是个好主意吗?</ivy:cleancache>

时间:2012-08-22 15:04:18

标签: ant jenkins ivy

我们将使用Ivy和Ant,我们将让Jenkins做我们的构建。我原本以为让Jenkins在运行构建之前做<ivy:cleancache/>会是一个好主意。 (这将是强制性“清洁”目标的一部分。)

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

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

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

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

3 个答案:

答案 0 :(得分:7)

在我看来,每次构建运行常春藤清理任务都是过度的,并且不使用常春藤,智能下载第三方依赖项的主要好处之一。

如上所述Maven问题所述,所有缓存都会变脏,应该定期清除:

When is it safe to delete the local Maven repository?

一些建议:

使用专用的Jenkins作业清除常春藤缓存

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

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

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

使用多个缓存

隔离每个项目

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

答案 1 :(得分: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本地缓存定义为$HOME/.ivy/cache-$EXECUTOR_NUMBER,其中$EXECUTOR_NUMBER是Jenkins执行程序。这意味着每个执行程序都有自己的常春藤缓存。因此,如果Jenkins一次执行多个作业,则每个作业将使用不同的执行程序获取,因此它将具有自己的缓存。如果一个工作要清理缓存,它就可以直接进入。
  • 我已将解析缓存定义为${basedir}/target/ivy.cache。这为每个作业提供了自己的解析器缓存,这个缓存非常小。但是,如果詹金斯正在构建同一个常春藤项目的多个修订版,那么常春藤解决方案不会干扰其他工作。

唯一的缺点是用户的默认缓存目录称为$HOME/.ivy/cache-$env.EXECUTOR_NUMBER,它不是一个漂亮的站点。我希望能让它更合理$HOME/.ivy/cache-0,但我还没想出来。但是,此时它并没有真正影响任何事情。

现在,开发人员有一个常春藤缓存,其中包含他们下载的所有jar。通过这种方式,可以在项目之间共享jar,从而加快开发人员的工作速度。

与此同时,Jenkins可以像配置一样经常清理常春藤缓存。这可以针对每项工作完成,也可以每天一次或每月完成一次。但是,由于缓存是按执行程序完成的,因此我不会遇到正在清理缓存的问题,而另一个作业(将在另一个执行程序上运行)依赖于该缓存。

这应解决所有特定问题。我唯一想做的是弄清楚如果尚未设置默认的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>参数,但它并不能完全符合我的要求。

答案 2 :(得分:2)

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

您可以将其添加到Jenkins Ant构建步骤的属性

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

并添加到ivysettings.xml。

所以每个人都会为“0”,除了詹金斯,因为它会把这个属性注入ANT。

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