¿Es posible en Maven configurar diferentes repositorios locales para artefactos SNAPSHOT y RELEASE?

La razón por la que pregunto es que estamos usando Jenkins para la compilación continua de nuestro proyecto. Para garantizar la coherencia (si el mismo artefacto se crea a partir de diferentes trabajos de Jenkins debido a una condición de carrera, podemos experimentar un comportamiento caótico) antes del inicio de la compilación, creamos un repositorio local nuevo para Jenkins.

Ahora, el problema es que nuestro proyecto es enorme, por lo que para cada compilación tenemos que descargar muchas dependencias de nuestro Nexus, pero cuando lo piensas, no hay razón para descargar cada vez nuevos artefactos RELEASE. Los artefactos RELEASE no cambian de una compilación a otra, por ejemplo, Spring 4.5, httpclient 4.0, aspectj 1.8.1 es el mismo para una compilación a otra.

Entonces, en realidad, para garantizar la coherencia, solo no deberíamos tener las dependencias SNAPSHOT en el repositorio. Si pudiéramos tener dos repositorios locales, uno para los artefactos RELEASE y el otro para los SNAPSHOT, entonces antes de que comience cada compilación, podríamos eliminar el repositorio SNAPSHOT pero reutilizar el repositorio RELEASE local, lo que me ahorraría gigabytes de descarga de Nexus.

Sé que podemos hacer configuraciones RELEASE, SNAPSHOT para repositorios remotos, ¿es posible hacer el mismo tipo de configuración para repositorios locales?

Si esto no es posible, ¿cómo resolvería este problema?

4
posthumecaver 12 ene. 2017 a las 13:03
Debe usar repositorios separados para la instantánea y el lanzamiento, la configuración de pom se explica aquí stackoverflow.com/questions/14211697/…
 – 
Essex Boy
12 ene. 2017 a las 13:18
Lo que se explica en este artículo son los repositorios remotos (se discute sobre la implementación en Nexus). Esto no es lo que quiero, quiero definir dos repositorios locales, uno para SNAPSHOT y otro para lanzamientos. Así es como se configuró en settings.xml " c: \ repo ". Me gusta tener algo como " c: \ repo_snap " y " c: \ repo_rel " o una forma de producir un efecto similar.
 – 
posthumecaver
12 ene. 2017 a las 13:36
Lo siento, he entendido mal, he agregado una respuesta, no debe hacer esto.
 – 
Essex Boy
12 ene. 2017 a las 13:55

2 respuestas

Su Jenkins tendrá una instalación maven local, que a su vez tendrá un repositorio local, esto debería ser el mismo para SNAPSHOT y RELEASE.

Una vez que se ha descargado una dependencia de Nexus, se almacenará localmente y no se volverá a descargar, esto funcionará.

Por lo tanto, solo debe tener una gran descarga de Nexus la primera vez que cree su proyecto.

0
Essex Boy 12 ene. 2017 a las 13:55
Es importante configurar jenkins para almacenar el caché de maven en el espacio de trabajo del trabajo, lo que garantiza que cada trabajo se pueda ejecutar de forma independiente entre sí ...
 – 
khmarbaise
12 ene. 2017 a las 22:01
Cada trabajo tendrá dependencias que son únicas en virtud de su GAV. Estarán en el repositorio local al que se accede muy rápido. El repositorio local es efectivamente un caché para todos los trabajos. Siempre configuro Jenkins para limpiar el espacio de trabajo en cada compilación, ya que he tenido problemas en el pasado.
 – 
Essex Boy
13 ene. 2017 a las 10:53
Si está utilizando un caché para todos los trabajos, sus trabajos tienen un posible problema de concurrencia, porque el caché de maven no está diseñado para ser accedido por trabajos simultáneos en paralelo ... Además, el contenido del caché puede influir en todos sus trabajos. .en particular si lo hace mvn install / mvn deploy ... Tengo mis dudas de que sus problemas se basen en mvn clean (suponiendo que use complementos antiguos, etc.) o no ... supongo que tiene problemas en su compilación de maven, lo que significa algún otro problema ... Entonces, siguiendo esta ruta, sus compilaciones no son autónomas y no pueden ejecutarse en otro nodo, etc.
 – 
khmarbaise
13 ene. 2017 a las 14:43

Actualmente no hay forma de lograr esto, y sí, estoy de acuerdo con el sentimiento.

Una versión razonablemente reciente del complemento Maven de Jenkins le permite especificar un repositorio local personalizado sin tener que editar un archivo settings.xml; la opción está allí mismo en la pantalla de definición del trabajo (en la sección Advanced, seleccione Use private Maven repository).

Entonces, lo que haría es usar esta opción y preceder al paso de compilación de Maven con un script que borra todos los directorios, en el repositorio privado local, que terminan en -SNAPSHOT.

Es repulsivo, pero no puedo pensar en otra forma.

0
Isaac 22 may. 2020 a las 18:37