¿Que es la cultura DevOps?
Tags: devops, aws, codepipeline, cicd
Published: 2023-04-19 13:29:46

Desde hace poco tiempo, las empresas han venido trabajando con una cultura que combina el desarrollo de software con las operaciones de tecnología, ofreciendo a sus clientes productos y servicios a una mayor velocidad. Dicha cultura se llama DevOps.

---

DevOps (Desarrollo + Operaciones) es un término que se refiere a prácticas, herramientas y filosofías que facilitan la comunicación y colaboración entre los desarrolladores de software y operadores de TI con el fin de entregar software de mejor calidad y en tiempo ágil. Cubre todo el ciclo de una aplicación, desde el desarrollo, pasando por las pruebas hasta el despliegue final usando iteraciones continuas. A continuación, veremos las fases de DevOps.

## Integración Continua

Es la práctica de combinar los cambios de código regularmente en un repositorio central para ejecutar pruebas y compilar. En esta etapa, se escribe el código bajo estándares, como por ejemplo, CERT C, MISRA C, AUTOSAR C++, PEP 8 ó PSR. Y, se utiliza un programa especial, llamado Linter para buscar errores de sintaxis y bugs cuando se ejecuta el código. Los linter más comunes son cfn_nag, cfn_lint, GoLint, PyLint, Checkstyl, EsLint y PMD.

**Pruebas unitarias**

Las pruebas unitarias garantizan que las unidades de código funcionen cómo fue diseñada la aplicación, es decir, como se espera. Cuando los desarrolladores envían código al repositorio central, se prueba de forma aislada y automatizada. Existen dos metodologías para el desarrollo de software que incluyen las pruebas unitarias:

- Desarrollo impulsado por pruebas (TDD): Consiste en ciclos de desarrollo muy cortos y repetitivos, convirtiendo los requisitos de software en casos de prueba para mejorar el código.

- Desarrollo impulsado por el comportamiento (BDD): Consiste en fomentar conversaciones entre equipos de trabajo, usando ejemplos concretos para comprender cómo debería comportarse la aplicación.

Los frameworks de pruebas unitarias más comunes son JUnit, PyTest, .Net, JBehave, CSpec y PHPSpec.

**Pull Request**

El término más visto en un repositorio de código, es Pull Request. Es sólo la revisión de cambios en el código antes de fusionarlos en el repositorio. Los Pull Request se realizan de tres formas diferentes:

- Fast-Foward Merge: Mueve la rama de referencia hacia la confirmación más reciente de la rama fuente. El historial de confirmaciones se conserva como si hubiera ocurrido en la rama de destino. La punta de la rama de origen se reenvía rápidamente a la punta de la rama de destino.

- Squash and Merge: Los commits de pull request se combinan en un único commit.

- Three-way Merge: La combinación de tres vías crea una combinación en la rama de destino, pero conserva las confirmaciones individuales como parte del historial.

### Testing

Las pruebas automatizadas ó testing son la parte fundamental de una aplicación, sino se prueba su funcionalidad no se puede entregar. Por eso, las pruebas están presentes en todas las etapas de DevOps. La pirámide representa las diferentes etapas de las pruebas con el tamaño de la sección que representa cuántas pruebas se realizan en esa etapa.

Entre las ventajas de las pruebas automatizadas encontramos:

- Velocidad.
- Fiabilidad.
- Consistencia.
- Escalabilidad.
- Eficiencia.

## Entrega Continua

Es la práctica de preparación de los cambios en el código para la entrega sobre la aplicación final. Es una extensión de la integración continua, porque implementa los cambios en ambientes de prueba y producción. Se puede automatizar mediante flujos de trabajo ó realizar de forma manual para puntos críticos. En esta etapa se realizan diferentes tipos de pruebas:

- Pruebas funcionales: Se testean las funciones principales, usabilidad, navegación, accesibilidad y mensajes de error bajo condiciones de error conocidas.
- Pruebas de regresión: Aseguran que los cambios hechos en el código no afecten las funciones existentes y no introduzcan nuevos defectos.
- Pruebas de rendimiento: Determinan cómo funciona la aplicación en términos de capacidad de respuesta y estabilidad bajo una carga de trabajo específica.
- Prueba de aceptación de usuario (UAT): Es dónde los usuarios actuales del software testean para asegurar que pueden manejar las tareas requeridas.
- Pruebas sintéticas: Método para comprender la experiencia del usuario en una aplicación mediante la predicción del 
comportamiento.

## Despliegue Continuo

Va más allá de la entrega continua, y asegura que el despliegue de la aplicación, en el ambiente productivo, se realice de forma automatizada sin validación humana.

**Despliegue progresivo**
Con una implementación continua, su flota de producción se divide en grupos para que toda la flota no se actualice a la vez. Su flota ejecutará las versiones de software nuevas y existentes durante el proceso de implementación. Este método permite una actualización sin tiempo de inactividad. Si la implementación falla, solo se verá afectada la parte mejorada de la flota.

**Comprobaciones de estado**
Las comprobaciones de estado son pruebas que se realizan en recursos como la aplicación, máquinas virtuales ó balanceadores de carga. Los resultados de estas pruebas pueden determinar si una implementación se realizó correctamente o si una aplicación funciona como se esperaba.

**Implementaciones segmentadas**
La segmentación se refiere a dividir la implementación en pequeños fragmentos. Un ejemplo de implementación segmentada sería dividir la implementación de su aplicación por región geográfica o zona de disponibilidad.

**Implementaciones Canary**
Son un tipo de implementación segmentada. Al igual que una implementación segmentada, implementa una pequeña parte de su aplicación (llamada canary) y el resto de la aplicación sigue más adelante. Lo que hace que una implementación de Canary sea diferente es que prueba su Canary con tráfico de producción en vivo.

**Transiciones**
Las transiciones son vínculos entre las etapas del pipeline que se pueden inhabilitar o habilitar. Cuando las transiciones están habilitadas, las revisiones de la aplicación pueden pasar de una etapa a otra. Están habilitados de forma predeterminada.

**Detener promociones**
Hay muchas situaciones en las que es posible que deba detener una promoción (publicación). Por ejemplo, si se encontró un error o problema crítico con la aplicación actualmente implementada y necesita detener la implementación de esa aplicación y revertirla.

## DevSecOps

Últimamente, se ha agregado una etapa adicional a las implementaciones DevOps para evitar brechas de seguridad. DevSecOps es una metodología que cubre la seguridad en las canalizaciones de integración continua (CI), entrega continua (CD) y la automatización. Integra conocimientos en seguridad en los equipos de trabajo para brindar seguridad a escala en la nube.

**Herramientas DevOps**

- AWS CodeCommit.
- AWS CodeBuild.
- AWS CodeDeploy.
- AWS CodePipeline.
- Github.
- CloudBees.
- Jenkins.
- TeamCity.
- Ghost Inpector.

Muchos definen DevOps como una metodología ó el uso de una serie de herramientas pero es más bien concebido como un cambio cultural en la forma de integrar varios equipos de trabajo de desarrollo y operación para desarrollar soluciones de tecnología. Es un término que cada día toma más fuerza en el lenguaje corporativo.

Publicado en: [The Bucket of Notes](https://thebucketofnotes.hashnode.dev/que-es-la-cultura-devops)