Aquí es lo que he decidido hacer:
He modificado mi archivo ivysettings.xml
a tener la siguiente:
<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>
Esto hace dos cosas:
- Se define el Ivy local cache como
$HOME/.ivy/cache-$EXECUTOR_NUMBER
donde $EXECUTOR_NUMBER
es el ejecutor de Jenkins. Esto significa que cada ejecutor obtiene su propio caché Ivy. Por lo tanto, si Jenkins está ejecutando más de un trabajo a la vez, cada trabajo será recogido con un ejecutor diferente, por lo que tendrá su propio caché. Si un trabajo quiere limpiar el caché, puede seguir adelante.
- He definido el caché de resolución en
${basedir}/target/ivy.cache
. Esto le da a cada trabajo su propia caché de resolución que es bastante pequeña. Pero, de esta forma, la resolución de la hiedra no interfiere con otros trabajos si Jenkins está creando múltiples revisiones del mismo proyecto de Ivy.
El único inconveniente es que el directorio de caché predeterminado del usuario se llama $HOME/.ivy/cache-$env.EXECUTOR_NUMBER
que no es un sitio bonito. Me encantaría que sea más razonable $HOME/.ivy/cache-0
, pero no me he dado cuenta. Sin embargo, realmente no afecta nada en este punto.
Ahora, un desarrollador tiene un solo caché Ivy que contiene todos los frascos que ha descargado. De esta forma, los archivos jar se pueden compartir entre proyectos, lo que acelera las cosas para los desarrolladores.
Mientras tanto, Jenkins puede limpiar el caché Ivy con la frecuencia que está configurado. Esto podría hacerse para cada trabajo, o una vez por día o por mes. Sin embargo, dado que la caché se realiza por ejecutor, no tendré un problema con la limpieza de la caché, mientras que otra tarea (que se estaría ejecutando en otro ejecutor) dependerá de esa caché.
Esto debería resolver todos los problemas particulares. Lo único que me gustaría hacer es averiguar cómo establecer una variable predeterminada EJECUTOR_NUMBER si aún no se ha configurado. He intentado varias cosas como esta:
<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>
Pero, en vano. He cumplido con cambiar los parámetros override
tanto en el archivo <property>
como en el archivo <properties>
de diferentes formas, pero no hace exactamente lo que quiero.
Gracias. Limpiar la caché solo agrega unos 90 segundos a la compilación (tenemos un repositorio Maven de la compañía local). No afecta el concepto _CI_, por lo que no le haría daño a Jenkins comenzar cada compilación con un caché limpio. Los desarrolladores pueden cerrar configurando ivy.cleancache en false. Irónicamente, la limpieza del caché irrita a los desarrolladores porque alarga la construcción, pero no los afecta. A Jenkins no le importa, pero si Jenkins está ejecutando múltiples trabajos, puede ser un problema. –