
Antes de empezar analizaremos un escenario típico que podemos encontrar en la mayoria de las empresas que aun no implementan una cultura DevOps.
Los principales problemas suelen ser:
Aislamiento de equipos
Calendarios de releases fijos
Puesta en producción más lenta
Fricción entre los equipos
Baja automatización
Scripts rudimentarios y en algunos casos sin soporte
Te damos las recomendaciones para abordar de manera exitosa el curso y alcanzar tus objetivos, también comentamos porque es importante para ti una buena calificación en el curso, dado que esto ayuda a mantener el curso vigente y que puedes beneficiarte de actualizaciones y nuevos contenidos.
Es muy importante entender los conceptos mas relevantes de DevOps de manera general para poder determinar caules seran las practicas y las heramientas par aimplementar una cultura y procesos DevOps dentro de la compañia y entender quien es el rol resposable de la implementación.
Control de versiones: git, svn, Github, gitlab, bitbucket, mercurial -> Administración del repositorio de código y metodología.
Integración continua: Pipelines jenkins -> Automatizar compilaciones y pruebas unitarias par avalidar el código cuando se hace commit.
Entrega continua: Suministro de software rápido y confiable en cualquier momento.
Infraestructura como código: Terraform -> Definición declarativa de la infraestructura mediante archivos de definición basados en texto, para revertir, desmontar y recrear entorno complejos.
Supervisión y registro: Prometheus, grafana -> Monitorización, recopilación de métricas y vinculación de datos de performance.
Aprendizaje validado: Análisis de datos para mejorar los procesos en cada nuevo ciclo.
Con esta herramienta podremos trabajar de manera colaborativa para compartir soluciones a los principales problemas, hacer networking, interactuar con otros estudiantes y explorar diferentes posibilidades y beneficios de las herramientas de trabajo colaborativo.
Explicar en detalle porque los contenedores son la base fundamental para comprender e implementar DevOps y los principales conceptos de Docker: contenedores, imágenes, docker engine, repositorios y orquestadores.
Explicar de maenera detallada como se despliegan los contenedores en un host, como fluye y se administra la comunicación y el almacenamiento en los contenedores.
Comandos de instalación para una distribución basada en ubuntu
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo service docker status
Configuración e instalación de docker compose
sudo groupadd docker
sudo usermod -aG docker ${USER}
curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
Se realiza la instalación de docker compose en un sistema operativo linux, y se explican los pasos mas relevantes de la postinstalación como configurar la rotación de logs y permisos de ejecución sin sudo.
Esta clase adicional sobre como instalar docker en windows 10 usando WSL es opcional, también recordamos que recomendamos trabajar sobre linux preferiblemente dado que es lo que se suele utilizar en el entorno laboral.
Se enseña como usar un listado de herramientas y comandos útiles para trabajar en power shell, Linux y mac con puertos y comunicaciones, con el objetivo de hacer comprobaciones cuando se presentan errores de comunicación, se usa telnet principalmente y también se dan recomendaciones sobre posibles errores que cometen los estudiantes en orden de que puedan evitarlo.
Se explica la funcionalidad básica de la aplicación web en angular y micro-servicio en spring boot para iniciar con docker creando imágenes y contenedores y poner en practicas los principales commandos.
La primera practica consiste en el despliegue de la aplicación de facturacion (angular + spring boot) comentada en el caso de estudio, vamos adescargarla de un repositorio, crear el contenedor y practicar con los comandos de supervivencia para administrar imagenes y contenedores de docker (la url del repositorio esta como recurso de esta clase).
Docker Hub es el repositorio publico principal donde podremos encontrar imágenes de manera pública para diferentes propósitos, también se conoce como un docker registry. Es importante conocerlo y aprender a identificar las imágenes correctas, y saber como podemos clonarlas y usarlas, además también permite crearnos una cuenta gratuita para tener repositorios propios para nuestras imágenes, tanto de manera pública como privada.
Se explica el cambio que ha realizado docker en el componente de docker compose, el impacto y lo que e snecsario tener encuenta para trabajar con esta nueva versión.
En esta clase explico como crear una imagen personalizada con dos servicios (servidor web ngix y java) para ejecutar la aplicación billing app, también explico como podemos aprovechar el auge de la AI con ChatGPT para agilizar el trabajo.
Escribimos linea por linea el fichero Dockerfile partiendo de la imagen base del servidor Nginx e instalamos el frontend de la aplicacion billingapp.
Se agrega los commandos necesarios para instalar el JRE, la aplicación backend y el script de inicio de la imagen con multiples procesos.
Se compila la imagen, se inicia el contenedor y se comprueba que el resultado sea exitoso, se explica los requerimientos necesarios para publicar una imagen en el docker registry, se dan instrucciones para crear una cuenta en dokerhub.
El objetivo de empaquetar las aplicaciones en Imágenes es poderlas compartir de una manera sencilla, aquí te enseño como etiquetar una imagen, como crear un repositorio en docker-hub y como publicar la imagen de tu aplicación e incluso diferentes versiones.
Para terminar, se comprueba que la imagen haya quedado correctamente publicada, que se pueda descargar y funcione y se dan algunas recomendaciones para establecer una cultura DevOps dentro de los diferentes departamentos de la compañía.
Docker se puede ver como un conjunto de herramientas y plugins independientes que colaboran entre si y en algunos casos es necesario definir de manera explicita las versiones entre esos componentes, para el caso especifico de docker compose file y el docker engine existe una matriz de equivalencias que explicamos en este video par evitar posibles errores.
El rol del Site Reliability Engineer (SRE) consiste en unir a los diferentes equipos del departamento de TI y enseñar a los diferentes miembros de cada uno de los equipos como implementar las practicas DevOps y como trabajar con las principales herramientas. Docker Compose es una de las principales herramientas para iniciar y unir a ambos mundos.
Se explica como dockerizar una base de datos y como usar docker compose para administrar multiples servicios(contenedores de docker) lo que se conoce como orquestar una solución.
Se ejecuta la orquestación creada previamente y se hace una prueba para conectarse a la base de datos postgres usando el cliente gráfico adminer.
Se explica con detalle el uso de volúmenes, como se napea y se hace una retrospective sobre docker, el host, las imágenes y los contenedores.
Haciendo uso de Inteligencia artificial, con el asistente CHAT GPT vamos a escribir imágenes independientes para cada uno de los servicios, el backend y el frontend.
Se enseña una buena practica para mapear variables de entorno para administrar datos sensibles entre los contenedores, las aplicaciones y el orquestador.
Se limpia todo y se recrea la orquestación con las imagenes independientes y el mapeo de las variables
Se limpia todo, se hacen correcciones en las imágenes y se demuestra que la información de la base de datos persiste, que no se pierde y se enfatiza en lo sencillo que es portar y administrar toda la infraestructura de las aplicaciones.
Se enseña como conectarse a un contenedor para hacer comprobaciones y se dan algunos consejos para ser un buen SRE.
Se enseña como limitar el uso de recursos del sistema host para los contenedores.
Con Docker podemos crear entornos virtuales que sea independientes, vamos a analizar el diagrama de arqutiectua para entenderlo y ver los recursos que necesitamos.
Para tener entornos separados usando docker , necesitamos definir los detalles por cada entorno, la manera mas sencilla de hacerlo es usando un fichero de docker compose o docker swarm, veremos como definir estos servicios.
La calve d elos entornos virtuales cosiste en definir un apartado de redes, donde se define una red virtual para cada entornos, cone sto se consigue aislar los entornos unos de otros.
Una vez swe ha finalizado la definición de la nueva orquestacion de entornos virtuales en docker, vamos a eliminar todo para recrear la orquestación de neuvo.
Por utlimo se demuestra como los entoros virtuales aislan la información y trabajan de manera correcta y se da una serie de recomendaciones y comentarios adicionales sobre las ventajas de trabjar con Docker y docker compose.
Se realiza la activación del cluster en la máquina local con docker swarm y se explica en detalle como realizar comprobaciones y cuando se debe utilizar.
Es necesario modificar la orquestación para incluir parametros de escalado e indicar de maenra explicita las imagenes de los contenedores.
En docker Swarm las orquestaciones o grupos de contenedores de un mismo servicio se conocen como stacks, aqui se explica como desplegarlos y administrarlo.
Para continuar trabajando en las proximas clases se enseña como salir del modo cluster con docker swarm y desactivarlo.
Antes de inicar explicamos brevemente que es un orquestador de contenedores, los tipos de orquestadores que existen y a grandes rasgos que es kubernetes.
Se explica con ejemplos practicos que es la escalabilidad, los tipos de escalabilidad y porque es un concepto relevante en un cluster de kubernetes.
Un poco de historia sobre cuando y porque google creo kubernetes y quien es el responsable del soporte y mantenimiento de kubernetes.
Se explican los principales componentes de un cluster de kubernetes, como se organiza en nodos master y nodos workers, y los principales componentes de los nodos workers.
Se explica en detalle la composicion y funcion de los nodos workers del cluster de kubernetes.
Existen diferentes tipos de instalaciones y cluster de kubernetes, los gestionados o cloud y los onpremise, en esta clase se explica su diferencia y cuales son los mas comunes en las empresas.
en kuberentes podemos definir la infraestructura para nuestras aplicaciones, esto se conoce como infraestructure as code, en kuberentes se ahce mediante ficheros .yaml y todo se conoce como objetos, aqui explicamos tambien los principales tipos de objetos.
Se explica como realizar la comprobación de la virtualizacion y la instalacion del cliente kubectl para interactuar con el cluster.
Instalación del cluster AllInOne para iniciar.
Cómo primer acercamiento a Minikube se enseña como despelgar una aplicacion en el cluster de minikube mediante el cliente kubectl
Se crea un servicio en kubernetes mediante el kubectl para exponer la aplicacion en internet y que el usario final pueda accederla, ademñás e explican varios conceptos importantes.
Los Secrets son objetos en kubernetes que nos permiten configurar configurar varaibles de entorno por ejemplo pero encriptando la información sensible.
Vamos a configurar los parametros de conexión a la base de datos como nombre de base de datos, usuario y contraseña y los datos de acceso para el administrador pgadmin en secrets.yml
Comandos de la calse:
Consultar la version del apiserver
kubectl api-versions
Codificar un parametro
echo -n 'qwerty' | base64
Descodificar un parametro
echo "cXdlcnR5" | base64 -d
Los peristences volumenes nos permiten definir almacenamiento independiente del ciclo de vida de los pods, podemos definir diferetenes tipos de almacenameinto local, conectar EBS de AWS, azure disk entre otros, pero tambien es posible utilizarlos para conectar scripts de inicialización de contenedores como el caso de crear usuarios y base de datos en postgres por ejemplo.
Los deployments nos permiten definir y mantener el estado deseado de la aplicación, cantidad de pods, especificar la imagen a usar y definir los detalles del contenedor.
Para que nuestras aplicaciones puedan ser accedidas fuera del cluster de kubernetes, es necesario definir los servicios que conformarán la aplicación y realizar el mapeo de puertos.
Un avez tenemos la definición completa de nuestro servicio de base de datos es hora de enciar los objetos al cluster usando el kubectl y probar funcionalmetne el servicio.
Contar con la definición de una aplicación mediante ficheros de configuración y tener los datos seguros en volumenes persistentes nos permite que podamos eliminar y recrear la orquestación en cuestion de segundos.
En esta clase además aprenderás como conectarte a uno de los nodos del cluster y poder validar la persistencia de los datos en volumenes persistentes aun despues de eliminar la orquestación.
Para cerrar la sección de kubernetes y pasar a Dev realizaremos la orquestación y prueba funcional de la aplicación billingApp. se deja como recurso de la clase la definición d elos objetos y lo necesario par realizar la preuba.
Comandos necesario para apuntar el docker engine local hacia el registro de minikube
minikube docker-env
eval $(minikube -p minikube docker-env)
consultar la ip de minikube
minikube ip
Antes de iniciar comentaremos los principales conceptos.
Git
Trunk-based
Gitflow
Trunk:
Branch
Fork
Tag
Explicación de cómo trabajar con un repositorio de código git bajo el stilo trunk-based.
Pasos que deben serguir los integrantes del equipo.
Es importante conocer ambos estilos de trabajo para repositorios git, gitflow y trunk-base, y tener en cuenta algunos aspectos antes de tomar la desción de cual estilo adoptar en la compñia.
Para iniciar las practicas es requerido tener git instalado y contar con una cuenta que nos permita crear un repositorio en github o gitlab
Github requiere una configuración inicial del usuario local y adicionalmente deriva la gestión de almacenar las credenciales de autenticación al sistema operativo donde se definen un tiempo de cache que suele causar problemas cuando se modifican o cambian las credenciales, aquí se explica como funciona y como resolverlo.
Para alojar el código requerido en las siguientes clases practicas, te enseño como crear un repositorio de código en github o gitlab.
Debido al cambio de politicas de autenticación en github , te enseño como generar un token de acceso personal en github para autenticación con git .
Para entender mejor la gestión de un repositorio con git usuando el stilo trunk-based, vamos a crear un repositorio local, con un fichero readme e integrarlo con el repositorio central de github.
Comandos de la clase
Iniciar repositorio
git init
Añadir el contenido (stage)
git add .
Confirmar el contenido
git commit -m "Se inicializa el repositorio con el fichero readme"
Comprobar la rama
git branch
Añadir el reposiotio remoto al local
git remote add origin https://github.com/sotobotero/devops_udemy.git
Enviar los cambiso al repositorio remoto
git push -u origin master
En esta clase se crea un nuevo branch partiendo de la rama master, se completa el flujo de trabajo con el estilo trunk-base, se agrega código en la nueva rama, y se realiza el proceso de la integración (merge) de ambas ramas y se elimina la rama temporal.
Para cerrar lo referente a git vamos a realizar una practica creando un repositorio local usando el estilo gitflow, luego crearemos una rama de caracteristicas, agregaremos un documento y por ultimo fucionaremos la rama de caracterstica hacia la rama develop.
Comandos nuevos de la clase:
Inicializar el repositorio
git flow init
Crear una rama de caracteristica
git flow feature start cd32658
Eliminar la caracteristica
git flow feature finish cd32658
Antes de empezar la practica es importatne conocer los conceptos y diferencias de:
Integración Continua (CI)
Entrega Continua (CD)
Liberación continua (CD
Jenkins
Pipeline
Selenium
Sonar Qube
CI: Integración continua, CD:Entrega continua y CD despliegue continua, son los principales grupos de tareas repetitivas que con mayor frecuencia se realizan en la compañía y que podemos automatizar en los pipelines.
Existen multiples maneras para instalar Jenkins, la manera mas sencilla es extender una imagen de docker con algunas herramientas necesarias e instalarlo directamente sobre docker usando contenedores, pero en algunos casos es necesario hacer una instalación on premise.
Uno de los principales pilares de la integración y la entrega continua es el servidor de integracion continua, en esta clase veremos como disponibilizar este servidor y explorar la interface gráfica de jenkins.
Antes de escribir los pipelines, es necesario planificarlos de manera conjunta con los implicados en proceso que se pretende automatizar. En esta clase se explican los principales conceptos de un pipeline y se explica como realizar la planificacion y diseño de un pipeline.
Para escribir un pipline sencillo que descargue el código de un repositorio y lo compile, necesitamos configurar dicho repositorio y sobretodo configurar el acceso desde jenkins, en este video preparamos el repositorio de código y el token de acceso personal de githubs para conectarnos posteriomente desde jenkins.
Crearemos un pipeline sencillo donde nos conectaremos desde nuestro servidor de integración con jenkins hacia el repositorio central de github para hacer un pull de el código de un microservicio en spring boot de la rama master y realizar la limpieza y compilación con maven y obtener como resultado final un .jar listo para ejecución
Es importante saber como podemos revisar el log y detalle de ejecución del pipeline para corregir posibles errores o realizar ajsutes de ser necesario, tener acceso al historico de ejecuciones, aquí vamos a ver cuales son los herrores más tipico y como podemos detectarlo y corregirlos.
Para concluir el primer acercamiento a jenkins, vamos a conectarnos al contenedor docker de jenkins donde tenemos el servidor de integración continua par verificar que se ha instalado el jar, tambien veremos a modo general como administrar las credenciales de jenkins y otras opciones y un pequeño recap de lo visto hasta el momento.
Con el fin de crear pipelines que se ejecuten de manera automática cuando sucede un venveto en el repositorio es neceasrio hacer la respectiva configuración del plugin y los eventos webhooks en github. Adicional usremos ngrok como tunel para hacer accecible nuestro servidor de integracion continua local desde internet.
Se enseña como crear un pipeline que se ejecuta de manera automática ante los push que se envian al repositorio central.
Una de las principales caracteristicas que permiten realizar una itegración continua consiste de la validación del código de manera automatizada mediante la inclusión de preubas automáticas (Priuebas unitarias, pruebas de integración pruebas de componente etc.) en esta clase preparamos el código con preubas automaticas usando difertentes frameworks y librerias par agarantizar la funcionalidad de la capa web y construir un pipeline de integración continua en jenkins que integre los cambios de cada desarrollador en el repositorio central.
Deespues de incluir pruebas automaticas en el código veremos como crear un pipeline en jenkins que ejecute esas preubas automáticas y si la ejecución es exitosa, realice un merge del código de la nueva rama hacia la rama master, haga un push al repositorio de github y elimine la rama temporal.
Es importante que los diferentes interesados sean notificados del resultado de los procesos de integración continua y la ejecución de los pipelines, existen diversas maneras de conseguirlo, sin embargo el uso de canales para notificación asincrona es una de las mejores opciones, en esta clase veremos como integrar slack para tal fin, sin embargo de manera similar lo podrian hacer con team o cualquier otra herramienta de trabajo colaborativo.
Aprenderás como instalar sonarqube y el respectivo plugin en jenkins así como realizar la correcta configuración para comunicar jenkins con sonarqube usando contenedores de docker.
Se enseña como agregar un paso a un pipeline para realizar el escaneo y revision de código en jenkins usando la integración y el plugin de sonarqube.
Vamos a analizar el resutlado de la revisión de código automatizada que ha realizado sonarqube sobre nuestro poryecto y comentaremos las principales opciones y funcionalidades de sonarqube.
Como crear proyectos.
Reglas
Profiles
Quality gates
administración
Issues
La entrega continua consiste en compilar y publicar las aplicaciones listas para su uso, si bien pueden ser binarios o paquetes tipo .jar o .war entre otros, lo normal en la actualidad suele ser empaquetar todo en contenedores de docker.
Si vamos a empaquetar las aplicaciones usando imágenes de docker, necesitaríamos comunicar Jenkins con nuestro docker engine, para ello es necesario que docker exponga su API y resolver problemas de comunicación como apertura de puertos entre otros.
Muchas tareas de CI y CD requieren comunicar el servidor de integración continua con docker u otras herramientas y para eso debemos resolver los problemas de red.
Los pipelines declarativos de Jenkins nos permiten automatizar tareas mas complejas y con mayor detalle.
En un pipeline declarativo podemos definir variable globales y usar credenciales y otras configuraciones globales existentes dentro de Jenkins.
En jenkins podemos encadenar multiples pipeline para que se ejecuten unos al finalizar los otros si se cumplen ciertas condiciones.
Tras la ejecución exitosa de los pipeline que compilan la aplicación y publican la imagen de docker, podemos descargar esta imagen de nuestro registry privado y levantar un contenedor par comprobar que la imagen se creado y empaquetado correctamente nuestra app.
La mejor opción para trabajar con jenkins y docker en windows y sobretodo si usamos docker desktop es hacer una instalación local de jenkins.
Para ejecutar tareas de proyectos de java con maven, como compilar un proyecto, necesitamos tener instalado y configurado maven y si queremos que jenkisn pueda acceder a maven, también debemos configurar un plugin de maven en jenkins.
Para que jenkins pueda conectarse con el docker engine y pedirle que compile imagenes de docker y las publique en un registry, primero s necesario exponer el API del docker desktop para poder accederla mediante http.
Los pipelines en jenkins se escriben en un leguaje basado en groovy y suelen ser independientes del sistema operativo en el que se ejecutan, pero hay cosas que hay que tener en cuenta en una instalación de jenkins onpremise como las rutas a directorios y archivos que si varian entre linux y windows.
Para realizar la instalación de manera automática desde el pipeline de jenkins en kuberentes es necesario instalar el respectivo plugin y realizar las configuraciones necesarias a nivel de red y seguridad en el cluster.
En esta clase se realiza la configuracion del plugin de kubernetes, se hace el deploy en el cluster del servicio y se une todo en un solo pipeline, de tal manera que evidenciamos como automatizar el proceso completo de integración continua y despliegue continuo, partiendo de los cambios en el repositorio de código y llendo hasta el despliegue en el cluster del entorno de producción.
Breve retrospectiva de las principales practicas de DevOps y propuesta de actividad practica
¡Domina DevOps con las herramientas más demandadas del mercado, Curso práctico y Actualizado constantemente!
Este curso te llevará a comprender y aplicar prácticas de DevOps utilizando tecnologías clave como Docker, Kubernetes, Jenkins y GitFlow, herramientas esenciales en la automatización de procesos de desarrollo, integración continua (CI) y entrega continua (CD) además de incluir la Asistencia de la Inteligencia Artificial (AI) como copilot y ChatGPT.
¿Qué aprenderás?
Implementación de contenedores con Docker: Aprende a crear y gestionar contenedores para ejecutar microservicios y aplicaciones escalables.
Orquestación con Kubernetes: Descubre cómo orquestar contenedores y gestionar clústeres para implementar aplicaciones en entornos productivos.
Pipelines CI/CD con Jenkins: Automatiza el despliegue y pruebas de aplicaciones con pipelines de Integración y Entrega Continua.
Control de versiones con GitFlow: Gestiona eficientemente el flujo de trabajo en proyectos colaborativos, desde el desarrollo hasta la producción.
Automatización del ciclo de vida del software: Integra todas estas herramientas para optimizar procesos y acelerar la entrega de software en equipos de desarrollo.
Simulaciones con IA: Practica y prepárate para futuras entrevistas y reuniones.
En el mundo real, la teoría no basta. Por eso, este curso incluye un componente único: "Role Plays" con Inteligencia Artificial.
Prepárate para entrevistas: Enfréntate a una IA que actúa como reclutador para dominar tus fundamentos.
Defiende tu estrategia: Practica cómo convencer a un CTO sobre una propuesta para la compañía, demostrando una visión estratégica.
Gana confianza: Mejora tus habilidades de comunicación para superar cualquier desafío en el mercado laboral.
¿Por qué elegir este curso?
Este curso está orientado a la práctica y no requiere conocimientos previos de DevOps. Aprenderás a implementar un ciclo completo de desarrollo y despliegue automatizado, utilizando los estándares y tecnologías que dominan la industria.
100% práctico: Trabajarás con ejemplos reales y pipelines CI/CD para desarrollar habilidades listas para aplicar en proyectos profesionales.
Amplia cobertura de herramientas: Docker, Kubernetes, Jenkins y GitFlow son tecnologías clave en el ecosistema DevOps, y aprenderás a dominarlas todas en un solo curso.
Prepara tu carrera en DevOps: Con las habilidades adquiridas, estarás listo para manejar proyectos complejos de desarrollo y despliegue de aplicaciones, mejorando la eficiencia y productividad de los equipos.
¿A quién está dirigido?
Desarrolladores que buscan implementar DevOps en sus proyectos.
Ingenieros de software interesados en aprender Docker, Kubernetes, Jenkins y CI/CD.
Profesionales de IT que deseen mejorar sus procesos de despliegue y automatización.
Cualquier persona interesada en aprender DevOps desde cero.
¡No solo lo decimos nosotros, lo dicen nuestros estudiantes!
Este curso tiene una calificación de 4.7/5 en Udemy, y nuestros alumnos destacan la calidad del contenido, el enfoque práctico y la claridad de las explicaciones del instructor. Te animamos a revisar los comentarios y experiencias de otros estudiantes para que te asegures de que este curso es una de las mejores opciones para aprender programación desde cero.
Curso constantemente actualizado: Este curso se mantiene actualizado con las últimas herramientas y prácticas de DevOps, asegurando que siempre aprendas con las tecnologías más recientes. DevOps 2024 - 2025