2008-09-28 15 views
5

Tenemos una gran base de código que demora aproximadamente 12 minutos en las máquinas de desarrollo para autogenerar algunas clases de Java 5 utilizando JavaCC y compila todo el clases, así como ejecutar la prueba de unidades.Consejos para acelerar el tiempo de compilación en Linux usando ANT, Javacc, JUnit y compilación de clases Java

El proyecto consta de varios proyectos que se pueden construir en grupos, pero nuestro objetivo es llegar a un una construcción completa en menos de 10 minutos

Qué hay consejos para reducir el tiempo de construcción?

Gracias

+0

Si he entendido bien, usted' Re objetivo para una construcción limpia (es decir, desde cero) para tomar menos de 10 minutos. Sin embargo, ¿por qué necesita realizar una reconstrucción completa con tanta frecuencia? Solo curiosidad aquí. – Alexander

+0

Es parte de nuestro proceso. Tratamos de mantener una compilación de trabajo constante de código comprometido. Tenemos un servidor de compilación que se construye constantemente cuando se comete un nuevo código. Además, la mayoría de los desarrolladores en nuestro lugar ejecutan una compilación completa de su código antes de registrarse. Aquellos que no corren el riesgo de romper la compilación. –

+0

En mi experiencia, tiene problemas con la política de ejecutar una compilación/prueba completa antes de cada confirmación. Esto evitará que los desarrolladores realicen confirmaciones más detalladas. Por no mencionar la molestia en la que has esperado durante 12 minutos, y luego descubriste que se han producido más compromisos mientras tanto. – Alexander

Respuesta

3

Una solución rápida que podría afeitarse algo de tiempo libre es para asegurarse de que está ejecutando la JVM utilizando Ant servidor (por defecto se utiliza el cliente VM). Establezca ANT_OPTS para incluir "-servidor".

+0

¿Esto acelerará los tiempos en una máquina de escritorio y en el servidor? –

+0

Sí, esto simplemente cambia la forma en que el JIT optimiza el bytecode cuando se ejecuta Ant. – Alexander

+0

En Windows tiré alrededor de un minuto de una construcción de 6 minutos con este interruptor. –

2
  • Perfile el proceso de construcción y vea dónde están los cuellos de botella. Esto puede darte algunas ideas sobre cómo mejorar el proceso.
  • Intente crear proyectos independientes en paralelo en máquinas multi-core/CPU. Como una extensión de esta idea, es posible que desee buscar un equivalente en Java de distcc (no sé si existe) para distribuir su construcción en varias máquinas.
  • Consigue mejores máquinas.
+0

"Obtener mejores máquinas". todos hemos convertido recientemente a Linux ya que los tiempos de construcción pasaron de aproximadamente 40 minutos a aproximadamente 12 minutos. –

+0

"Intente crear proyectos independientes en paralelo en máquinas multi-core/CPU." La mayoría de ellos están en máquinas de doble núcleo y tenemos un proceso de compilación paralelo que es ligeramente más rápido que la versión normal –

0

Esto probablemente no ayude a muy corto plazo, pero pensé que debería tirarlo allí de todos modos.

Si su proyecto se puede dividir en proyectos más pequeños (un subsistema de base de datos, el registro, como ejemplos), puede estar interesado en utilizar algo como maven para manejar la compilación. Puede ejecutar cada mordida más pequeña como un proyecto o módulo por separado, y maven podrá mantener lo que debe construirse si existen cambios. En esto, la construcción puede enfocarse en la parte principal de su proyecto y no tomará tanto tiempo.

0

Cuál es el desglose en el tiempo pasado:

  1. generar las clases
  2. compilar las clases
  3. ejecutar las pruebas

función de su proyecto, es posible que vea un aumento significativo en construya el tiempo asignando un tamaño de montón más grande a javac (memoryMaximumSize) y junit (maxmemory).

1

Intenta ser inspirado por un programador pragmático. Compile solo lo que es necesario, tenga dos o más suites de prueba. Uno para pruebas rápidas, otro para pruebas completas. Considere si hay una necesidad real de usar cada paso de construcción cada vez. Es necesario intentar usar el compilador jikes en lugar de javac. Después de que el proyecto abarca varios cientos de clases, cambio a jikes para mejorar la velocidad. Pero tenga en cuenta los posibles problemas de incompatibilidad. No olvide incluir un objetivo todo en uno para realizar cada paso con la reconstrucción completa y la prueba completa del proyecto.

1

Ahora que ha explicado el proceso con más detalle, aquí hay dos opciones más:

  1. Una máquina/racimo dedicado donde la acumulación se realiza mucho más rápido que en una estación de trabajo normal. Luego, antes de una confirmación, los desarrolladores ejecutarían un script que construye su código en la máquina/clúster dedicado.

  2. Cambie la partición en subproyectos para que sea más difícil romper un proyecto modificando otro. Esto debería hacer que sea menos importante hacer una compilación completa antes de cada commit. Solo los compromisos que están en contacto con subproyectos sensibles, o aquellos que abarcan múltiples proyectos, necesitarán ser "controlados" mediante una compilación completa.

0

¿Es muy importante que la acumulación toda dura menos de 10 minutos? Si hace que los subproyectos sean independientes entre sí, podría trabajar en un subproyecto mientras ya ha compilado los otros (piense en Maven o Ivy para administrar las dependencias).

Otra solución (y si sus módulos son razonablemente estables) es tratar sus subproyectos como proyectos independientes. Cada proyecto seguiría su propio ciclo de publicación y estaría disponible en un repositorio Maven/Ivy local. Por supuesto, esto funciona bien si al menos partes del proyecto son razonablemente estables.

1

algunos consejos para reducir el tiempo de construcción:

  1. hacer menos trabajo. p. eliminar la tala innecesaria/eco a los archivos y consola

  2. hacer su acumulación 'gradual'. La compilación solo cambia las clases.

  3. eliminan el esfuerzo duplicado. Es más fácil decirlo que hacerlo, pero si ejecuta la compilación en modo de depuración ("ant -debug"), a veces puede ver tareas o destinos redundantes.

  4. evite costosas operaciones. copia de archivos, y el embalaje de los frascos en las guerras son necesarias para release.Signing frascos es caro y sólo se debería hacer, si es posible 'para Milestone comunicados en lugar de construir cada

Cuestiones relacionadas