seguro - ¿Cómo y por qué configuro una máquina de construcción C#?
procedimiento de trabajo seguro para maquinaria pesada (9)
Estoy trabajando con un pequeño equipo de desarrollo (4 personas) en un proyecto de C #. He propuesto configurar una máquina de compilación que hará compilaciones y pruebas nocturnas del proyecto, porque entiendo que esto es una buena cosa. El problema es que no tenemos mucho presupuesto aquí, así que tengo que justificar el gasto para los poderes fácticos. Entonces quiero saber:
Me doy cuenta de que este es un tema muy extenso, y recién estoy empezando. No pude encontrar un duplicado de esta pregunta aquí, y si hay un libro por ahí que debería obtener, por favor avíseme.
EDIT: ¡Finalmente lo hice funcionar! Hudson es completamente fantástico, y FxCop está demostrando que algunas características que pensamos que se implementaron eran en realidad incompletas. También tuvimos que cambiar el tipo de instalador de vdproj Old-And-Busted a New Hotness WiX.
Básicamente, para aquellos que están prestando atención, si puedes ejecutar tu compilación desde la línea de comando, entonces puedes ponerlo en hudson. Hacer que la compilación se ejecute desde la línea de comandos a través de MSBuild es un ejercicio útil en sí mismo, porque obliga a tus herramientas a estar al día.
¿Cómo? Eche un vistazo al blog Carel Lotz.
¿Por qué? Hay varias razones por las que puedo pensar:
- Una compilación operativa, cuando se implementa correctamente, significa que todos los desarrolladores pueden construir en su máquina cuando la construcción es verde
- Una compilación operativa, cuando se implementa correctamente, significa que está listo para implementar en cualquier momento
- Una compilación operativa, cuando se implementa correctamente, significa que cualquier cosa que libere ha realizado un viaje a su sistema de control de origen.
- Una compilación operativa, cuando se implementa correctamente, significa que usted se integra temprano y con frecuencia, reduciendo su riesgo de integración.
El artículo de Martin Fowler sobre Integración Continua sigue siendo el texto definitivo. ¡Échale un vistazo!
¿Por qué? Hace 10 años, como desarrolladores de software, utilizábamos para analizar algo enésimo grado, obtener los documentos (escritos en un lenguaje humano) ''firmados'' y luego comenzar a escribir el código. Probábamos la prueba unitaria, la prueba de cadena y luego apretábamos la prueba del sistema: la primera vez que el sistema en conjunto se ejecutaba en conjunto, a veces una semana o meses después de que los documentos se cerraran. Fue solo entonces cuando descubrimos todas las suposiciones y malentendidos que tuvimos cuando analizamos todo.
La integración continua como idea hace que construyas un sistema completo (aunque, inicialmente, muy simple) de extremo a extremo. Con el tiempo, la funcionalidad del sistema se construye ortogonalmente. Cada vez que haces una compilación completa, estás haciendo la prueba del sistema temprano y con frecuencia. Esto significa que puede encontrar y corregir errores y suposiciones tan pronto como sea posible, cuando es el momento más barato para solucionarlos.
Cómo: En cuanto al cómo, publiqué sobre esto hace un tiempo: [ Haga clic aquí ]
Más de 8 publicaciones van paso a paso sobre cómo configurar un servidor Jenkins en un entorno de Windows para soluciones .NET.
Actualización: Jenkins es la versión más actualizada de Hudson. Todos deberían estar usando Jenkins ahora. Voy a actualizar los enlaces en consecuencia.
Hudson es gratuito y extremadamente fácil de configurar y se ejecutará fácilmente en una máquina virtual.
En parte de un viejo post mío:
Lo usamos para
- Implementar servicios de Windows
- Implementar servicios web
- Ejecute MSTests y muestre tanta información como cualquier prueba junit
- Lleve un registro de tareas bajas, med, altas
- advertencias y errores de trendgraph
Estas son algunas de las cosas incorporadas en .net que Hudson admite
- MSBuild
- NAnt
- MSTest
- Nunit
- Team Foundation Server
- fxcop
- fxcop
- advertencias del compilador
- tareas de código
Además, Dios no quiera que uses la fuente visual segura, eso también lo admite . Te recomiendo que eches un vistazo al artículo de Redsolo sobre la construcción de proyectos .net usando Hudson
Tus preguntas
P : ¿Qué tipo de herramientas / licencias necesitaré? En este momento, usamos Visual Studio y Smart Assembly para construir y Perforce para el control de fuente. ¿Necesitaré algo más, o existe un equivalente de un trabajo cron para ejecutar scripts automatizados?
R: Acabo de instalar Visual Studio en una copia nueva de una VM que ejecuta una instalación nueva y parchada de un sistema operativo Windows Server. Entonces necesitarías las licencias para manejar eso. Hudson se instalará como un servicio de Windows y se ejecutará en el puerto 8080, y usted configurará la frecuencia con la que desea que escanee su depósito de códigos en busca de código actualizado, o puede pedirle que lo haga en un momento determinado. Todo configurable a través del navegador.
P: ¿Qué me conseguirá exactamente, aparte de una indicación de una compilación rota? ¿Debo configurar los proyectos de prueba en esta solución (archivo sln) que ejecutarán estos scripts, para que pueda probar funciones particulares? Tenemos, por el momento, dos de esas pruebas, porque no hemos tenido el tiempo (o francamente, la experiencia) para hacer buenas pruebas unitarias.
A: Recibirá un correo electrónico la primera vez que falla una compilación o se vuelve inestable. Una construcción es inestable si falla una prueba de la unidad o puede marcarse inestable a través de cualquier número de criterios que establezca. Cuando falla una prueba o construcción unitaria, se le enviará un correo electrónico que le indicará dónde, por qué y cómo falló. Con mi configuración, obtenemos:
- lista de todas las confirmaciones desde la última versión en funcionamiento
- comprometer notas de esos commits
- lista de archivos modificados en los commits
- Salida de consola desde la propia construcción, que muestra el error o error de prueba
P: ¿Qué tipo de hardware necesitaré para esto?
A: una máquina virtual será suficiente
P: Una vez que se ha terminado y probado una compilación, ¿es una práctica común instalar esa compilación en un sitio ftp o tener alguna otra forma de acceso interno? La idea es que esta máquina haga la compilación, y todos vamos a ella, pero podemos crear compilaciones de depuración si es necesario.
R: Hudson puede hacer lo que quiera con eso, que incluye identificarlo a través del hash md5, cargarlo, copiarlo, archivarlo, etc. Lo hace automáticamente y le proporciona un historial de artefactos de compilación de larga duración.
P: ¿Con qué frecuencia deberíamos hacer este tipo de construcción?
R: Tenemos nuestra encuesta SVN cada hora, buscando cambios de código, y luego ejecutando una compilación. Nightly está bien, pero IMO es un poco inútil ya que lo que has trabajado ayer no estará fresco en tu mente por la mañana cuando entres.
P: ¿Cómo se gestiona el espacio? Si hacemos compilaciones nocturnas, ¿deberíamos mantener todas las compilaciones antiguas o comenzar a deshacernos de ellas después de aproximadamente una semana más o menos?
A: Eso depende de usted, después de tanto tiempo muevo nuestros artefactos de construcción a un almacenamiento a largo plazo o los elimino, pero todos los datos que están almacenados en archivos de texto / xml guardan, esto me permite almacenar el registro de cambios, gráficos de tendencias, etc. en el servidor con poco espacio consumido. También puede configurar Hudson para que solo conserve los artefactos de un número final de compilaciones
P: ¿Hay algo más que no estoy viendo aquí?
R: No, ve a buscar a Hudson ahora, ¡no estarás decepcionado!
El principal argumento a favor es que reducirá el costo de su proceso de desarrollo al alertarlo lo antes posible de que tiene una compilación rota o pruebas fallidas.
El problema de integrar el trabajo de múltiples desarrolladores es el principal peligro de hacer crecer un equipo. Cuanto más grande sea el equipo, más difícil será coordinar su trabajo y evitar que se enfrenten a los cambios de los demás. La única buena solución es decirles que "se integren temprano y con frecuencia", verificando pequeñas unidades de trabajo (a veces llamadas "historias") a medida que se completan.
Debes hacer que la máquina de compilación reconstruya CADA vez algunos controles, a lo largo del día. Con Cruise Control, puede obtener un ícono en su barra de tareas que se vuelve rojo (¡e incluso habla con usted!) Cuando se rompe la compilación.
A continuación, debe realizar una creación completa y limpia cada noche en la que la versión de origen esté etiquetada (dado un número de compilación único) que puede elegir publicar para sus partes interesadas (gerentes de producto, personas de control de calidad). Esto es para que cuando se informa un error, sea contra un número de compilación conocido (eso es extremadamente importante).
Idealmente, debería tener un sitio interno donde las compilaciones puedan descargarse, y tener un botón en el que pueda hacer clic para publicar la construcción nocturna anterior.
En mi lugar de trabajo anterior usamos TeamCity . Es muy fácil y poderoso de usar. Se puede usar de forma gratuita con algunas restricciones. También hay un tutorial sobre Dime Casts . La razón por la que no usamos CruiseControl.NET es que tuvimos muchos proyectos pequeños y es bastante doloroso configurar cada uno en CC.NET. Recomiendo encarecidamente TeamCity. Para resumir si se dirige hacia el código abierto, entonces CC.NET es el gran padre con una curva de aprendizaje ligeramente superior. Si su presupuesto lo permite definitivamente vaya con TeamCity o revise la versión gratuita.
Hemos tenido mucha suerte con el siguiente combo:
- Visual Studio (específicamente, al usar la herramienta de línea de comandos MSBuild.exe y pasarle nuestros archivos de solución, elimina la necesidad de scripts de msbuild)
- NAnt (como la biblioteca de sintaxis / tarea XML mejor que MSBuild. También tiene opciones para las operaciones de control P4 src)
- CruiseControl.net : construido en el panel de control web para monitorear / iniciar compilaciones.
CCNet ha incorporado notificadores para enviar correos electrónicos cuando las compilaciones tienen éxito o fallan
Sobre la justificación: Esto quita la carga a los desarrolladores que hacen compilaciones manuales y hace mucho para quitar el error humano de la ecuación. Es muy difícil cuantificar este efecto, pero una vez que lo haces, nunca volverás. Tener un proceso repetible para construir y lanzar software es primordial. Estoy seguro de que has estado en lugares donde construyen el software a mano y se desarrolla en la naturaleza, solo para que tu chico de la construcción diga "Vaya, ¡debo haber olvidado incluir esa nueva DLL!"
En hardware: tan poderoso como puedas obtener. Más potencia / memoria = tiempos de construcción más rápidos. Si puede pagarlo, nunca se arrepentirá de obtener una máquina de construcción de primer nivel, sin importar cuán pequeño sea el grupo.
En el espacio: ayuda a tener suficiente espacio en el disco duro. Puede crear sus scripts NAnt para eliminar archivos intermedios cada vez que se inicia una compilación, por lo que el verdadero problema es mantener el historial de registro y los instaladores de aplicaciones anteriores. Tenemos un software que monitorea el espacio en disco y envía alertas. Luego, limpiamos la unidad manualmente. Por lo general, debe hacerse cada 3-4 meses.
En las notificaciones de compilación: esto está integrado en CCNet, pero si va a agregar pruebas automáticas como un paso adicional, compile esto en el proyecto desde el principio. Es extremadamente difícil respaldar las pruebas de ajuste una vez que el proyecto crece. Hay toneladas de información sobre marcos de prueba (probablemente también un montón de información sobre SO), por lo que voy a diferir en el nombramiento de las herramientas específicas.
Solo estoy tratando de construir un poco sobre lo que dijo mjmarsh, ya que él estableció una gran base ...
- Estudio visual. MSBuild funciona bien.
- NAnt .
- NantContrib . Esto proporcionará tareas adicionales, como las operaciones Perforce.
- CruiseControl.net . Esto es básicamente tu "panel de desarrollo".
Todo lo anterior (excepto VS) es de código abierto, por lo que no está buscando licencias adicionales.
Como mencionó Earwicker, construya temprano, construya a menudo. Saber que algo se rompió, y puedes producir un entregable es útil para atrapar cosas desde el principio.
NAnt también incluye tareas para nunit / nunit2 , por lo que puedes automatizar tus pruebas unitarias. A continuación, puede aplicar hojas de estilo a los resultados, y con la ayuda del marco provisto por CruiseControl.net, tenga buenos resultados legibles, de pruebas de unidades imprimibles para cada compilación.
Lo mismo se aplica a la tarea ndoc . Tenga su documentación producida y disponible para cada construcción.
Incluso puede usar la tarea ejecutiva para ejecutar otros comandos, por ejemplo, producir un Windows Installer usando InstallShield.
La idea es automatizar la construcción tanto como sea posible, porque los seres humanos cometen errores. El tiempo invertido es el tiempo ahorrado en el camino. La gente no tiene que cuidar a la construcción pasando por el proceso de compilación. Identifique todos los pasos de su compilación, cree scripts NAnt para cada tarea y construya sus scripts NAnt uno por uno hasta que haya automatizado completamente todo su proceso de construcción. También coloca todas sus construcciones en un solo lugar, lo cual es bueno para fines de comparación. ¿Algo se rompe en Build 426 que funcionó bien en Build 380? Bueno, están los entregables listos para las pruebas, tómalos y prueba.
Se trata de la salud de la construcción. Lo que esto hace es que puede configurar cualquier tipo de cosas que quiera que sucedan con las compilaciones. Entre ellos puede ejecutar pruebas, análisis estático y generador de perfiles. Los problemas se solucionan mucho más rápido cuando trabajaste recientemente en esa parte de la aplicación. Si cometes pequeños cambios, casi te dice dónde lo rompiste :)
Esto, por supuesto, asume que lo configura para compilar con cada check in (integración continua).
También puede ayudar a obtener QA y Dev más cerca. Como puede configurar pruebas funcionales para ejecutar con él, junto con el generador de perfiles y cualquier otra cosa que mejore los comentarios al equipo de desarrollo. Esto no significa que las pruebas funcionales se ejecutan con cada check in (puede tomar un tiempo), pero configuras compilaciones / pruebas con herramientas que son comunes para todo el equipo. He estado automatizando las pruebas de humo, por lo que en mi caso colaboramos aún más de cerca.
- No se necesitan licencias CruiseControl.net está disponible gratuitamente y solo necesita .NET sdk para compilar.
- Un servidor de compilación, incluso sin pruebas unitarias automatizadas, proporciona un entorno controlado para la creación de versiones. No más "John usualmente construye en su máquina pero está enfermo. Por alguna razón no puedo construir en mi máquina"
- En este momento tengo uno configurado en una sesión de Virtual PC.
- Sí. La construcción debe ser abandonada en algún lugar accesible. Las compilaciones de desarrollo deben tener habilitada la depuración. La versión de lanzamiento debe estar apagada.
- ¿Con qué frecuencia depende de usted. Si se configura correctamente, puede construir después de cada control muy poca sobrecarga. Esta es una gran idea si tiene (o planea tener) pruebas unitarias en su lugar.
- Mantenga hitos y lanzamientos por el tiempo que sea necesario. Cualquier otra cosa depende de la frecuencia con la que construyas: ¿continuamente? tirar a la basura. ¿Diario? Mantenga una semana de valor. ¿Semanal? Mantenga dos meses vale la pena.
Cuanto más grande sea tu proyecto, más verás los beneficios de una máquina de construcción automatizada.