Buen flujo de trabajo para el desarrollo de software con scrum e integración continua

16

Estoy estudiando un enfoque para comprender mejor cómo el flujo de trabajo de integración continua se adapta mejor en una empresa de desarrollo de software con el método scrum.

Estoy pensando en algo como esto:

ingrese la descripción de la imagen aquí

¿Sería un buen flujo de trabajo?

Daniel Ribeiro
fuente

Respuestas:

11

Estás en el camino, pero ampliaría un poco tu diagrama:

Una versión ampliada del flujo de trabajo de CI.  Es bastante difícil de explicar en una etiqueta alternativa corta.

Básicamente (si su control de versión lo permite, es decir, si está en hg / git), desea que cada par desarrollador / desarrollador tenga su propia rama "personal", que contiene una sola historia de usuario en la que están trabajando. Cuando completan la función, necesitan ingresar a una rama central, la rama "Liberar". En este punto, desea que el desarrollador obtenga una nueva sucursal, para lo siguiente en lo que necesita trabajar. La rama de la característica original debe dejarse como está, de modo que cualquier cambio que deba realizarse se pueda hacer de forma aislada (esto no siempre es aplicable, pero es un buen punto de partida). Antes de que un desarrollador vuelva a trabajar en una rama de características anterior, debe extraer la última rama de lanzamiento, para evitar problemas de fusión extraños.

En este punto, tenemos un posible candidato de lanzamiento en forma de la rama "Release", y estamos listos para ejecutar nuestro proceso de CI (en esa rama, obviamente puede hacer esto en cada rama de desarrollador, pero esto es bastante raro en equipos de desarrollo más grandes, ya que abarrota el servidor CI). Este podría ser un proceso constante (este es idealmente el caso, el CI debe ejecutarse cada vez que se cambia la rama "Release"), o puede ser nocturno.

En este punto, querrá ejecutar una compilación y obtener un artefacto de compilación viable del servidor CI (es decir, algo que podría implementar de manera factible). ¡Puedes saltarte este paso si estás usando un lenguaje dinámico! Una vez que esté construido, querrá ejecutar sus pruebas unitarias, ya que son la base de todas las pruebas automatizadas en el sistema; es probable que sean rápidos (lo cual es bueno, ya que el objetivo de CI es acortar el ciclo de retroalimentación entre el desarrollo y las pruebas), y es poco probable que necesiten una implementación. Si pasan, querrá implementar automáticamente su aplicación en un servidor de prueba (si es posible) y ejecutar las pruebas de integración que tenga disponibles. Las pruebas de integración pueden ser pruebas de IU automatizadas, pruebas de BDD o pruebas de integración estándar utilizando un marco de prueba de unidad (es decir, "unidad"

En este punto, debe tener una indicación bastante completa de si la compilación es viable. El paso final que normalmente configuraría con una rama de "Lanzamiento" es hacer que implemente automáticamente el candidato de lanzamiento en un servidor de prueba, para que su departamento de control de calidad pueda hacer pruebas de humo manuales (esto a menudo se realiza todas las noches en lugar de realizar el registro de entrada) para evitar estropear un ciclo de prueba). Esto solo da una indicación humana rápida de si la compilación es realmente adecuada para un lanzamiento en vivo, ya que es bastante fácil perder cosas si su paquete de prueba no es completo, e incluso con una cobertura de prueba del 100%, es fácil perderse algo que puede No (no) debe probarse automáticamente (como una imagen mal alineada o un error ortográfico).

Esto es, en realidad, una combinación de Integración Continua y Despliegue Continuo, pero dado que el enfoque en Agile está en la codificación ajustada y las pruebas automatizadas como un proceso de primera clase, debe aspirar a obtener un enfoque lo más completo posible.

El proceso que describí es un escenario ideal, hay muchas razones por las que puede abandonar partes de él (por ejemplo, las ramas de desarrollador simplemente no son factibles en SVN), pero desea apuntar a la mayor cantidad posible .

En cuanto a cómo el ciclo Sprint de Scrum se ajusta a esto, lo ideal es que desees que tus lanzamientos sucedan con la mayor frecuencia posible, y no dejarlos hasta el final del sprint, para obtener comentarios rápidos sobre si una característica (y construir en su conjunto) ) es viable para pasar a la producción, es una técnica clave para acortar su ciclo de retroalimentación al propietario del producto.

Ed James
fuente
1
Estoy de acuerdo con mucho de lo que dices, pero yo (personalmente) trataría de alentar a las personas juntas en la misma rama siempre que sea posible.
William Payne
@WilliamPayne Siendo realistas, si está utilizando un DVCS, las personas nunca están en la misma rama (a menos que estén literalmente trabajando en la misma máquina), ya que se "ramifica" cada vez que clona. La "Rama" equivalente a la que tendría en un VCS estándar es la rama de fusión que tendrá por función (para que Dev B y Dev C puedan trabajar en las ramas de la Rama C y luego ingrese a la Rama C cuando estén listas, si ambos estaban trabajando en la función C). Los beneficios de tener más sucursales son menos tiempo dedicado a solucionar problemas de fusión, ya que la fusión en HG / Git es casi completamente indolora, pero una carrera de empujar / tirar no lo es.
Ed James
1
A riesgo de que esto se convierta en una guerra de llamas, creo que los problemas debidos a conflictos de fusión son con frecuencia exagerados (aunque reconozco que existen). Además, creo que el cambio a las herramientas DVCS (aunque está justificado por otras consideraciones) no debe justificarse simplemente sobre la base de evitar conflictos de fusión: en cualquier otra cosa que no sea un esfuerzo de desarrollo abierto / comunitario, estos son síntomas de mala comunicación y coordinación en El equipo de desarrollo. Cambiar a un DVCS solo oculta un problema más profundo y significativo con la comunicación del equipo.
William Payne
1
Todavía creo firmemente en la necesidad de un repositorio "diario" (troncal) al que los desarrolladores se comprometan mientras trabajan. Integrar su trabajo continuamente es de lo que se trata la Integración Continua, después de todo. Para mí, la ramificación es algo que se hace como último recurso, no por el peligro de conflictos de fusión, sino porque los desarrolladores pierden la noción de lo que el otro está haciendo y comienzan a trabajar en silos. Se trata del trabajo en equipo, la comunicación y los factores humanos, no las limitaciones de las herramientas que utilizamos. Para realizar una integración continua, necesita una comunicación continua, que la ramificación no admite.
William Payne
1
@WilliamPayne No voy a debatir los méritos relativos de DVCS vs VCS con usted (al menos no a través de los comentarios), hay beneficios significativos al usar un DVCS si obtiene el flujo de trabajo correcto, mientras que con un flujo de trabajo más tradicional VCS hará un excelente trabajo (en mi experiencia). Sin embargo, le diré que desde que me cambié a un DVCS, mi equipo ha experimentado un cambio de desarrollo significativamente más rápido y despliegues más robustos. El infierno de fusión al final del proyecto que muchas personas todavía experimentan hasta el día de hoy se ha eliminado casi por completo de nuestro proceso de desarrollo.
Ed James
4

Conceptualmente si. Sin embargo, un diagrama no captura muchos puntos importantes como:

  1. examen de la unidad
  2. confirmaciones incrementales
  3. la puesta en escena se implementa a menudo, la producción generalmente no.
Jeanne Boyarsky
fuente
4

Es posible que desee dibujar un sistema más amplio para el diagrama. Consideraría agregar los siguientes elementos:

Muestre sus entradas al sistema, que se envían a los desarrolladores. Llámalos requisitos, correcciones de errores, historias o lo que sea. Pero actualmente su flujo de trabajo supone que el espectador sabe cómo se insertan esas entradas.

Mostrar los puntos de control a lo largo del flujo de trabajo. ¿Quién / qué decide cuándo se permite un cambio en trunk / main / release-branch / etc ...? ¿Qué codetrees / proyectos se construyen en el CIS? ¿Hay un punto de control para ver si la construcción se rompió? ¿Quién libera de CIS a la puesta en escena / producción?

Relacionado con los puntos de control está identificar cuál es su metodología de ramificación y cómo encaja en este flujo de trabajo.

¿Hay un equipo de prueba? ¿Cuándo están involucrados o notificados? ¿Se realizan pruebas automatizadas en el CIS? ¿Cómo se retroalimentan las roturas en el sistema?

Considere cómo mapearía este flujo de trabajo a un diagrama de flujo tradicional con puntos de decisión e insumos. ¿Ha capturado todos los puntos de contacto de alto nivel que se necesitan para describir adecuadamente su flujo de trabajo?

Creo que su pregunta original intenta hacer una comparación, pero no estoy seguro de qué aspecto (s) está tratando de comparar. La integración continua tiene puntos de decisión al igual que otros modelos SDLC, pero pueden estar en diferentes puntos del proceso.


fuente
2

Utilizo el término "Automatización del desarrollo" para abarcar todas las actividades automatizadas de compilación, generación de documentación, prueba, medición de rendimiento e implementación.

Por lo tanto, un "servidor de automatización de desarrollo" tiene un cometido similar, pero algo más amplio que un servidor de integración continua.

Prefiero utilizar scripts de automatización de desarrollo impulsados ​​por enlaces posteriores al compromiso que permiten que tanto las ramas privadas como el tronco de desarrollo central se automaticen, sin requerir una configuración adicional en el servidor CI. (Esto excluye el uso de la mayoría de las GUI de servidor CI disponibles en el mercado que conozco).

El script posterior a la confirmación determina qué actividades de automatización ejecutar en función del contenido de la propia sucursal; ya sea leyendo un archivo de configuración posterior a la confirmación en una ubicación fija en la rama o detectando una palabra en particular (uso / auto /) como componente de la ruta a la rama en el repositorio (con Svn)).

(Esto es más fácil de configurar con Svn que Hg).

Este enfoque permite que el equipo de desarrollo sea más flexible sobre cómo organizan su flujo de trabajo, lo que permite que CI respalde el desarrollo en sucursales con una sobrecarga administrativa mínima (cercana a cero).

William Payne
fuente
1

Hay una buena serie de publicaciones sobre integración continua en asp.net que pueden resultarle útiles, cubre bastante terreno y flujos de trabajo que se ajustan a lo que parece que está haciendo.

Su diagrama no menciona el trabajo realizado por el servidor de CI (pruebas unitarias, cobertura de código y otras métricas, pruebas de integración o compilaciones nocturnas), pero supongo que todo está cubierto en la etapa "Servidor de integración continua". Sin embargo, no tengo claro por qué la caja de CI volvería al repositorio central. Obviamente, necesita obtener el código, pero ¿por qué necesitaría enviarlo de vuelta?

CI es una de esas prácticas recomendadas por varias disciplinas, no es exclusivo de scrum (o XP) pero, de hecho, diría que hay beneficios disponibles para cualquier flujo, incluso los no ágiles, como la cascada (¿tal vez ágil?) . Para mí, los beneficios clave son el ciclo de retroalimentación ajustado, usted sabe muy rápidamente si el código que acaba de confirmar funciona con el resto de la base de código. Si está trabajando en sprints y tiene sus stand-ups diarios, entonces poder consultar el estado o las métricas de la compilación de las últimas noches en el servidor de CI es definitivamente una ventaja y ayuda a enfocar a las personas. Si el propietario de su producto puede ver el estado de la compilación, un gran monitor en un área compartida que muestra el estado de sus proyectos de compilación, entonces realmente ha reforzado ese ciclo de retroalimentación. Si su equipo de desarrollo se compromete con frecuencia (más de una vez al día e idealmente más de una vez por hora), entonces se reducen las posibilidades de que se encuentre con un problema de integración que lleva mucho tiempo resolver, pero si lo hacen, está claro que todo y puedes tomar las medidas que necesites, todos parando para lidiar con la compilación rota, por ejemplo. En la práctica, probablemente no alcanzará muchas compilaciones fallidas que demoran más de unos minutos en descubrir si se está integrando con frecuencia.

Dependiendo de sus recursos / red, puede considerar agregar diferentes servidores finales. Tenemos una compilación de CI que se desencadena por un compromiso con el repositorio y suponiendo que compila y pasa todas sus pruebas y luego se implementa en el servidor de desarrollo para que los desarrolladores puedan asegurarse de que funcione bien (¿podría incluir selenio u otras pruebas de IU aquí? ) Sin embargo, no todas las confirmaciones son una compilación estable, por lo que para desencadenar una compilación en el servidor de ensayo tenemos que etiquetar la revisión (usamos mercurial) que queremos que se compile e implemente, de nuevo, todo esto se automatiza y se activa simplemente comprometiéndose con un determinado etiqueta. Ir a producción es un proceso manual; puedes dejarlo tan simple como forzar una compilación, el truco es saber qué revisión / compilación quieres usar, pero si tuviera que etiquetar la revisión de manera adecuada, el servidor de CI puede verificar la versión correcta y hacer lo que sea necesario. Podría estar usando MS Deploy para sincronizar los cambios en los servidores de producción, o empaquetarlo y colocar el zip en algún lugar listo para que un administrador lo implemente manualmente ... depende de qué tan cómodo esté con eso.

Además de subir una versión, también debe considerar cómo lidiar con el fracaso y bajar una versión. Esperemos que no suceda, pero podría haber algún cambio en sus servidores que significa que lo que funciona en UAT no funciona en la producción, por lo que libera su versión aprobada y falla ... siempre puede adoptar el enfoque de identificar el error, agregue un poco de código, confirme, pruebe, implemente en producción para solucionarlo ... o podría envolver algunas pruebas adicionales en torno a su lanzamiento automatizado a producción y si falla, entonces se revierte automáticamente.

CruiseControl.Net usa xml para configurar las compilaciones, TeamCity usa asistentes, si pretendes evitar especialistas en tu equipo, entonces la complejidad de las configuraciones xml puede ser otra cosa a tener en cuenta.

Simon Martin
fuente
0

Primero, una advertencia: Scrum es una metodología bastante rigurosa. He trabajado para un par de organizaciones que han tratado de usar Scrum, o enfoques similares a Scrum, pero ninguno de ellos realmente estuvo cerca de usar la disciplina completa en su totalidad. Según mis experiencias, soy un entusiasta ágil, pero un (reticente) escéptico de Scrum.

Según tengo entendido, Scrum y otros métodos ágiles tienen dos objetivos principales:

  • El primero es proporcionar un mecanismo explícito para gestionar los riesgos y el descubrimiento continuo de riesgos.
  • El segundo es proporcionar un mecanismo estructurado para la comunicación con las partes interesadas, el descubrimiento de requisitos y la gestión de requisitos.

El primer objetivo (gestión de riesgos) se logra a través del desarrollo iterativo; cometer errores y aprender lecciones rápidamente, lo que permite al equipo desarrollar la comprensión y la capacidad intelectual para reducir el riesgo y avanzar hacia una solución de riesgo reducido con una solución "austera" de bajo riesgo que ya está en la bolsa.

La automatización del desarrollo, incluida la integración continua, es el factor más crítico en el éxito de este enfoque. El descubrimiento de riesgos y el aprendizaje de lecciones deben ser rápidos, libres de fricciones y libres de factores sociales confusos. (Las personas aprenden MUCHO más rápido cuando se trata de una máquina que les dice que están equivocadas en lugar de otro humano; los egos solo se interponen en el camino del aprendizaje).

Como probablemente pueda ver, también soy un fanático del desarrollo basado en pruebas. :-)

El segundo objetivo tiene menos que ver con la automatización del desarrollo y más con los factores humanos. Es más difícil de implementar porque requiere la aceptación de la parte delantera del negocio, que es poco probable que vean la necesidad de la formalidad.

La automatización del desarrollo puede tener un papel aquí, ya que la documentación generada automáticamente y los informes de progreso pueden usarse para mantener a las partes interesadas fuera del equipo de desarrollo continuamente actualizadas con el progreso, y los radiadores de información que muestran el estado de construcción y las suites de prueba de aprobación / reprobación pueden usarse para comunicar el progreso en el desarrollo de funciones, ayudando (con suerte) a apoyar la adopción del proceso de comunicaciones Scrum.

Entonces, en resumen:

El diagrama que usó para ilustrar su pregunta solo captura parte del proceso. Si quisiera estudiar agile / scrum y CI, diría que es importante considerar los aspectos más amplios de factores sociales y humanos del proceso.

Debo terminar golpeando el mismo tambor que siempre hago. Si está intentando implementar un proceso ágil en un proyecto del mundo real, el mejor indicador de su posibilidad de éxito es el nivel de automatización que se ha implementado; Reduce la fricción, aumenta la velocidad y allana el camino hacia el éxito.

William Payne
fuente