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

75

Debido a una serie de circunstancias que condujeron a un mal ciclo de desarrollo de la última implementación, hice campaña en nuestra oficina para realizar todas las implementaciones futuras con una máquina de construcción dedicada, y mi jefe aceptó esta propuesta.

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

La idea de tener una máquina de compilación separada era, originalmente, separar mi propio código escrito localmente del código de varios otros desarrolladores, y separar los archivos secuestrados que tenía en mi máquina de la implementación. También fue para resolver una preocupación creciente que tuve 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 en realidad sigo adelante con este proceso, me pregunto si entendí mal el propósito completo de usar una máquina de compilación, y dado que solo estamos usando esta máquina para la implementación de código en nuestros entornos de Prueba, Puesta en Escena y Producción, y no para nuestras implementaciones de prueba de Desarrollador personal, no estoy seguro de que sirva para ningún propósito.

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

Zibbobz
fuente
166
"La molestia de tener que salir de mi oficina con toda la información necesaria y luego bajar un tramo de escaleras a otra oficina solo para realizar una construcción [...] simple" ¿Qué quieres decir exactamente? ¿Accede físicamente a esa máquina para crear una compilación?
Vincent Savard
13
El verdadero WTF es Clearcase, que es peor que todas las alternativas modernas de código abierto. ¿En qué idioma (s) es este proyecto y cuán grande / complejo es la compilación?
pjc50
77
¿Estás usando herramientas? Git / SVN y Jenkins / Team City / Octopus / TFS, etc. ¿O simplemente está iniciando sesión en otra computadora, cargando Visual Studio o qué tiene ... copiando proyecto, cargando, compilando ... ¿Está utilizando herramientas profesionales o haciéndolo manualmente?
WernerCD
84
Mi máquina de construcción está en algún lugar de Carolina del Sur y yo estoy en Seattle. Te aseguro que no bajo ninguna escalera para usarlo. Creo que la última vez que tuve acceso físico a una máquina de compilación fue cuando era el interno a cargo de las máquinas de compilación para compiladores de Microsoft en 1994, cuando cabían en un armario pequeño; ahora son un centro de datos completo en alguna parte. Obtenga la máquina en su red; mejor aún, consíguelo en la nube y haz que alguien más se encargue de ello.
Eric Lippert

Respuestas:

138

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 construcción dedicada simplemente ofrece la ventaja de nunca bloquear el trabajo de un desarrollador e implementarla 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 compilará automáticamente en cada impulso a su VCS (como git), incluso podría ejecutar pruebas unitarias si las tiene y permite la "implementación de un 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 que sucedió.

Los servidores de compilación generalmente pueden ser accedidos por múltiples usuarios o equipos a la vez, utilizando una interfaz gráfica de usuario web que se ejecuta en un navegador.

En el mundo de Java, uno de los servidores de compilación más utilizados es Jenkins. Jenkins también funciona perfectamente con las compilaciones de C ++ (ya que parece que usa esos dos lenguajes). 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.

Traubenfuchs
fuente
3
En realidad no he tocado C ++ desde la universidad, pero puedo entender la utilidad. Aunque en este caso, creo que lo que estamos haciendo en realidad podría estar muy alejado del propósito previsto.
Zibbobz
21
Para algunos lenguajes (C ++ en particular), tener una caja dedicada con más potencia de procesamiento también puede ser útil, dado que es una compilación relativamente lenta.
enderland
31
La integración continua significa más que solo tener un servidor de compilación; también significa que todos integran los cambios de los demás con la mayor frecuencia posible, para evitar problemas de fusión "big bang". De lo contrario, en el clavo.
Rob Crawford
Si bien me gusta el poder que da un ejemplo al punto que se hace aquí, sigo pensando que el último párrafo es totalmente innecesario en esta respuesta.
Pierre Arlaud
3
"Una máquina de construcción dedicada simplemente ofrece la ventaja de nunca bloquear el trabajo de un desarrollador e implementarla desde una máquina centralizada". No es del todo cierto. El autor de la pregunta señaló que es muy fácil tener un entorno impuro en una máquina de desarrolladores. Las bibliotecas incluidas y otras variables de entorno pueden cambiar el resultado de la compilación. Una máquina dedicada debe tener un entorno bien documentado para permitir una recreación de construcción fácil.
TafT
107

Además de la respuesta de Traubenfuchs, has insinuado otra razón para una máquina de construcción en tu pregunta.

El hecho de que el software se base en su máquina, no significa que se basará en la de otra persona. Es posible que confíe en algunos archivos aleatorios que se encuentran en su máquina (y es posible que ni siquiera estén bajo el control de la versión). Puede estar confiando en alguna aplicación o biblioteca olvidada que se llama 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 después, solo debería ser necesario crear una nueva máquina de compilación con los elementos documentados instalados.

Simon B
fuente
37
+ 1 La cantidad de veces que algo funciona en la máquina del desarrollador, y no el resto de su equipo ...
user2259716
45
Esta. El propósito principal de construir en otra máquina es tener construcciones reproducibles ; notablemente eliminando cosas no comprometidas, variables de entorno dispares, etc. de la ecuación.
Matthieu M.
9
Extienda sobre eso: use una imagen de contenedor nueva y limpia desde la que comience cada compilación. Luego haga que un script de arranque configure el sistema. Eso realmente garantiza construcciones reproducibles.
Matthias Kuhn
9
@MatthiasKuhn: las compilaciones verdaderamente reproducibles (byte por byte) requieren mucho más, cf: reproducible-builds.org wiki.debian.org/ReproducibleBuilds
ninjalj
1
Además, el hecho de que la versión de Linux del producto se compila y pasa las pruebas en su escritorio de Linux no significa que se compile la versión de Windows o Mac.
Solomon Slow
53

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

No está claro qué plataforma / idioma está utilizando, pero idealmente debería tener un servidor de compilación que se extraiga directamente del control de origen. Es decir, cuando se requiere una compilación, recuperará la fuente de una versión determinada del repositorio y la compilará automáticamente. Esto requiere el uso de herramientas de compilación automatizadas para guiar la compilación. Si no tiene esto, ese debería ser el paso 1.

Tenga en cuenta que no hay nada de malo en construir localmente para el desarrollo. Definitivamente deberías estar trabajando localmente para ejecutar pruebas unitarias, análisis de calidad de código y para perfeccionar scripts de compilación. De lo contrario, perderás mucho tiempo. El resultado 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 las compilaciones del servidor de compilaciones.

JimmyJames
fuente
Además, resistencia adicional al virus.
Joshua
@Joshua ¿Qué te da esa idea?
jpmc26
14
@ jpmc26: la máquina de compilación tiene mucho menos software instalado, necesita menos puntos de acceso remoto y nadie está abriendo navegadores web a sitios de Internet aleatorios en ella.
Joshua
19

Las otras respuestas señalaron correctamente que debe automatizar la compilación, lo que significa que no es necesario caminar a otra oficina. Sin embargo, permítame proponer una cierta cantidad de pasos que podría seguir para mejorar su proceso de compilación:

  • En primer lugar, configure el acceso remoto al servidor de compilación. Si construye manualmente escribiendo el comando "make", esto significa que ya no tiene que caminar a otra oficina para escribir "make", puede simplemente SSH en el servidor de compilación y escribir "make". Si aún no utiliza make o un sistema de compilación similar, use 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, ¿verdad? Si no, sería un paso adicional) y los construye. Recomiendo a Jenkins. Configure Jenkins para ejecutar sus pruebas unitarias y las pruebas de integración a nivel del sistema también (tiene ambas, ¿verdad? Si no, créelas comenzando por las pruebas unitarias y luego terminando en las pruebas de integración a nivel del sistema).
  • En tercer lugar, si encuentra que compartir la misma máquina con otros equipos es problemático (por ejemplo, si tiene diferentes opiniones sobre qué sistema operativo y qué versión y bittinness debe usar), considere usar la virtualización. Un buen servidor hoy puede ejecutar una gran cantidad de máquinas virtuales. Quizás podría configurar una máquina de 32 bits y una máquina de 64 bits para que sepa que la compilación funciona en ambas arquitecturas.
  • Por último, esto puede no ser necesario: si absolutamente debe tener una máquina dedicada, como si el rendimiento de su aplicación es de gran importancia y otras compilaciones / ejecuciones de prueba que se ejecutan al mismo tiempo afectan demasiado sus resultados, instale un servidor de hardware dedicado que solo tu lo usas. 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 compartan el acceso a los mismos núcleos de CPU.

Consideraría una máquina compartida mucho mejor que las compilaciones manuales. Mi proyecto actual usa 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.

juhist
fuente
16

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

Dices eso como si fuera algo malo.

Ahora tiene un servidor de compilación común a través del cual se construyen todas sus compilaciones, la suya y la de los otros equipos. La consistencia de la construcción? Cheque.

... la molestia de tener que salir de mi oficina con toda la información necesaria y luego bajar 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á 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 que ese proceso le envíe los resultados.

Phill W.
fuente
55
"Dices eso como si fuera algo malo". Podría ser si tienen reinado libre para instalar cualquier basura que quieran. Si están conectando o accediendo físicamente a él, no veo cómo se podría evitar.
jpmc26
77
"Dices eso como si fuera algo malo. Ahora tienes un servidor de compilación común a través del cual se construyen todas tus compilaciones, la tuya y la de los otros equipos. ¿Consistencia de la compilación? Comprueba". ¡Eso es todo lo contrario de una construcción consistente! Si algún otro equipo decide actualizar su compilador o cualquier otra herramienta, de repente se enfrenta a un entorno de compilación completamente diferente. Ese es prácticamente el peor de los casos (aparte de no tener una máquina de construcción para empezar).
Voo
1
Acordó querer tener un proceso automático para crear nuevas compilaciones, pero al mismo tiempo también desea virtualizar sus agentes de compilación para asegurarse de que su entorno de compilación esté bajo su propio control. Las máquinas virtuales son una herramienta increíble para las operaciones de desarrollo y debes aprovecharlas al máximo.
Voo
@Voo No es el peor de los casos, es un escenario medio. Lo que el que pregunta actualmente tiene es el peor de los casos. (Tenga en cuenta también que si nunca reproduce compilaciones, las actualizaciones aleatorias del compilador no son un gran problema)
usuario253751
@immibis ¿Leyó la parte en parens justo después de la parte que citó? Es el peor de los casos si está involucrado un servidor de compilación. El problema con los errores no reproducibles es que realmente no se pueden hacer revisiones si todo el entorno de compilación ha cambiado mientras tanto. Eso no es un gran problema si solo tiene una única versión lanzada que se mantiene cerca del tronco, pero en todos los demás casos es bastante mala.
Voo
1

Además de otras respuestas relevantes, también parece que está ejecutando sus 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 respaldar fácilmente, y también se puede clonar fácilmente en cualquier otra PC (incluida su propia máquina de desarrollo).

Graham
fuente
1

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

Con una máquina de compilación dedicada, puede hacer que se reconstruya cada vez que hay una inserción de código en el repositorio. Cuando alguien interrumpe la compilación, el proceso puede enviar inmediatamente una alerta para que el problema se pueda corregir 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 al acecho, facilita la vida de los desarrolladores porque todo lo que tienen que hacer para que la compilación funcione en su máquina es copiar lo que sea se está haciendo en la máquina de compilación.

Jim W
fuente
44
Esto no parece ofrecer nada sustancial sobre los puntos hechos y explicados en las 6 respuestas anteriores
mosquito el