continuous integration - tools - ¿Cuál es el sentido de un "servidor de compilación"?
continuous integration tools (18)
Además, recuerde que los idiomas de bajo nivel tardan mucho más en compilarse que los lenguajes de alto nivel. Es fácil pensar "Bueno, mira, mi proyecto .Net se compila en un par de segundos. ¿Cuál es el problema?" Hace un tiempo tuve que meterme con un código C y había olvidado cuánto tiempo más lleva compilar.
No he trabajado para organizaciones muy grandes y nunca he trabajado para una empresa que tenía un "servidor de compilación".
¿Cuál es su propósito? ¿Por qué los desarrolladores no están construyendo el proyecto en sus máquinas locales, o no? ¿Son algunos proyectos tan grandes que se necesitan máquinas más potentes para construirlo en un tiempo razonable?
El único lugar donde veo que un Build Server es útil es para la integración continua con el servidor de compilación, desarrollando constantemente lo que está comprometido con el repositorio. ¿Acaso no he trabajado en proyectos lo suficientemente grandes?
Alguien, por favor ilumíname: ¿Cuál es el propósito de un servidor de compilación?
El servidor de compilación se usa para compilar el código de todos cuando se registra. Su código puede compilarse localmente, pero lo más probable es que no tenga todo el cambio realizado por todos los demás todo el tiempo.
Es necesario tener un entorno "limpio" libre de artefactos de versiones anteriores (y cambios de configuración) para garantizar que las construcciones y las pruebas funcionen y no dependan de los artefactos. Una forma efectiva de aislar es crear un servidor de compilación separado.
Estas máquinas se utilizan por varias razones, todas tratando de ayudarlo a proporcionar un producto superior.
Un uso es simular una configuración típica de usuario final. El producto podría funcionar en su computadora, con todas sus herramientas de desarrollo y bibliotecas configuradas, pero es probable que el usuario final no tenga la misma configuración que usted. Para el caso, otros desarrolladores tampoco tendrán la misma configuración que tú. Si tiene una ruta codificada en algún lugar de su código, probablemente funcione en su máquina, pero cuando Dev El O''per intente construir el mismo código, no funcionará.
También se pueden usar para controlar quién rompió el producto por última vez, con qué actualización y en dónde regresó el producto. Cada vez que se ingresa un código nuevo, el servidor de compilación lo construye, y si falla, es claro que algo está mal y el usuario que cometió el último es el culpable.
Estoy de acuerdo con las respuestas hasta ahora con respecto a la estabilidad, trazabilidad y reproducibilidad. (Montones de ''ity''s, ¿verdad?). Habiendo trabajado SOLAMENTE alguna vez para grandes compañías (Health Care, Finance) con muchos servidores de compilación, agregaría que también se trata de seguridad. ¿Has visto alguna vez la película Office Space? Si un desarrollador descontento construye una aplicación bancaria en su máquina local y nadie más lo mira o lo prueba ... BOOM. Superman III.
La razón dada es en realidad un gran beneficio. Las compilaciones que van a QA solo deberían provenir de un sistema que solo crea desde el repositorio. De esta forma, los paquetes de compilación son reproducibles y trazables. Los desarrolladores que crean código manualmente para cualquier cosa, excepto sus propias pruebas, son peligrosos. Demasiado riesgo de que las cosas no se comprueben, estén desactualizadas con los cambios de otras personas, etc., etc.
Los servidores de compilación son importantes por varias razones.
Aíslan el entorno El desarrollador local de Code Monkey dice "Compila en mi máquina" cuando no compilará en el suyo. Esto puede significar check-ins fuera de sincronización o podría significar que falta una biblioteca dependiente. Jar infierno no es tan malo como el infierno. De cualquier forma, usar un servidor de compilación es un seguro barato de que sus compilaciones no fallarán misteriosamente o empaquetarán las bibliotecas incorrectas por error.
Ellos enfocan las tareas asociadas con las construcciones. Esto incluye actualizar la etiqueta de compilación, crear cualquier paquete de distribución, ejecutar pruebas automatizadas, crear y distribuir informes de compilación. La automatización es la clave.
Coordinan el desarrollo (distribuido). El caso estándar es donde varios desarrolladores trabajan en la misma base de código. El sistema de control de versiones es el corazón de este tipo de desarrollo distribuido, pero dependiendo de la herramienta, los desarrolladores pueden no interactuar mucho con el código de los demás. En lugar de obligar a los desarrolladores a arriesgar construcciones erróneas o preocuparse por fusionar el código de manera demasiado agresiva, diseñe el proceso de compilación donde la compilación automatizada pueda ver el código apropiado y procese los artefactos de construcción de una manera predecible. De esta forma, cuando un desarrollador comete algo con un problema, como no verificar una nueva dependencia de archivos, se le puede notificar rápidamente. Al hacer esto en un área por etapas, puedes marcar el código que se ha creado para que los desarrolladores no extraigan el código que rompería su compilación local. PVCS hizo esto bastante bien utilizando la idea de grupos de promoción. Clearcase también podría hacerlo usando etiquetas, pero requeriría más administración de procesos de lo que muchas tiendas se preocupan por proporcionar.
Para agregar lo que ya se ha dicho:
Un ex colega trabajó en el equipo de Microsoft Office y me dijo que una compilación completa a veces tardaba 9 horas. Eso sería una mierda para hacerlo en SU máquina, ¿no es así?
Para obtener una calidad uniforme y obtener la compilación "fuera de su equipo" para detectar errores de entorno y para que los archivos que se olvide de controlar en el control de origen también se muestren como errores de compilación.
También lo uso para crear instaladores, ya que estos toman mucho tiempo en el escritorio con la firma de código, etc.
Se trata de gestión y pruebas para nosotros. Con un servidor de compilación siempre sabemos que podemos construir nuestra línea principal "troncal" desde el control de versiones. Podemos crear una instalación maestra con un solo clic y publicarla en la web. Podemos ejecutar todas nuestras pruebas unitarias cada vez que ingresemos el código para asegurarnos de que funciona. Al recopilar todas estas tareas en una sola máquina, es más fácil hacerlo bien varias veces.
Tal vez soy el único ...
Creo que todos están de acuerdo en que uno debería
- usa un repositorio de archivos
- hacer compilaciones desde el repositorio (y en un entorno limpio)
- utilice un servidor de prueba continuo (por ejemplo, control de crucero) para ver si algo se rompe después de sus "correcciones"
Pero a nadie le importan las versiones creadas automáticamente. Cuando algo se rompió en una construcción automática, pero ya no es así, ¿a quién le importa? Es un trabajo en progreso. Alguien lo solucionó.
Cuando quiere hacer una versión de lanzamiento, ejecuta una compilación desde el repositorio. Y estoy bastante seguro de que quiere etiquetar la versión en el repositorio en ese momento y no cada seis horas cuando el servidor lo hace.
Entonces, tal vez un "servidor de compilación" es simplemente un nombre inapropiado y en realidad es un "servidor de prueba continuo". De lo contrario, suena bastante inútil.
Tiene razón en que los desarrolladores pueden construir en sus propias máquinas.
Pero estas son algunas de las cosas que nuestro servidor de compilación nos compra, y nosotros no somos fabricantes sofisticados de compilación:
- Problemas de control de versiones (algunos han sido mencionados en respuestas anteriores)
- Eficiencia. Los desarrolladores no tienen que detenerse para hacer construcciones localmente. Pueden iniciarlo en el servidor y pasar a la siguiente tarea. Si las construcciones son grandes, es aún más tiempo que la máquina del dev no está ocupada. Para aquellos que realizan una integración continua y pruebas automatizadas, aún mejor.
- Centralización. Nuestra máquina de creación tiene scripts que hacen la compilación, la distribuyen a los entornos UAT e incluso a la etapa de producción. Mantenerlos en un solo lugar reduce la molestia de mantenerlos sincronizados.
- Seguridad. No hacemos mucho especial aquí, pero estoy seguro de que un administrador de sistemas puede hacer que las herramientas de migración de producción solo puedan acceder a un servidor de compilación por parte de ciertas entidades autorizadas.
Un servidor de compilación es un concepto distinto de un servidor de integración continua. El servidor de CI existe para construir sus proyectos cuando se realizan cambios. Por el contrario, existe un servidor de compilación para compilar el proyecto (generalmente una versión, contra una revisión etiquetada) en un entorno limpio. Asegura que ningún desarrollador piratee, modifique, las versiones de configuración / artefacto no aprobadas o el código no entregado lo convierta en el código liberado.
Un servidor de compilación se utiliza para programar tareas de compilación (p. Ej. Compilaciones nocturnas) de proyectos normalmente grandes ubicados en un repositorio que a veces puede llevar más de un par de horas.
Un servidor de compilación también le proporciona una base para el depósito en garantía, pudiendo capturar todas las piezas necesarias para reproducir una compilación en el caso de que otros puedan tener derechos para tomar posesión.
Un servidor de compilación te ofrece una especie de segunda opinión sobre tu código. Cuando lo registra, el código está marcado. Si funciona, el código tiene una calidad mínima.
Usamos uno para que sepamos que los cuadros de producción / prueba tienen las mismas bibliotecas y versiones de esas bibliotecas instaladas que lo que está disponible en el servidor de compilación.
¿Cuál es su propósito?
Tome carga de máquinas de desarrollo, proporcione un entorno estable y reproducible para las construcciones.
¿Por qué los desarrolladores no están construyendo el proyecto en sus máquinas locales, o no?
Porque con un software complejo, sorprendentemente muchas cosas pueden salir mal cuando se "compila". problemas que he encontrado:
- cheques de dependencia incompletos de diferentes tipos, lo que resulta en binarios que no se actualizan.
- Publicar comandos que fallan silenciosamente, el mensaje de error en el registro se ignora.
- Compilación que incluye fuentes locales que aún no se han comprometido con el control de la fuente (afortunadamente, todavía no hay cuadros de mensaje de "clientes malditos").
- Al tratar de evitar el problema anterior al compilar desde otra carpeta, algunos archivos se seleccionaron de la carpeta incorrecta.
- La carpeta de destino donde se agregan los archivos binarios contiene archivos de desarrollador rancios adicionales que no deberían incluirse en el lanzamiento
Tenemos un increíble aumento de estabilidad ya que todos los lanzamientos públicos comienzan con un obtener desde el control de fuente hasta una carpeta vacía. Antes, había muchos "problemas divertidos" que "desaparecieron cuando Joe me dio una nueva DLL".
¿Son algunos proyectos tan grandes que se necesitan máquinas más potentes para construirlo en un tiempo razonable?
¿Qué es "razonable"? Si ejecuto una compilación por lotes en mi máquina local, hay muchas cosas que no puedo hacer. En lugar de pagarle a los desarrolladores por las compilaciones para completar, pague a TI para que compre una máquina de construcción real.
¿Acaso no he trabajado en proyectos lo suficientemente grandes?
El tamaño es ciertamente un factor, pero no el único.