Creo que este artículo, A Successful Git Branching Model , es muy conocido entre los usuarios experimentados de DVCS.
Lo uso hg
principalmente, pero diría que esta discusión está bien para cualquier DVCS.
Nuestro flujo de trabajo actual es que cada desarrollador clona el repositorio principal. Escribimos código en nuestro propio repositorio local, ejecutamos pruebas y, si todo va bien, lo empuja al maestro.
Por lo tanto, queremos configurar servidores CI como Jenkins y mejorar nuestro flujo de trabajo con el futuro sistema de aprovisionamiento (chef, puppet, ansible, etc.).
Parte real
Bueno, el modelo presentado anteriormente funciona bien, pero las ramas pueden romper CI. La rama de la característica debe sincronizarse con el origen (según el artículo, sería una development
rama) para hacer que CI y la fusión sean suaves, ¿verdad?
Digamos que Alice y Bob están trabajando en dos características. Pero Alice terminó al día siguiente. La característica de Bob lleva una semana. Cuando Bob termina, sus cambios están desactualizados (tal vez Alice refactorizó / renombra algunas clases).
Una solución es cada mañana que los desarrolladores deben sacar master/origin
para verificar si hay algún cambio. Si Alice se comprometió, Bob debería ingresar y fusionarse en su espacio de trabajo para que su rama de características esté actualizada.
- ¿Es esta una buena manera?
- ¿Deberían existir estas ramas en el repositorio principal (no en el clon local?) ¿Es decir, todo desarrollador debe tener privilegios de compromiso para el repositorio principal en GitHub / Bitbucket para poder crear una nueva sucursal? ¿O esto se hace localmente?
- Por último, el modelo presentado por el artículo debería romper el CI si las ramas no están sincronizadas con el
origin/master
. Dado que queremos hacer una compilación nocturna, ¿deberían los desarrolladores extraer y fusionar antes de dejar el trabajo, y hacer que CI se ejecute también en cada rama de características?
En respuesta a 1)
Cualquier forma que funcione es una buena manera. Sin embargo : toda la premisa de la integración continua es integrarse continuamente . La idea es detectar errores de integración no solo lo antes posible, sino también dentro del ciclo de retroalimentación del desarrollo, es decir, mientras que todos los detalles del código bajo prueba están dentro de la memoria a corto plazo del desarrollador que realiza los cambios. Esto significa que, en circunstancias normales y cotidianas, el trabajo debe integrarse en las ramas de características en cada confirmación, tal vez una vez cada 15 minutos más o menos. Para reiterar: El objetivo principal de la integración continua es exponer los errores de integración, mientras que todos los detalles se encuentran en la memoria a corto plazo del desarrollador (s) que realiza los cambios.
2)
En su mayoría, las sucursales se crean en Mercurial mediante la clonación de repositorios, por lo que no es necesario que otorgue privilegios de confirmación de desarrollador al repositorio principal. Sin embargo, es probable que desee ofrecer a los desarrolladores la capacidad de crear repositorios clonados en el servidor de integración continua, ya que no siempre es posible ejecutar pruebas localmente. (Una vez tuve un sistema de CI en el que las pruebas unitarias tardaron 8 horas en ejecutarse en un clúster de 128 núcleos). No hace falta decir que los desarrolladores no pudieron ejecutar pruebas localmente.
3)
Si tiene los recursos computacionales para ello, sí, los desarrolladores deben estar completamente actualizados con la línea principal de desarrollo en todo momento, particularmente antes de dejar el trabajo, y debe ejecutar pruebas nocturnas en todas las líneas de desarrollo (aunque la mayoría de los sistemas de CI no hagas esto fácil).
fuente
Así es como puede hacerlo: ramificación de características.
Lo importante aquí es que tendrá 0 conflictos en la rama predeterminada cuando combine su rama de características en ella, y todas sus pruebas pasan .
Con este flujo de trabajo simple, siempre tendrá una ramificación predeterminada impecable y estable, ahora hará lo mismo para las ramificaciones de lanzamiento, pero se integrará de manera predeterminada . Si necesita integrar las revisiones directamente en las ramas de lanzamiento, puede hacerlo omitiendo la rama predeterminada, pero de nuevo, solo seleccionando las ramas que se acaban de actualizar desde la rama de destino y no tienen conflictos y sus pruebas unitarias pasan.
fuente