¿Qué significa "compilación automatizada"?

15

Estoy tratando de agregar integración continua a un proyecto.

Según Wikipedia , una pieza importante de CI son las compilaciones automatizadas. Sin embargo, estoy confundido sobre qué significa exactamente eso, ya que los artículos de automatización de CI y compilación parecen estar en desacuerdo.

Puntos específicos de confusión: qué significa "compilación automatizada" en el contexto de:

  • Un proyecto que utiliza un lenguaje interpretado, como Python o Perl?
  • construyendo desde la fuente en la máquina de un usuario final?
  • ¿Una aplicación que tiene dependencias que no se pueden simplemente precompilar y distribuir, como una base de datos en un RDBMS local para la máquina del usuario?

fuente
2
He etiquetado con ambos buildsy buildporque no sabía cuál usar.

Respuestas:

14

Tiene razón al señalar que, para algunas tecnologías, no es necesario un paso de compilación. Sin embargo, le recomiendo que tenga una visión más amplia al interpretar el término "automatización de compilación". Piense que "compilar" incluye los siguientes dos componentes principales:

  • El proceso para los artefactos de origen de transformación (código, esquema de base de datos, documentación, etc.) implementado en un usuario final.
  • La aplicación de medidas de aseguramiento de la calidad durante dicha transformación.

La automatización, entonces, simplemente se refiere a hacer que cualquiera de esas operaciones, si no todas, sea automática (es decir, que no requiere intervención manual). Esto puede incluir una gran variedad de pasos, dependiendo de su tecnología:

Pasos de transformación:

  • Compilacion
  • Enlace
  • embalaje
  • Despliegue
  • Migración de datos
  • Apoyo
  • Notificación

Pasos de garantía de calidad:

  • Advertencias / errores del compilador
  • Pruebas unitarias
  • Pruebas de integración
  • Pruebas del sistema
  • Autenticación de implementación

En estos días, las buenas herramientas de CI le permitirán abordar todas estas inquietudes. Inicialmente, la mayoría de las tiendas están interesadas en automatizar la compilación de su código, ya que esa es la primera y más visible fuente de problemas en el desarrollo de software convencional.

Stephen Gross
fuente
21

Una compilación automatizada es una descripción de un proceso que debe cubrir los siguientes conceptos básicos:

  1. Obtenga el último código del control de origen
  2. Compila el último código en el ejecutable
  3. Ejecute pruebas (pruebas unitarias, pruebas del sistema, pruebas de integración) contra el código compilado
  4. Implemente el ejecutable completado en una ubicación conocida para la implementación.
  5. Publicar los resultados de la compilación.
    5.1 Recopilación exitosa, prueba de unidad exitosa

Es un proceso de no intervención que debe ejecutarse sin intervención manual.

Sheldon Warkentin
fuente
3
Como se le preguntó explícitamente, puede mencionar que los pasos que no se aplican son opcionales. Por ejemplo, si su aplicación es un montón de scripts de Python, el paso 2 podría no ser nada, o podría ser algo tan simple como comprimir el código en un solo archivo. Es perfectamente aceptable no tener un paso de compilación.
Bryan Oakley
@BryanOakley Eso es justo. El equivalente a no tener una compilación de scripts puede ser asegurarse de que todas sus dependencias, si las tiene, se hayan reunido correctamente en este punto. Por ejemplo, cualquier biblioteca adicional de terceros requerida por su script Python debe incluirse para que se incluya en todos los pasos siguientes. Supongo que esto también es innecesario si se sabe que el destino y la máquina de compilación siempre tienen todas las bibliotecas necesarias.
Sheldon Warkentin
2

En mi opinión, una compilación automatizada es algo que

  • sucede automáticamente, ya sea en un horario o con cada confirmación para el control de origen
  • crea un conjunto de artefactos que se pueden implementar simplemente en cualquier servidor

El objetivo es tener un proceso de implementación que se pueda repetir, leer: probar, para que cuando se implemente en producción, tenga un cierto grado de certeza de que las cosas no saldrán mal. Cuanta menos interacción humana en los procesos de compilación e implementación, más segura será su versión.

Si tiene un lenguaje no compilado, aún puede construir un sitio y comprimirlo para crear un solo artefacto.

Una buena herramienta de CI le permitirá ejecutar muchas tareas en el proceso de compilación, incluida la ejecución de pruebas unitarias. También mantendrá registros de sus compilaciones exitosas y no exitosas, cobertura de prueba, etc. Pero nada de eso es parte de lo que yo definiría como una compilación automatizada. (es decir, un buen proceso de compilación automatizado tiene estas cosas, pero uno pobre no deja de llamarse "compilación automatizada" porque carece de esas cosas).

Sugeriría que las pruebas de integración / regresión se ejecuten como parte del proceso de implementación, en lugar del proceso de compilación (aunque, si tiene un entorno conveniente, puede implementar con cada compilación).

pdr
fuente
También puede ser útil tener una compilación programada y permitir a los desarrolladores iniciar una compilación automatizada con una sola acción (si son dos acciones, en realidad no es automatizada, ¿verdad?) En nuestro caso, la compilación para algunos sistemas también lo es. anhelan el inicio de cada commit, por lo que está programado y a pedido.
David Thornley
@DavidThornley: Sí. Eso es útil La mayoría de las herramientas de CI le permiten iniciar una compilación fuera de su horario establecido. Pero, de nuevo, no deja de ser una compilación automatizada porque esta opción no está allí. Dejaría de ser una compilación automatizada si un desarrollador siempre tuviera que activarla.
pdr
1
a project using an interpreted language, such as Python or Perl?

En el caso de los idiomas interpretados, las cosas pueden ser impredecibles. Algunos idiomas interpenetrados tienen compiladores, pero la mayoría de las veces no es necesario usarlos. En ese caso, generalmente solo escanearía el código en busca de errores de sintaxis y análisis en lugar de compilación o pasaría directamente a ejecutar las pruebas en el código.

construyendo desde la fuente en la máquina de un usuario final?

Para mí, esto significaría que puede proporcionar un solo comando que los usuarios finales pueden ejecutar para obtener la última versión del programa, compilarlo, configurarlo e implementarlo según sea necesario.

¿Una aplicación que tiene dependencias que no se pueden simplemente precompilar y distribuir, como una base de datos en un RDBMS local para la máquina del usuario?

Estos se incluirían en la parte de prueba de la integración continua, ya que puede destruir y reconstruir automáticamente las bases de datos para garantizar que las secuencias de comandos sean correctas y que el programa las pruebe correctamente.

rjzii
fuente
1

Lo que está discutiendo en su pregunta son en realidad 3 conceptos diferentes:

La integración continua en su núcleo está haciendo pequeños cambios y sincronizando con frecuencia esos cambios con la "verdad global". En lugar de hacer un pago y retenerlo durante una semana, un desarrollador debe trabajar en tareas que se pueden completar en un día para que su código nunca esté demasiado sincronizado con el repositorio principal.

Para lograr esto sin causarle dolor a su equipo (es decir, verificar la fuente que no construye o rompe la funcionalidad existente). El desarrollador tiene que verificar que su código no "rompa la compilación". Si se hace de forma manual, esto agrega una sobrecarga adicional al proceso de desarrollo (piense en un proyecto que demore mucho tiempo en crearse y / o tenga muchas interdependencias en las que un cambio en una línea de código puede afectar la aplicación de maneras inesperadas).

Para mitigar esta situación, utilizamos otras técnicas para eliminar esta sobrecarga.

Utilizamos compilaciones automatizadas para verificar el origen y compilarlo, opcionalmente, ejecutando pruebas automatizadas que verifican que la aplicación funcione como debería (este paso es tan útil como el conjunto de pruebas).

Un paso más en la entrega continua aborda su problema con la base de datos y otras inquietudes. La idea aquí es proporcionar cierto nivel de versiones para la base de datos y otros factores del entorno para que podamos confirmar lo más rápido posible que la aplicación funciona en un entorno lo más cercano posible a la producción .

Michael Brown
fuente
1
Grandes puntos ... es una pena que la mayoría de la gente no lea hasta el final del hilo y vote.
hotshot309
0

"Compilación automatizada" significa que puede pasar del control de origen a un paquete que se puede enviar con una acción (programable) (generalmente un script de shell o un archivo por lotes).

Lo que constituye exactamente una compilación, en este contexto, depende mucho de qué es exactamente lo que está enviando, cómo se entrega y qué pasos son necesarios para las diversas partes de su pila de desarrollo, pero en cualquier caso, comienza con qué hay en el control de origen, y terminas con un producto que se puede enviar (o un mensaje de error y un gerente de proyecto enojado).

Para un proyecto simple de Python, una compilación automatizada puede consistir en solo dos pasos: verificar las fuentes y copiar los archivos relevantes en los directorios correctos. Para proyectos más complejos, puede involucrar cosas como:

  • compilar, vincular
  • ejecutar pruebas automatizadas
  • crear paquetes de instalador
  • instalando
  • modificar bases de datos
  • crear copias de seguridad (en caso de que necesite retroceder)
tdammers
fuente