
Henry Ford dijo una vez: "El mejor auto es un auto nuevo". Entonces, en el grupo de compa帽铆as Tinkoff pensamos en los lanzamientos de software. La inercia en el proceso de entrega de caracter铆sticas y soluciones urgentes tarde o temprano conduce a una gran deuda t茅cnica para el cliente y, a menudo, termina con el estancamiento del proyecto en su conjunto.
Garantizar un indicador de tiempo de comercializaci贸n elevado mientras se mantiene la calidad no es una tarea f谩cil. Desde mi punto de vista, es imposible construir inmediatamente rieles en los que sea posible entregar cambios r谩pida y convenientemente muchos meses despu茅s del inicio. El crecimiento de un proyecto generalmente va acompa帽ado de un aumento en la cantidad de personas que trabajan en 茅l, lo que significa que crea una fuente potencial de caos en sus lanzamientos.
No vale la pena considerar nuestra experiencia como instrucciones para el 茅xito, pero varias ideas me parecieron lo suficientemente interesantes como para compartirlas con usted. Empecemos
El punto de partida de nuestra historia es t茅cnicamente el siguiente. El sistema consta de varios servicios, cuya base de c贸digo es revisada por unas 30 personas, varios equipos que est谩n divididos por 谩reas de negocio, por ejemplo, servicio a personas f铆sicas y jur铆dicas. Intentar茅 ignorar los detalles t茅cnicos y arquitect贸nicos del proyecto para centrarme en el proceso de lanzamiento en s铆.
Trabajamos en Gitflow , por lo que el art铆culo ser谩 principalmente interesante para aquellos que eligieron este m茅todo de entrega en particular.
Los problemas
El primer problema que encontramos est谩 relacionado con la automatizaci贸n insuficiente de los procesos . La implementaci贸n de todas las actividades de lanzamiento en nuestro equipo est谩 vinculada al rol de un administrador de lanzamiento (RM).
Aqu铆 hay algunos de ellos:
- Dejar ramas de lanzamiento y crear etiquetas.
- Fusionarse con master y desarrollar sucursales.
- Cree y despliegue artefactos que se incluyen en la versi贸n.
- Comunicaci贸n con especialistas involucrados en el proceso, por ejemplo, con QA o administradores.
Estas tareas rutinarias requieren m谩s y m谩s recursos a medida que el proyecto se expande (en nuestro caso, un aumento en el n煤mero de servicios), por lo que el primer paso es automatizar todo lo que se puede automatizar. Nos integramos con la herramienta CI / CD para desviar y fusionar ramas de lanzamiento, lanzar compilaciones de prueba e implementar artefactos con el bot贸n; con herramienta de seguimiento de tareas y mensajer铆a corporativa para la notificaci贸n oportuna del participante responsable del siguiente paso; por ejemplo, cambie el estado de la tarea y configure el enlace para enviar una notificaci贸n.
Trabajos de automatizaci贸n de Gitflow Un ejemplo de notificaci贸n en un messenger El administrador de versiones a煤n tendr谩 que resolver manualmente los posibles conflictos derivados de la fusi贸n de sucursales, pero las versiones r谩pidas y frecuentes deber铆an reducir su n煤mero a nada.
El siguiente problema es la prueba .
Uno de los criterios de compilaci贸n para nosotros es la ejecuci贸n exitosa de las pruebas. Es habitual dividir las pruebas en al menos dos tipos: unidad e integraci贸n.
Las pruebas unitarias le permiten verificar la correcci贸n de los m贸dulos individuales del c贸digo fuente del programa, que en la pr谩ctica se reduce a verificar uno o m谩s m茅todos que tienen una conexi贸n l贸gica obvia.
Las pruebas de integraci贸n generalmente verifican la operatividad de una cascada completa de dichos m贸dulos, es decir, el funcionamiento de una caracter铆stica completa en el lado del cliente. Por ejemplo, si se implement贸 una interfaz de descanso en una tarea, verificaremos la operatividad de la autorizaci贸n, la deserializaci贸n de la solicitud en s铆, la validez de los campos transmitidos, la integraci贸n con otros servicios y bases de datos, as铆 como la l贸gica de negocios en s铆. A primera vista, puede parecer que tales pruebas son muy autosuficientes y pueden cubrir todas las 谩reas problem谩ticas potenciales. No es necesario comprender c贸mo funciona cada ladrillo individual, y la interfaz llamada encapsula toda la l贸gica para obtener una respuesta simple en la salida: si funciona o no.
De hecho, crean una serie de problemas diferidos, estos son algunos de ellos:
- La participaci贸n de una gran cantidad de componentes probados afecta proporcionalmente el tiempo de montaje y la ejecuci贸n de tales pruebas.
- Encapsular la l贸gica de la prueba a menudo lleva al hecho de que es dif铆cil garantizar la exactitud del resultado de la prueba. A menudo personalizamos la prueba para el resultado, y a煤n m谩s a menudo el resultado coincide con las expectativas debido a los efectos secundarios aleatorios.
- La relevancia de los datos de prueba se pierde.
- Las integraciones con sistemas de terceros, especialmente en entornos de prueba, a menudo caen. Esto niega el tiempo dedicado a la ejecuci贸n, ya que no siempre es obvio: esta es una ca铆da o falla temporal causada por nuestros cambios.
Para la mayor铆a de los problemas, ya se ha encontrado una soluci贸n. Pero, como de costumbre, las soluciones no vienen sin restricciones adicionales o nuevos problemas.
Elegir las pruebas correctas para usted e implementarlas correctamente es una tarea muy dif铆cil. Adem谩s, es importante lograr un equilibrio entre la calidad de la cobertura y la velocidad de construcci贸n para optimizar sus lanzamientos.
En nuestro caso, nos decidimos por un h铆brido. Continuamos planteando todos los componentes necesarios para una prueba de caracter铆sticas completas, lavando simult谩neamente todas las integraciones posibles. Para guardar los contratos de API, utilizamos Pact y para verificar la integraci贸n con la base de datos: Testcontainers .
Como resultado, este enfoque para escribir pruebas result贸 en una soluci贸n al tercer problema: mucho tiempo para la prueba manual de una tarea . La estabilidad de las pruebas h铆bridas ha llevado a la idea de atraer a un ingeniero de control de calidad en la etapa de especificar la tarea para compilar los casos de prueba; esto permitir谩 que se omitan en la etapa de prueba manual. La integraci贸n con productos 煤tiles como TestRail y Allure se ha convertido en una especie de puente entre el desarrollador y el probador. Se crea un contrato, cuya ejecuci贸n se refleja paso a paso en el informe generado durante el ensamblaje de prueba.
TestRail. Detalles de compilaci贸n de prueba TestRail. Casos de prueba implementados por el desarrollador Encanto Informe de compilaci贸n de prueba autom谩tica Encanto Informaci贸n para cada prueba en ejecuci贸n y detalles de ejecuci贸n paso a paso. Queda por conectar los informes a su herramienta de seguimiento de tareas para el seguimiento transparente de tareas. Una historia clara tambi茅n reducir谩 el tiempo que lleva compilar e implementar pruebas para futuras tareas relacionadas.
Jira Casos de prueba conectados autom谩ticamente a la tarea De esta manera, los ingenieros de control de calidad ahorran suficiente tiempo para concentrarse en probar casos excepcionales e integrarse con otros sistemas.
El 煤ltimo problema est谩 relacionado con esto. Para las pruebas manuales, todas las tareas se fusionan desde las ramas de caracter铆sticas en desarrollar y lanzar una implementaci贸n en el banco de pruebas.
En primer lugar, con este enfoque, no se puede hablar de pruebas puras de la funci贸n, ya que en paralelo los cambios relacionados de otros desarrolladores pueden desarrollarse.
En segundo lugar, al liberar la rama de lanzamiento, puede resultar que el control de calidad no haya tenido tiempo de probar algunas de las tareas. Hay una opci贸n: revertir los cambios afectados por estas tareas o ralentizar el lanzamiento hasta el final de la prueba.
Tendr谩 que hacer esa elecci贸n todo el tiempo, a menos que a铆sle su entorno de prueba . Es importante que no haya cambios en el componente bajo prueba que no sean los realizados por la tarea. En nuestro caso, necesitamos poder recoger uno o m谩s servicios cuyas sucursales hayan recibido cambios y administrar el enrutamiento dentro del cl煤ster enviando solo las solicitudes que necesitamos de QA a estas instancias. La tarea es complicada si ya se utilizan mecanismos de equilibrio en el cl煤ster, que tambi茅n deben tenerse en cuenta.
Al aprovechar esta oportunidad, comenzamos a realizar pruebas manuales directamente en ramas de caracter铆sticas separadas: implementar el servicio deseado durante la prueba, integr谩ndolo en el entorno general de forma aislada. Al fusionar solo tareas preparadas en la rama de desarrollo y deshacernos de los bloqueos, nosotros mismos comenzamos a determinar qu茅 cambios deber铆an incluirse en el lanzamiento y cu谩les no.
Vale la pena se帽alar que es poco probable que tal soluci贸n se convierta en una bala de plata para aquellos equipos que realizan cambios en casi los mismos archivos. En este caso, el almacenamiento de caracter铆sticas es inversamente proporcional al n煤mero de conflictos que surgen durante la fusi贸n. En la pr谩ctica, con lanzamientos bastante frecuentes, esto ocurre extremadamente raramente en un equipo con cincuenta desarrolladores.
En lugar de salida
En resumen, podemos identificar los principales enfoques que pueden ayudar a acelerar los lanzamientos:
- Automatizaci贸n de operaciones rutinarias.
- Transparencia de procesos para todos los involucrados.
- El equilibrio necesario entre velocidad y calidad en la escritura de pruebas automatizadas.
- Tiempo reducido para pruebas manuales.
- Aislamiento del entorno para pruebas.
Es importante comprender que en la elecci贸n de varios enfoques, principios y estrategias siempre vale la pena comenzar desde el contexto de su problema. Hay muchas formas igualmente confiables y m谩s sofisticadas para acelerar la entrega de su software al cliente. Un intento de responder a las nuevas dificultades emergentes ha llevado a las conclusiones descritas anteriormente. Para nosotros, fueron el primer paso hacia un enfoque m谩s audaz para lanzar lanzamientos .