estrategias de paquete y versión en un entorno de múltiples repositorios

13

Somos una empresa pequeña con varios equipos que administran sus propios repositorios git. Esta es una plataforma web y los artefactos de cada equipo se implementan al final del día para las pruebas nocturnas. Estamos tratando de formalizar el proceso en torno al versionado y empaquetado.

Cada equipo tiene una rama maestra en la que realizan el desarrollo del día a día. Los miembros de control de calidad de cada equipo quieren que los artefactos de los cambios de su equipo se implementen en un banco de pruebas donde el chef combina todos los componentes. Los artefactos son tarballs, pero me gustaría convertirlos en RPM para que podamos pensar y razonar acerca de las versiones correctamente.

El proceso de lanzamiento implica cortar una rama de lanzamiento de la rama de desarrollo (maestro en la mayoría de los casos) de cada uno de los repositorios git. Esto se otorga luego al control de calidad que ejecuta pruebas y firma en un conjunto de artefactos.

Por ejemplo, este es un repositorio git típico con sus ramas de versión asociadas:

 0-0-0-0-0-0-0-0-0-0 (master)
   |           |
   0           0
 (rel-1)       |
               0
            (rel-2)

Estoy atascado tratando de encontrar un esquema para realizar el control de versiones de paquetes provenientes de sucursales de desarrollo. No queremos etiquetar en exceso la rama maestra de cada repositorio y restringir las etiquetas para liberar ramas solamente. Pero deberíamos poder consultar los paquetes implementados en las máquinas de prueba utilizando la semántica estándar de yum / rpm. ¿Cómo se verían las versiones de desarrollo cuando la rama maestra no tiene etiquetas? Entiendo que git describe puede brindarme una representación útil de una versión de compilación, pero eso funciona bien cuando se etiquetan varios puntos de lanzamiento en la rama.

EDIT1: en respuesta a la respuesta de @ Urban48

Pensé que debería explicar nuestro proceso de lanzamiento un poco más. Para los fines de esta discusión, supongamos que tenemos la rama master en todos los repositorios. La rama master se considera la rama de desarrollo y se implementa en un entorno de control de calidad habilitado para CI-CD automatizado. Aquí es donde se ejecuta un subconjunto de pruebas nocturnas para garantizar la estabilidad del maestro. Nos fijamos en este conjunto de trabajos antes de cortar una sucursal de lanzamiento. Nuestras sucursales de liberación son de corta duración. Por ejemplo, después de cortar una rama de lanzamiento (de un maestro estable), se ejecuta una regresión completa, se realizan arreglos y se implementan en producción. Esto toma alrededor de una semana para hacerlo. Lanzamos casi cada dos semanas a producción.

Nuestras ramas de características están siempre cortadas del maestro y se someten a una cierta cantidad de pruebas de desarrollador antes de fusionarse con el maestro en el que se someten a las verificaciones de estabilidad de CI-CD.

Las revisiones se realizan en sucursales de revisión (recortadas de sucursales de lanzamiento) y se implementan con pruebas de impacto mínimo en producción.

Nuestra estrategia de control de versiones para las sucursales de lanzamiento y revisión sigue a semver. Las ramas de lanzamiento durante el ciclo de control de calidad pasan por versiones como v2.0.0-rc1 , v2.0.0-rc2 y, finalmente, después de que el control de calidad se convierta en v2.0.0 .

A veces hacemos lanzamientos punteados para pequeñas características que se fusionan para liberar sucursales (y luego para dominar) donde las versiones se convierten en v2.1.0 . Y las revisiones asumen el patrón v2.1.1 .

Sin embargo, la pregunta no es sobre la versión de estas ramas. Preferiría no cambiar por completo este esquema de versiones. El único cambio que se produce para la rama de desarrollo es decir. dominar. ¿Cómo puedo indicar de forma fiable en el entorno de CI-CD qué versión existe con la versión anterior en producción? Esto se haría idealmente mediante el etiquetado inteligente de git, pero se prefiere algo que no etiquete excesivamente la rama maestra.

    
pregunta tsps 18.11.2016 - 04:49

3 respuestas

3

Hmm, bueno, tengo un ejemplo de .net que podría ser agnóstico en tecnología.

Solo haré un resumen rápido.

  • repositorio de git por componente con estrategia de bifurcación de gitflow

  • todos los compromisos para desarrollar desencadenan una construcción de ciudad de equipo

  • la creación de teamcity modifica la versión con manual mayor menor + el número de compilación en AssemblyInfo.cs, es decir, 1.1.hotfix.build

  • teamcity activa el empaquetado de nuget utilizando el mismo número de versión para las bibliotecas publicadas de nuget

  • Octopus despliega la compilación terminada en qa para las pruebas manuales (asumiendo que todas las pruebas pasan)

  • si todo está bien, implementa manualmente la versión para producción a través de Octopus.

Ahora, esto significa que obtienes MUCHOS paquetes versionados flotando. Experimentamos con el uso del indicador -prerelease, pero esto requería un paquete de traslado manual adicional desde el paso previo al paso "normal" y un requisito para reconstruir los componentes que dependían de ellos.

La clave es la versión única de cada compilación a través de algún proceso central.

Entonces estás en la situación de 'hmm, ¿qué versiones quiero' en lugar de 'omg, ¿qué versión tengo?'

Editar: re comentarios.

Sólo para subrayar esa cosa clave realmente. Decida qué rama constituye el software completado y la versión TODOS se compromete a ello. solo implemente software versionado desde esta rama.

Sin embargo, mi opinión es que necesita abordar su estrategia de bifurcación.

  • no versión de las características (o cualquier dev) ramas.
  • hacer la versión maestra
  • solo usa paquetes del maestro
respondido por el Ewan 22.11.2016 - 17:58
1

Permítame ofrecer un flujo de trabajo alternativo, que puede resolver su problema de versiones, o simplemente ayudarlo a pensar en otras formas de solución.

Un poco de filosofía primero ..
(Estoy haciendo algunas suposiciones sobre su flujo de trabajo, corríjame si me equivoco)

  1. Las pruebas se ejecutan de forma retroactiva :

    Salga de maser a la rama de características, luego conviértalo en un artefacto para la prueba por control de calidad.
    el problema es : ¿qué pasa si las pruebas fallan, entonces master puede ser roto!

    efectos secundarios:

    • Hace que los desarrolladores no confíen en master

    • Ya que se ramifica desde el maestro para liberar ramas, ¿qué sucede si se rompe la versión anterior? detiene su nueva integración de funciones hasta que se vuelva a arreglar el maestro.

    • cuando el error se corrige en la rama de lanzamiento, fusionar de nuevo a master puede crear conflictos de combinación. (y no nos gustan los conflictos)

  2. pequeñas fusiones y correcciones de código :

    Es difícil hacer un seguimiento de todos los códigos que se fusionan con master , como pequeñas correcciones o cambios que no son parte de una característica determinada.

    efectos secundarios:

    • el desarrollador no está seguro de si debería modificar esta pequeña solución ahora o más adelante.

    • ¿Debo también versionar esta nueva solución?

    • En cualquier momento, no está claro cuál es el estado de la rama master y qué código está flotando allí

    • algo rompió la compilación, eso no es parte de la nueva característica. y es realmente difícil rastrear de dónde vino

Mi idea para el flujo de trabajo de git es la siguiente:

bifurque fuera de master para el desarrollo de nuevas características, como lo hace ya. pero ahora, en lugar de liberarse de esta rama recién creada, haga que esta característica se seleccione y se combine en la rama release .

Ahora tiene un mejor control sobre lo que está ocurriendo en un lanzamiento determinado.
Ahora es realmente fácil aislar las versiones de desarrollo y las versiones estables.

Puedes seguir construyendo artefactos a partir de esas ramas características para el control de calidad.
Si todo está bien, fusione esa característica de nuevo a master , y seleccione esta característica / corrección de errores / corrección en la rama de lanzamiento.

versiones
La versión de las ramas de características puede usar alguna convención de nombres como 1.2.3-rc.12345

las versiones en la rama release solo usarán 1.2.3 ( 1.2.3 > 1.2.3-rc.12345 también es una cosa menos de qué preocuparse)

Este flujo de trabajo soluciona los problemas mencionados anteriormente y más.
También propone una estrategia de versionamiento sensata, y la mayor parte de este ciclo de lanzamiento puede ser automatizado.

Espero que te ayude de alguna manera, con mucho gusto discutiré cualquier caso de ventaja que puedas encontrar.

p.s:
Pido disculpas por mi inglés, no es mi idioma principal.

    
respondido por el Urban48 23.11.2016 - 11:09
0

Su proceso parece muy complicado y obtener un poco de etiquetas parece inevitable.

Dos ideas vienen a la mente:

  1. Usted trata la rama "maestra" como lo que normalmente tenemos en la rama "desarrollar". Esto contamina mucho la rama del mensaje.

  2. Cuando el control de calidad termine con su trabajo, puede hacer que el servidor de compilación / CI cree un informe (por ejemplo, un archivo de texto) con las etiquetas de todos los repositorios en uso. Ahora tendrá un archivo con las versiones que se pueden publicar en el repositorio. Luego etiqueta la rama solo con la versión de lanzamiento y, si desea verificar las versiones de sus componentes individuales, puede consultar el informe.

respondido por el John Kouraklis 29.11.2016 - 03:21

Lea otras preguntas en las etiquetas