我们将使用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会不会感到困惑?
答案 0 :(得分:7)
在我看来,每次构建运行常春藤清理任务都是过度的,并且不使用常春藤,智能下载第三方依赖项的主要好处之一。
如上所述Maven问题所述,所有缓存都会变脏,应该定期清除:
When is it safe to delete the local Maven repository?
一些建议:
我的第一个建议是创建一个定期的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>
这有两件事:
$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是受欢迎的副产品,但不是动力。