Patrones para integración continua y DVCS

12

Actualmente usamos Subversion y TeamCity, vamos a pasar a usar Mercurial (específicamente Kiln, ya que somos usuarios de FogBugz).

Obviamente, esto dará como resultado cambios, ojalá mejoras, en nuestros patrones de desarrollo (¡los dos!), Pero el único problema con el que estoy luchando es cómo estructurar las cosas para que aún disfrutemos de los beneficios de la integración continua / nuestro servidor CI ( que hay y seguirá habiendo beneficios es un hecho, cuya discusión está fuera del alcance de esta pregunta).

Con SVN nos comprometemos con un número limitado de repositorios centrales, efectivamente uno por proyecto (más o menos una solución de Visual Studio), por lo que es fácil activar una compilación y obtener la seguridad de que todos los archivos se han comprometido y que no hay dependencias perdidas, etc., etc. Pero si vamos a aprovechar adecuadamente el mercurial, vamos a querer tener más instancias de repositorio, donde esperaría que los cambios generalmente fluyan hacia un repositorio definitivo "en vivo". El problema con el que estoy luchando es que el repositorio en vivo me parece demasiado "tarde" para activar mis compilaciones de CI OTOH Una compilación de CI por proyecto por desarrollador es probablemente excesiva (y causa otros problemas).

Estoy pescando un poco, pero eso es porque una de las cosas que un repositorio de subversión central le da a uno (¡yo, con nuestra configuración!) Es mucha claridad sobre qué construir cuando.


Nota: no estoy preguntando acerca de la mecánica del uso de mercurial con integración continua: tengo que trabajar como un regalo para un proyecto personal, sus patrones y estructuras y la práctica de trabajo / flujo de trabajo que estoy tratando de entender.

Murph
fuente
¿Por qué crees que es demasiado tarde para generar compilaciones desde el repositorio central / "en vivo"?
c_maker
Si aún no ha estado allí, le sugiero que visite el sitio de intercambio de la pila Kiln ( kiln.stackexchange.com ). Tienen bastante contenido sobre cómo configurar esto (aquí hay uno: kiln.stackexchange.com/questions/29/… . Personalmente, usamos una rama por función y apuntamos el servidor de compilación a nuestra rama "maestra". )
Chris Phillips
@ Chris - Tengo, no hay realmente, no abordar el problema de CI ...
Murph

Respuestas:

2

Primero, tener múltiples compilaciones por proyecto en TeamCity es realmente el camino a seguir. La naturaleza de la plataforma lo hace realmente fácil: el botón copiar está ahí por una razón.

En cualquier caso, cuando estábamos en SVN, normalmente ejecutamos 2 compilaciones para cada proyecto: una apuntaba a la línea de desarrollo principal (en nuestro caso, el tronco) y otra apuntaba a nuestra rama de lanzamiento. Llevamos esta configuración de compilación a HG mientras seguimos un modelo de ramificación similar a este . El único desafío real ha sido encontrar un nuevo funk schwea sobre los números de compilación ahora que ya no podríamos usar el número de revisión SVN actual.

Tratamos de alentar a las personas a presionar con relativa frecuencia, especialmente cuando hay mucho trabajo al mismo tiempo y queremos ciclos de retroalimentación más rápidos. El hecho de que sea un DCVS no significa que solo tenga que presionar una vez al día o algo así.

Wyatt Barnett
fuente
Wyatt, en mi opinión, el impulso debería ocurrir cuando tienes una unidad de trabajo completa (ish): uno de los beneficios de DVCS es que podemos comprometer, localmente, el código que no funciona. Realmente realmente no les gusta la idea de hacer cualquier cosa en un horario porque es el final del día. Hay un problema separado de "copia de seguridad", que, para mí, se trata de configurar una regla para empujar hacia los lados, al confirmar, a otro clon que existe solo para ser una copia de seguridad.
Murph
2
Truco, ¿cuál es la definición de unidad de trabajo? ¿Es "esta característica está completa" o es "este ladrillo se colocó con éxito". Tendemos a lo último, especialmente con ese modelo de ramificación donde hay una rama de desarrollo claramente delimitada. Lo mejor es romper las cosas para presentar ramas. Los de larga duración también pueden obtener compilaciones de CI si es posible. Especialmente si hay varios cocineros en la cocina.
Wyatt Barnett
Estoy de acuerdo con su definición de "unidad de trabajo", por lo que estoy luchando un poco con mi modelo general (que ya tiene varias compilaciones por proyecto para adaptarse tanto a las compilaciones de "CI" como a las de "implementación"). Tienes razón, la respuesta es conectar muchas compilaciones, así que al final, ¡mi verdadero problema será firmar el cheque! El modelo de ramificación al que se hace referencia también parece correcto. Todavía teniendo en cuenta el patrón general (y permita que eso se ajuste aún más para tener en cuenta los detalles del kilnhg)
Murph
2

Hemos estado usando Kiln durante aproximadamente un año y hemos probado varias cosas diferentes. Donde terminamos es usar ramas con nombre (en lugar de clones de ramas) con la siguiente estrategia de ramificación:

  • pistas predeterminadas de desarrollo "completado"
  • las ramas de características rastrean el trabajo que está actualmente en progreso
  • liberar sucursales puntos de seguimiento donde liberamos de forma predeterminada

Entonces, el trabajo comienza creando una rama de características desde la punta actual predeterminada . Cuando se realiza la ramificación de la función *, la ramificación se cierra y se fusiona con la predeterminada .

En algún momento, decidimos que estamos listos para lanzar, por lo que creamos una nueva rama de lanzamiento desde la punta actual en forma predeterminada . Esto nos permite realizar cambios en el código que se encuentra actualmente en producción al comprometernos con la rama de lanzamiento y al mismo tiempo permitir el desarrollo activo en las ramas de características y las predeterminadas .

En cuanto a la integración continua, hacemos dos cosas:

  • Una integración "siempre activa" que supervisa el estado predeterminado
  • Nuevas integraciones para cada rama de lanzamiento

El trabajo de bifurcación predeterminado nos permite saber que nuestro árbol de origen principal siempre es estable: los trabajos de bifurcación de lanzamiento nos permiten saber que esas bifurcaciones son estables y nos proporcionan el resultado de compilación que necesitamos para impulsar una liberación a producción.

* Nuestra definición de "hecho" es que la función está actualizada con fusiones por defecto y ha sido aprobada en la revisión del código.

Chris Phillips
fuente
1

Si se muda a un DVCS, como Hg, no solo obtiene la "parte distribuida", sino que también obtiene toda la potencia de una buena ramificación y fusión.

Teniendo en cuenta que ahora tendrá un buen rastreador de problemas y un buen SCM ... ¿por qué no crear una rama para cada tarea?

El patrón de "ramificación por tarea" no es nuevo (consulte el libro de Berczuk) pero definitivamente es algo para probar.

Lo expliqué en detalle aquí , y los pros y los contras de CI frente a "controlado" aquí .

psantosl
fuente
Diría "mejor" en lugar de "bueno", ya que feliz, entusiasta y exitosamente realicé la ramificación y fusión de funciones y mantenimiento con subversión (-:
Murph