我们将使用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
与此同时?
在我看来,每次构建运行常春藤清理任务都是过度的,并且取消了使用常春藤,智能下载第三方依赖项的主要好处之一。
如上所述,如下所述Maven问题所述,所有缓存都会变脏,应定期清除:
什么时候删除本地Maven存储库是安全的?
几点建议:
使用专用的Jenkins作业清除常春藤缓存
我的第一个建议是创建一个定期的Jenkins作业,在你的构建中调用以下clean-all目标:
<target name="clean-all" depends="clean">
<ivy:cleancache/>
</target>
这可以确保Jenkins决定何时清除缓存,并且可以将其安排在正常构建时间之外(例如,每月1日凌晨2点)
使用多个缓存隔离每个项目
我的第二个建议增加了项目构建之间的隔离。使用。配置每个项目以拥有它自己的私有缓存 高速缓存 指示。在你常春藤设置文件中。
在我看来,每次构建运行常春藤清理任务都是过度的,并且取消了使用常春藤,智能下载第三方依赖项的主要好处之一。
如上所述,如下所述Maven问题所述,所有缓存都会变脏,应定期清除:
什么时候删除本地Maven存储库是安全的?
几点建议:
使用专用的Jenkins作业清除常春藤缓存
我的第一个建议是创建一个定期的Jenkins作业,在你的构建中调用以下clean-all目标:
<target name="clean-all" depends="clean">
<ivy:cleancache/>
</target>
这可以确保Jenkins决定何时清除缓存,并且可以将其安排在正常构建时间之外(例如,每月1日凌晨2点)
使用多个缓存隔离每个项目
我的第二个建议增加了项目构建之间的隔离。使用。配置每个项目以拥有它自己的私有缓存 高速缓存 指示。在你常春藤设置文件中。
这是我决定做的事情:
我修改了我的 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>
提交所有不同的方式,但它并不完全符合我的要求。
我正在做很多事情来解决你遇到的最后一个问题。
您可以将其添加到Jenkins Ant构建步骤的属性中
another.less.obtrusive.name=${EXECUTOR_NUMBER}
并添加到ivysettings.xml。
所以每个人都会“0”,除了詹金斯,因为它会把这个属性注入ANT。
关于主要问题的一些事情:
在詹金斯,我总是开始新的。 CI构建应该是健全的,彻底的。 Fast是受欢迎的副产品,但不是动力。