En el acelerado mundo del desarrollo de software, donde el despliegue rapido y confiable es fundamental, dos conceptos clave que podemos encontrar para lograr esto es: DevOps y CI/CD. Que sino los conoces quizas te suenen a una herramienta de software o una nueva tecnología, pero no precisamente, DevOps, es más un enfoque cultural y colaborativo, junto con CI/CD (Integración Continua y Entrega Continua), una metodología de desarrollo ágil, que muchas organizaciones usan para crear, probar y desplegar software.
Asi En este artículo, exploraremos cómo DevOps y CI/CD se complementan entre sí, ademas de sus beneficios.
¿Qué es DevOps?
DevOps es un abreviado de Development and IT operations, el cual trata de un conjunto de practicas para hacer Testing, Build, Deploy de aplicaciones, en pequeños pasos, de forma frecuente. Es decir estamos hablando del ciclo de vida del desarrollo de software.
Y ya que es un ciclo, este se repite para siempre, de hecho este es un grafico muy comun de ver en DevOps:

Que se puede leer de esta forma:
- Code, los desarrolladores primero escriben codigo
- Build, luego se compila o se hacen un build de su proyecto
- Test, Luego se ejecutan Tests para encontrar Bugs
- Release, Luego se suben a una rama principal en un repostorio
- Deploy, Luego se pasan a un servidor de produccion
- Operate, aqui ya es usado por los usuarios de la aplicacion o clientes
- Monitor, Luego se monitorea la aplicacion y se recolecta informacion
- Plan, usando la informacion anterior se planea mejoras para implementar de nuevo en codigo, repitiendose todo el ciclo nuevamente.
Y la razon principal de que necesitemos esta forma de llevar proyectos debido a que el codigo esta cambiando frecuentemente, asi que el despliegue es algo que siempre vamos a estar necesitando hacer tambien, por eso mejor automatizar este proceso.
Ahora, una de las practicas principales de DevOps es Continous Integration (CI), en donde los desarrolladores envian su codigo a un repostorio central (Github, Gitlab o Bitbucket) de forma frecuente para para poder combinarlos (merge) casi a diario.
y en donde cada commit y seguido de un push que hagan, lanza un conjunto de tareas que tiene que hacer un servidor remoto, que por lo general recibe el nombre CI Server, o servidor de integracion continua.

Y el conjunto de tareas que realiza este servidor se llama Workflow, estas tareas puden consistir en compilar la aplicacion o hacer build y ejecutar los tests, para que al final este simplemente notifique a los desarrolladores si todas las tareas se hicieron correctamente
o si fallaron, quizas al ocurrir un error en algunos de estas pruebas

Es decir CI se encarga de validar si todo tu codigo funciona correctamente antes de desplegarlo producción.

Aunque mas que notificar a desarrolladores como mencione, este resultado final, de si el codigo paso todas las tareas o no, es revisado principalmente por el Project Owner, o el ingeniero de control de calidad (QA), los cuales son personas que su trabajo es que el proyecto se lleve a cabo, asi que tiende a revisar codigo, toma decisiones en cuanto al diseño, y decide como se manejaran los posibles Bugs que existan.
la otra parte es Continuous deployment, que consiste en que todo el codigo valido que ya se comprobo, pase a desplegarse automaticamente en un servidor de produccion o muchas veces empresas tambien tiene un servidor que tiene una version interna de la aplicacion de produccion para poder ver antes de desplegar la real, y es aqui donde despliegan, todo esto hace que los desarrolladores pueden hacer despliegues a menudo y de forma automatica.

¿Como funciona en la practica?
Cuando los desarrolladores terminan de escribir codigo, es decir finalizan alguna tarea que se les encomendo, estos envian sus cambios a un repositorio central que podria estar en Github o Gitlab.
desde aqui el codigo es analizado y se empiezan a ejecutar tareas para comprobar si es valido, entre estas por ejemplo estan los Tests, algunos de los test mas comunes son:
- Unit Testing, los cuales revisan pequeñas porciones de codigo de tu proyecto
- Validation Testing, Estas pruebas se centran en verificar que el software funciona correctamente desde la perspectiva del usuario final y que satisface los criterios de aceptación definidos
En conjunto estas tareas son ejecutadas una despues de otra, y son consideras un Workflow. Y se ejecutaran cada vez que se haga un push a una rama de tu proyecot, como puede ser la rama master.
Actualmente muchos proyecto serios tienen algun tipo de entorno CI/CD configurado, ya que como es normal que un proyecto este siendo desarrollado por distintas personas ubicadas en distintas locaciones, con diferentes horarios, es mucho mejor que el despliegue este automatizado para que antes que se depliegue el proyecto todos puedan tener la version mas novedosa del codigo que se va a llevar a cabo a producción.
Ahora entre estos entornos CI/CD que muchos proyectos usan bastante podemos encontrar a software open Source y tambien propietarios como
- Jenkins, que es una herramienta de software en donde puedes configurarlo para desplegar cualquier proyecto de cualquier lenguaje y ejecutar cuantas tareas necesites, siendo de los proyectos Open Source mas populares en esta area, y pudiendolo instalar en tu propio servidor.
o tambien esta:
- Circle CI
- Gitlab cicd
- Github Actions
- Team City
que son propietarios, y mas que herramienta de software son servicios, es decir que te regitras en una plataforma y no tienes que instalar nada, ya todo esta listo simplemente para que lo configures, por ejemplo en Github Actions, basta con que crees un archivo de configuracion llamado workflow que es un archivo yaml que luce algo como esto:
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: 14
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
Y listo cuando subas tu repo esta configuracion sera leida para poder ejecutar por Github en sus propios servidores.
Beneficiones de CI/CD
Todo esto hace que al final en un proyecto este gane los siguientes ventajas:
- Permite tener tareas que aseguran mucho mas que la version final no sea tan propensa a desplegar errores.
- El desarrollo es mas simple al no teer que manejar el despliegue en cada cambio
- De llevar a cabo veriones de produccion mas rapido que hacerlo manualmente
Conclusion
En fin, la combinación de CI/CD y DevOps ha revolucionado la forma en que desarrollamos y entregamos software en la actualidad. Estas prácticas automatizadas han demostrado ser fundamentales para lograr una entrega continua, confiable y de alta calidad, en donde esta incluye una mayor eficiencia en el desarrollo, una detección temprana de errores, una mayor capacidad de respuesta a las necesidades del cliente y una reducción en el tiempo de lanzamiento al mercado.
Sin embargo, implementar CI/CD y DevOps no es solo una cuestión de herramientas y tecnología, sino también de una transformación cultural en una organización, y requiere un cambio de mentalidad, la adopción de nuevas prácticas y la inversión en capacitación y colaboración.