¿Cuál es el propósito de una máquina de compilación dedicada?

74

Debido a una serie de circunstancias que llevaron a un último ciclo de compilación de implementación deficiente, hice campaña en nuestra oficina para realizar todas las implementaciones futuras con una máquina de compilación dedicada, y mi jefe aceptó esta propuesta.

Sin embargo, en lugar de utilizar una máquina real en nuestra oficina, tenemos que compartir una sola máquina con varios otros grupos, y la molestia de tener que abandonar mi oficina con toda la información necesaria y luego caminar por un Un tramo de escaleras a otra oficina solo para realizar una construcción simple me hace preguntarme por qué propuse esto en primer lugar.

La idea de tener una máquina de compilación separada fue, originalmente, separar mi propio código escrito localmente del código de varios otros desarrolladores, y separar cualquier archivo secuestrado que tuviera en mi máquina de la implementación. También fue para resolver una creciente preocupación que he tenido con nuestro sistema de administración de archivos ClearCase, que a menudo se niega a permitirme implementar ciertas actividades de compilación a menos que también haya incluido otra actividad para la cual 'tiene dependencias'.

Ahora que realmente estoy avanzando con este proceso, me pregunto si entendí mal el propósito completo de usar una máquina de compilación, y ya que solo estamos usando esta máquina para la implementación de código en nuestro Test, Staging y Producción entornos, y no para nuestros despliegues de prueba de desarrollador personal, no estoy seguro de que sirva para nada.

Entonces, ¿cuál es la razón real para usar una máquina de compilación, e incluso me he acercado a usarla correctamente?

    
pregunta Zibbobz 03.03.2017 - 15:02

7 respuestas

137

Normalmente, no solo tendría una máquina de compilación dedicada, sino que también ejecutaría un servidor de compilación en esa máquina dedicada. Una máquina de compilación dedicada simplemente ofrece la ventaja de nunca bloquear el trabajo de un desarrollador y desplegar desde una máquina centralizada.

Un servidor de compilación ofrece mucho más. Un servidor de compilación permite CI (integración continua), lo que significa que se acumulará automáticamente en cada impulso a su VCS (como git), incluso podría ejecutar pruebas unitarias si las tiene y permite la "implementación con un solo clic". Los servidores de compilación pueden notificarle por correo si las compilaciones o las pruebas fallan. Ofrecen datos históricos y tendencias sobre lo sucedido.

En general, los usuarios o equipos pueden acceder a los servidores de compilación a la vez, mediante una interfaz gráfica de usuario que se ejecuta en un navegador.

En el mundo Java, uno de los servidores de compilación más utilizados es Jenkins. Jenkins también funciona perfectamente bien con las compilaciones de C ++ (ya que parece que utilizas esos dos idiomas). Jenkins se llama a sí mismo servidor de automatización, ya que puede ejecutar todo tipo de tareas que no tienen que estar relacionadas con la programación y la construcción.

    
respondido por el Traubenfuchs 03.03.2017 - 15:17
107

Además de la respuesta de Traubenfuchs, ha sugerido otra razón para construir una máquina en su pregunta.

El hecho de que el software se basa en su máquina, no significa que se basará en el de otra persona. Puede estar confiando en algunos archivos aleatorios que simplemente se encuentran en su máquina (y es posible que ni siquiera estén bajo el control de versiones). Es posible que esté confiando en alguna aplicación o biblioteca olvidada que se abre desde un script de compilación oscuro.

Si tiene una máquina de compilación dedicada, debe saber qué está instalado en ella. Esto debería estar bien documentado. Si alguna vez es necesario reconstruir el software, quizás años más tarde, solo debería ser necesario crear una nueva máquina de compilación con el material documentado instalado.

    
respondido por el Simon B 03.03.2017 - 15:44
53

La razón principal para tener una máquina de compilación dedicada es obtener compilaciones consistentes, independientemente de quién realice la compilación. Las estaciones de trabajo de desarrollador rara vez son (leídas: nunca) idénticas. Es difícil saber que cada compilación está usando las mismas versiones exactas de dependencias y compiladores, etc. Uno de los peores problemas con las compilaciones de estaciones de trabajo dev es que los desarrolladores pueden compilar a partir de un código que no está incluido en el control de versiones.

No está claro qué plataforma / idioma está usando, pero lo ideal es que tenga un servidor de compilación que extraiga directamente del control de código fuente. Es decir, cuando se requiere una compilación, recuperará la fuente de una versión dada del repositorio y la compilará automáticamente. Esto requiere el uso de herramientas de compilación automatizadas para crear un script de la compilación. Si no tiene esto, debería ser el paso # 1.

Tenga en cuenta que no hay nada de malo en construir localmente para el desarrollo. Definitivamente, debería estar trabajando localmente ejecutando pruebas unitarias, análisis de calidad de código y perfeccionando los scripts de construcción. De lo contrario estarás perdiendo mucho tiempo. La salida del servidor de compilación es para cualquier cosa que desee mover potencialmente a producción. Todas las actividades de control de calidad, como las pruebas de integración y aceptación, deben realizarse solo con compilaciones del servidor de compilación.

    
respondido por el JimmyJames 03.03.2017 - 15:42
18

Las otras respuestas señalaron correctamente que debes automatizar la compilación, lo que significa que no es necesario caminar a otra oficina. Sin embargo, permítame proponer una serie de pasos que podría tomar para mejorar el proceso de creación:

  • En primer lugar, configure el acceso remoto al servidor de compilación. Si creas manualmente escribiendo el comando "make", esto significa que ya no tendrás que caminar a otra oficina para escribir "make", puedes simplemente ingresar SSH en el servidor de compilación y escribir "make". Si aún no utiliza un sistema de compilación o un sistema de compilación similar, ponga en uso dicho sistema de compilación.
  • En segundo lugar, instale un entorno de integración continua que extraiga automáticamente los últimos cambios del sistema de control de versiones (tiene un sistema de control de versiones, ¿no? Si no, ese sería un paso adicional) y los construye. Recomiendo a Jenkins. Configure a Jenkins para que realice las pruebas unitarias y las pruebas de integración a nivel del sistema (tiene ambas, ¿verdad? Si no, créalas a partir de pruebas unitarias y luego finalice en las pruebas de integración a nivel del sistema).
  • En tercer lugar, si considera que compartir la misma máquina con otros equipos es problemático (por ejemplo, si tiene opiniones diferentes sobre qué sistema operativo y qué versión y bittiness debe usar), considere la posibilidad de usar la virtualización. Un buen servidor de hoy puede ejecutar una gran cantidad de máquinas virtuales. Tal vez podría configurarse una máquina de 32 bits y una de 64 bits para que sepa que la construcción funciona en ambas arquitecturas.
  • Por último, esto puede no ser necesario: si es absolutamente necesario tener una máquina dedicada, por ejemplo, si el rendimiento de su aplicación es de gran importancia y otras ejecuciones / ejecuciones de prueba que se ejecutan al mismo tiempo afectan demasiado sus resultados, instale una Servidor de hardware que solo utiliza usted. Sin embargo, en servidores recientes que pueden tener hasta 40 núcleos de CPU virtuales o incluso más, es relativamente sencillo crear algunas máquinas virtuales que no comparten acceso a los mismos núcleos de CPU.

Consideraría una máquina compartida mucho mejor que las compilaciones manuales. Mi proyecto actual utiliza una máquina virtual ahora, pero debido a la necesidad de pruebas de rendimiento de integración a nivel de sistema, nos estamos moviendo a un servidor dedicado con 40 núcleos de CPU virtuales, de los cuales las pruebas de rendimiento requieren 17.

    
respondido por el juhist 03.03.2017 - 19:25
16
  

... en lugar de obtener una máquina real en nuestra oficina para usar, tenemos que compartir una sola máquina con varios otros grupos ...

Lo dices como si fuera algo malo.

Ahora tienes un servidor de compilación común con el que todas tus compilaciones, la tuya y la de los otros equipos, están integradas. La consistencia de la construcción? Comprobar.

  

... la molestia de tener que salir de mi oficina con toda la información necesaria y luego bajar por un tramo de escaleras a otra oficina solo para realizar una construcción simple me hace preguntarme por qué propuse esto en primer lugar.

Todavía estás realizando la compilación manualmente y eso no es bueno.

Necesita un proceso de servidor al que envíe / ponga en cola las solicitudes para que las compilaciones se realicen en su nombre y el proceso le envíe los resultados.

    
respondido por el Phill W. 03.03.2017 - 16:24
1

Además de otras respuestas relevantes, también suena como si estuvieras ejecutando tus compilaciones directamente en la máquina en cuestión.

Para un sistema de compilación confiable, especialmente cuando se comparte la máquina de compilación con otros usuarios, es normal ejecutar sus compilaciones dentro de una máquina virtual. Esto garantiza que otros usuarios no puedan cambiar el comportamiento de sus compilaciones instalando sus propias versiones de aplicaciones o bibliotecas de las que depende su código. Una gran ventaja de esto es que la VM se puede copiar fácilmente y también se puede clonar fácilmente en cualquier otra PC (incluida su propia máquina de desarrollo).

    
respondido por el Graham 06.03.2017 - 15:18
1

Proporciona una ubicación centralizada y neutral para realizar compilaciones, independientemente del IDE, SO, configuraciones de biblioteca de desarrolladores individuales.

Con una máquina de compilación dedicada, puede hacer que se reconstruya cada vez que se envíe un código al repositorio. Cuando alguien rompe la compilación, el proceso puede enviar inmediatamente una alerta para que el problema se pueda solucionar de inmediato.

Además de hacer que todo sea más repetible y confiable, y garantizar que el repositorio no esté lleno de basura rota con problemas de dependencia, facilita la vida de los desarrolladores porque todo lo que tienen que hacer para que la compilación funcione en su máquina es para copiar lo que se está haciendo en la máquina de compilación.

    
respondido por el Jim W 06.03.2017 - 16:45

Lea otras preguntas en las etiquetas