Perdón por esta larga publicación, pero creo que vale la pena.
Acabo de comenzar con una pequeña tienda .NET que funciona de manera bastante diferente a otros lugares en los que he trabajado. A diferencia de cualquiera de mis posiciones anteriores, el software escrito aquí está dirigido a múltiples clientes y no todos los clientes obtienen la última versión del software al mismo tiempo. Como tal, no existe una "versión de producción actual". Cuando un cliente recibe una actualización, también obtiene todas las características agregadas al software desde su última actualización, que podría ser hace mucho tiempo. El software es altamente configurable y las funciones pueden activarse y desactivarse: las llamadas "funciones alternan". Los ciclos de lanzamiento son muy ajustados aquí, de hecho, no están programados: cuando se completa una característica, el software se implementa en el cliente correspondiente.
El equipo solo el año pasado se mudó de Visual Source Safe a Team Foundation Server. El problema es que todavía usan TFS como si fuera VSS y aplican bloqueos de Checkout en una sola rama de código. Cada vez que se coloca una corrección de errores en el campo (incluso para un solo cliente) simplemente construyen lo que está en TFS, prueban que el error se corrigió y se implementa en el cliente. (Yo mismo de un fondo de software de dispositivos médicos y farmacéuticos, ¡esto es increíble!). El resultado es que el código de desarrollo medio horneado se pone en producción sin siquiera ser probado. Los errores siempre se deslizan en las versiones de lanzamiento, pero a menudo un cliente que acaba de obtener una versión no verá estos errores si no usan la función en la que se encuentra el error. El director sabe que esto es un problema ya que la compañía está empezando a crecer. de repente con la llegada de algunos grandes clientes y otros más pequeños.
Me han pedido que analice las opciones de control de código fuente para eliminar la implementación de código defectuoso o inacabado, pero no sacrificar la naturaleza algo asíncrona de los lanzamientos de los equipos. He usado VSS, TFS, SVN y Bazaar en mi carrera, pero TFS es donde ha estado la mayor parte de mi experiencia.
Anteriormente, la mayoría de los equipos con los que he trabajado utilizan una solución de dos o tres ramas de Dev-Test-Prod, donde durante un mes los desarrolladores trabajan directamente en Dev y luego los cambios se fusionan con Test y luego con Prod, o se promocionan "cuando está hecho" en lugar de en Un ciclo fijo. Se utilizaron construcciones automatizadas, utilizando Cruise Control o Team Build. En mi trabajo anterior, Bazaar se usaba sentado en la parte superior de SVN: los desarrolladores trabajaban en sus propias ramas de características pequeñas y luego empujaban sus cambios a SVN (que estaba vinculado a TeamCity). Esto fue bueno porque fue fácil aislar los cambios y compartirlos con las ramas de otras personas.
Con ambos modelos había una rama central de desarrollo y producción (y a veces prueba) a través de la cual se introducía el código (y las etiquetas se usaban para marcar las compilaciones en la producción desde las que se realizaban las versiones ... y estas se convirtieron en ramas para corregir errores) a lanzamientos y fusionados de nuevo a dev). Sin embargo, esto realmente no se ajusta a la forma de trabajar aquí: no hay un orden para cuando se lanzarán varias funciones, se presionarán cuando estén completas.
Con este requisito, el enfoque de "integración continua", tal como lo veo, se rompe. Para sacar una nueva característica con una integración continua, debe empujarse a través de dev-test-prod y eso capturará cualquier trabajo inacabado en dev.
Estoy pensando que para superar esto deberíamos seguir un modelo ramificado con muchas características sin ramas de desarrollo de prueba, sino que la fuente debería existir como una serie de ramas de características que cuando se completa el trabajo de desarrollo se bloquean, prueban, arreglan y bloquean , probado y luego lanzado. Otras ramas de características pueden tomar los cambios de otras ramas cuando lo necesiten / quieran, por lo que eventualmente todos los cambios serán absorbidos por todos los demás. Esto encaja mucho en un modelo de bazar puro de lo que experimenté en mi último trabajo.
Por flexible que parezca, parece extraño no tener una troncal de desarrollo o una rama de producción en algún lugar, y me preocupa que las ramas no se vuelvan a integrar, o que se realicen pequeños cambios tardíos que nunca se transfieren a otras ramas y los desarrolladores se quejan de fusionar desastres ...
Qué piensa la gente sobre esto?
Una segunda pregunta final: estoy algo confundido acerca de la definición exacta del control de fuente distribuida: algunas personas parecen sugerir que se trata simplemente de no tener un repositorio central como TFS o SVN, algunos dicen que se trata de estar desconectado (SVN está 90% desconectado y TFS tiene un modo fuera de línea perfectamente funcional) y otros dicen que se trata de Ramificación de características y facilidad de fusión entre ramas sin relación padre-hijo (¡TFS también tiene fusión sin fundamento!). ¡Quizás esta sea una segunda pregunta!