La integración, la entrega y la implementación continuas (CI/CD de aquí en adelante) son prácticas de DevOps. En otras palabras, son técnicas que implementan los ideales de DevOps. Si no está familiarizado con el término, quizá se pregunte: ¿qué es exactamente DevOps? ¿Y cómo se relaciona esto con el desarrollo de software Agile? Comprender el contexto más amplio de cómo han evolucionado las prácticas de desarrollo de software y los problemas que tratan de abordar Agile y DevOps puede ayudarle a sacar más provecho de su proceso de CI/CD.
Gracias a la revolución digital, el software y las TI han pasado de ser una mera función de apoyo para muchas organizaciones (aparte de los editores de software) a convertirse en una parte integral de muchos sectores empresariales.
En toda una serie de sectores, desde la banca y las finanzas hasta el comercio minorista, pasando por la administración pública, los viajes y el ocio, el desarrollo de software se está convirtiendo en una parte fundamental del trabajo de muchas organizaciones. El acceso a los productos y servicios se realiza a través de aplicaciones y servicios en línea, mientras que los sistemas informáticos internos son esenciales para el buen funcionamiento de una empresa.
En 2001, cuando esta tendencia comenzaba a cobrar fuerza, un grupo de desarrolladores de software redactó el manifiesto Agile. Fue su respuesta a algunos de los problemas que detectaban en la forma en que se desarrollaba el software en ese momento. El manifiesto recopila un conjunto de valores y principios para el desarrollo de software, y ha dado lugar a varios marcos de trabajo –Scrum es uno de los más conocidos– que los ponen en práctica.
La metodología Agile reconoce que hay que centrarse en la entrega de un software que funcione, y que las personas –mediante una colaboración y una comunicación efices– son fundamentales para lograr ese objetivo. Desarrollado en respuesta a los largos plazos de los proyectos en cascada de la época, en los que el software solía entregarse años después de haber fijado los requisitos y, para entonces, las necesidades del usuario y el contexto podían haber cambiado significativamente, el enfoque Agile consiste en adoptar instantáneamente los requisitos cambiantes.
Los marcos de trabajo y metodologías Agile se centran en el trabajo iterativo, la entrega periódica de pequeños fragmentos de software funcional, la recopilación de feedback y la adaptación en respuesta a este feedback. Esto supuso un cambio significativo con respecto al enfoque en cascada, que consiste en trabajar en distintas fases lineales de diseño, desarrollo, prueba y lanzamiento.
Mientras los equipos de desarrollo cambiaban su forma de enfocar el desarrollo de software adoptando los principios Agile, solían colaborar poco con los equipos que estaban más adelante en el proceso.
No era extraño que los equipos de operaciones –los responsables de la gestión de la infraestructura y de la implementación del software para su lanzamiento– trabajaran de forma completamente diferente y hablaran efectivamente un idioma distinto al de los desarrolladores que escribían el código.
Aunque los desarrolladores trabajasen de forma más eficiente dentro de su propio equipo, una vez que la compilación se entregaba a operaciones para su implementación en la fase de puesta en escena, el proceso a menudo formaba un cuello de botella. Las dependencias que faltaban, los problemas de configuración del entorno y los errores que no podían reproducirse en las máquinas locales de los desarrolladores creaban interminables idas y venidas entre los equipos y desacuerdos sobre qué parte era responsable de solucionar el problema.
A menudo, esto se combinaba con una estrategia de lanzamiento en cascada; aunque desarrollo entregase los cambios de forma incremental, los pasos posteriores seguían agrupando los cambios en grandes y poco frecuentes lanzamientos, eliminando así la oportunidad de obtener un feedback rápido de los usuarios.
Al combinar "desarrollo" y "operaciones", el término "DevOps" subraya la necesidad de integrar las actividades de ambos equipos para entregar con eficiencia un software funcional. Dicho esto, DevOps no se limita a estas funciones; todos los que participan en el desarrollo y la entrega de software deben alinearse en torno al objetivo común de entregar un software que funcione a los usuarios.
Un aspecto esencial de DevOps es la creación de una cultura de responsabilidad compartida, confianza mutua y comunicación abierta. No basta con que los equipos de desarrollo marquen el trabajo como terminado una vez que funciona en una compilación local. Para entregar un código que esté listo para la producción, los desarrolladores necesitan visibilidad de los pasos que se llevan a cabo entre ellos y el lanzamiento. Eso significa eliminar los compartimentos estancos y colaborar con los equipos de calidad, seguridad e infraestructura para entender su parte del proceso.
Aunque se puede lograr una mayor cooperación entre los equipos con procesos manuales, es mucho más eficiente utilizar herramientas para automatizar la mayor parte posible del trabajo. La automatización de los pasos de compilación, prueba e implementación permite realizar el trabajo más rápidamente, lo que a su vez significa que los resultados de esas etapas están disponibles mucho antes. La automatización es fundamental para un enfoque DevOps, ya que permite bucles de feedback más inmediatos que son esenciales para compilar con calidad y eliminar todo aquello que sobra.
DevOps surgió en un momento en el que los principios de fabricación Lean empezaban a aplicarse al desarrollo de software. Lean se centra en la eliminación de lo sobrante mediante la optimización de cada etapa de un proceso, la incorporación de la calidad y el respeto a las personas.
DevOps incorpora gran parte de este pensamiento y busca hacer que el desarrollo de software sea más eficiente optimizando el proceso de principio a fin y proporcionando información sobre lo que se está compilando tan pronto como sea posible con bucles de feedback más inmediatos.
Esto implica llevar a cabo las actividades que anteriormente pertenecía a una fase de desarrollo posterior y abordar los problemas que surgen de este trabajo tan pronto como se detectan, ya sean pruebas fallidas, vulnerabilidades de seguridad o problemas de compilación.
Dado que todo el mundo comparte la responsabilidad de entregar el software a los usuarios, no basta con la manida respuesta de "funciona en mi máquina". Con un enfoque DevOps, los desarrolladores tienen mucha más visibilidad de cómo se utiliza el software y de los desafíos que se plantean, lo que significa que están en una mejor situación para solucionarlos.
La adopción de DevOps extiende los beneficios de Agile más allá del equipo de desarrollo. Adaptarse al ritmo de trabajo de los desarrolladores y trabajar en fragmentos más pequeños facilita la detección y el aislamiento de los problemas, ya que hay menos variables en juego. Del mismo modo, la generación de feedback con prontitud evita desperdiciar esfuerzos en las pruebas y la puesta en escena de una compilación que luego será desechada. A su vez, esto garantiza que la organización en su conjunto obtenga todos los beneficios de trabajar en incrementos más pequeños.
La creación de un proceso de CI/CD automatizado pone en práctica estos ideales de DevOps.
La práctica de integración continua de confirmar con frecuencia fomenta el uso de lotes pequeños que puedan desplazarse a través del proceso con rapidez. Un sistema automatizado de compilación y prueba permite verificar cada cambio y proporcionar feedback mucho más rápidamente que un proceso manual.
Como desarrollador, obtener un feedback rápido sobre lo que acaba de escribir es más eficiente, ya que es menos probable que haya perdido el contexto para el cambio: puede mantener lo que Lean denomina "flujo". Las pruebas automatizadas frecuentes también contribuyen a mejorar la calidad, ya que la detección y la corrección de errores en una fase temprana evitan que se compile más código sobre ellos.
La automatización de la implementación en los servidores de preproducción hace que el proceso sea coherente y fiable, y ofrece la oportunidad de hacer un mayor uso de los entornos de puesta en escena para las pruebas y el feedback. La implementación de pequeños cambios en producción con frecuencia, en lugar de agruparlos en grandes lanzamientos poco frecuentes, reduce el riesgo de que algo vaya mal en entornos en vivo, ya que hay menos variables que se combinen para arrojar consecuencias no deseadas.
Si surge un error, el aislamiento y la resolución son más rápidos gracias al menor tamaño de los lotes. Publicar actualizaciones de forma incremental significa que se ofrece valor a los usuarios con regularidad y que se pueden utilizar los comentarios sobre esos cambios para informarse antes de continuar compilando, con lo que se sigue mejorando el producto.
El objetivo de CI/CD y de DevOps en general es acelerar el proceso de entrega de software valioso a los usuarios sin poner en entredicho la calidad. Los principios de DevOps se superponen y complementan las ideas de Agile y Lean. Si se examina todo el proceso de desarrollo de software y se optimiza cada etapa, se puede entregar más rápidamente y, por lo tanto, obtener feedback con prontitud, lo que permite un ciclo de desarrollo y mejora continuos.