问题 Ivy,Ant,Jenkins - 在Jenkins构建中使用是不是一个好主意?


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

但是,我现在看到了 <ivy:cleancache> 不只是简单地清理东西 <ivy:cachepath>,但真的删除了整个 $HOME/.ivy/cache 目录。

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

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

事实上,当你这样做时会发生什么 <ivy:cachepath pathid="compile.path"/> 在多个项目?这也会影响詹金斯这样的事吗?如果多个构建正在构建,Jenkins会变得困惑 compile.cachepath 与此同时?


7068
2017-08-22 15:04


起源



答案:


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

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

什么时候删除本地Maven存储库是安全的?

几点建议:

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

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

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

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

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

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


7
2017-08-22 19:23



谢谢。清理缓存只会为构建添加大约90秒(我们有一个本地公司Maven存储库)。它不会影响 CI 因此,对于Jenkins来说,使用干净缓存启动每个构建都不会有什么坏处。开发人员可以通过将ivy.cleancache设置为false来关闭<ivy:cleancache>。具有讽刺意味的是,缓存清理会激怒开发人员,因为它会延长构建时间,但不会影响它们。詹金斯并不在乎,但如果詹金斯正在运行多个工作,那么这可能是一个问题。 - David W.


答案:


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

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

什么时候删除本地Maven存储库是安全的?

几点建议:

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

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

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

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

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

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


7
2017-08-22 19:23



谢谢。清理缓存只会为构建添加大约90秒(我们有一个本地公司Maven存储库)。它不会影响 CI 因此,对于Jenkins来说,使用干净缓存启动每个构建都不会有什么坏处。开发人员可以通过将ivy.cleancache设置为false来关闭<ivy:cleancache>。具有讽刺意味的是,缓存清理会激怒开发人员,因为它会延长构建时间,但不会影响它们。詹金斯并不在乎,但如果詹金斯正在运行多个工作,那么这可能是一个问题。 - David W.


这是我决定做的事情:

我修改了我的 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一次执行多个作业,则每个作业将使用不同的执行程序进行拾取,因此它将具有自己的缓存。如果一个工作想要清理缓存,它可以直接进行。
  • 我已经将解析缓存定义为 ${basedir}/target/ivy.cache。这为每个作业提供了自己的解析器缓存,这个缓存非常小。但是,如果詹金斯正在构建同一个常春藤项目的多个版本,这种方式常春藤解决不会干扰其他工作。

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

现在,开发人员有一个常春藤缓存,其中包含他们下载的所有罐子。通过这种方式,可以在项目之间共享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> 提交所有不同的方式,但它并不完全符合我的要求。


3
2017-08-22 21:23





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

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

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

并添加到ivysettings.xml。

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

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


2
2017-08-23 06:34



好主意。我所做的就是把它放在我的身上 ivy.tasks.xml 无论如何每个人都必须进口。我做了 <property environment="env"/> then right after that <property name =“env.EXECUTOR_NUMBER”value =“0”/>。然后,我做我的 <ivy:setting> 任务。无论如何我们必须导入环境,因为我要求我们的开发人员将Jenkins构建信息嵌入到jar,war和ear中。 - David W.
花了我更长的时间,我承认 - 这个答案中列出的'EXECUTOR'变量名拼写错误。应为$ {EXECUTOR_NUMBER} - Aaron C