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

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.