Existen muchos beneficios al utilizar contenedores Docker en los pipelines de CI/CD, especialmente para sistemas con estado como las bases de datos. Por ejemplo, al ejecutar pruebas de integración, cada trabajo de CI puede iniciar la base de datos en un contenedor aislado con un estado limpio, evitando conflictos entre pruebas. Esto resulta en un entorno de prueba fiable, consistente y rentable. Este enfoque también reduce la latencia y mejora el rendimiento general del pipeline de CI/CD porque la base de datos es accesible localmente.
El emulador de Azure Cosmos DB basado en Linux está disponible como un contenedor Docker y puede ejecutarse en una variedad de plataformas, incluidas las arquitecturas ARM64 como Apple Silicon. Permite el desarrollo y prueba local de aplicaciones sin necesidad de una suscripción de Azure o incurrir en costos de servicio. Puedes ejecutarlo fácilmente como un contenedor Docker y utilizarlo para desarrollo y pruebas locales:
docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
Azure Cosmos DB con GitHub Actions
Vamos a recorrer un ejemplo para entender mejor cómo usar el emulador de Azure Cosmos DB con GitHub Actions, que es una plataforma de integración continua y entrega continua (CI/CD) que te permite automatizar tu proceso de construcción, prueba y despliegue utilizando flujos de trabajo. Un flujo de trabajo es un proceso automatizado configurable que puede ejecutar uno o más trabajos. Se define mediante un archivo YAML que se verifica en tu repositorio y se ejecuta cuando es activado por un evento en tu repositorio, o puede ser activado manualmente o en un horario definido.
Ejemplo: Flujo de Trabajo CI para una Aplicación .NET
Este flujo de trabajo de GitHub Actions configura el emulador de Azure Cosmos DB basado en Linux como un contenedor de servicio de GitHub Actions como parte de un trabajo. GitHub se encarga de iniciar el contenedor Docker y lo destruye cuando el trabajo se completa — no se requiere intervención manual (como ejecutar el comando docker run).
name: .NET App CI
on:
push:
branches: [main]
paths:
- 'dotnet-app/**'
pull_request:
branches: [main]
paths:
- 'dotnet-app/**'
jobs:
build-and-test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, ubuntu-24.04-arm]
services:
cosmosdb:
image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
ports:
- 8081:8081
env:
PROTOCOL: https
env:
COSMOSDB_CONNECTION_STRING: ${{ secrets.COSMOSDB_CONNECTION_STRING }}
COSMOSDB_DATABASE_NAME: ${{ vars.COSMOSDB_DATABASE_NAME }}
COSMOSDB_CONTAINER_NAME: ${{ vars.COSMOSDB_CONTAINER_NAME }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: '8.0.x'
- name: Export Cosmos DB Emulator Certificate
run: |
sudo apt update && sudo apt install -y openssl
openssl s_client -connect localhost:8081 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cosmos_emulator.cert
sudo cp cosmos_emulator.cert /usr/local/share/ca-certificates/
sudo update-ca-certificates
- name: Install dependencies
run: cd dotnet-app && dotnet restore
- name: Build
run: cd dotnet-app && dotnet build --no-restore
- name: Run tests
run: cd dotnet-app && dotnet test --no-build --verbosity normal
Este trabajo está configurado para ejecutarse en un runner de Ubuntu y utiliza la imagen de docker mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
como contenedor de servicio. La cadena de conexión, el nombre de la base de datos y el nombre del contenedor están configurados como variables de entorno. Dado que el trabajo se ejecuta directamente en un runner alojado en GitHub Actions, el paso “Run tests” puede acceder al emulador utilizando localhost:8081
.
El paso Export Cosmos DB Emulator Certificate es específico para aplicaciones .NET (así como Java) porque en el momento de la redacción, los SDK de .NET y Java no admiten el modo
HTTP
en el emulador. La variable de entornoPROTOCOL
está establecida en https en la secciónservices
y este paso exporta el certificado del emulador y los agrega al almacén de certificados de confianza del sistema operativo.
¡Inténtalo!
Este repositorio de GitHub proporciona ejemplos de cómo configurar el emulador de Linux como parte de un flujo de trabajo de CI de GitHub Actions para aplicaciones .NET, Python, Java y Go en arquitecturas x64
y ARM64
(demostrado para runner de Linux utilizando Ubuntu).
Bifurca el Repositorio
Navega hasta el repositorio de GitHub y haz clic en el botón Fork en la esquina superior derecha de la página del repositorio para crear una copia del repositorio bajo tu propia cuenta de GitHub.
En tu cuenta de GitHub, abre el repositorio y asegúrate de habilitar flujos de trabajo en la configuración del repositorio.
Agrega la cadena de conexión del emulador de Cosmos DB (COSMOSDB_CONNECTION_STRING
) como un secreto del repositorio. Utiliza el siguiente valor:
AccountEndpoint=http://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==
Agrega el nombre de la base de datos (COSMOSDB_DATABASE_NAME
) y el nombre del contenedor (COSMOSDB_CONTAINER_NAME
) como variables del repositorio:
Clona el repositorio bifurcado en tu máquina local (asegúrate de usar tu nombre de usuario de GitHub):
git clone https://github.com/<your-username>/cosmosdb-linux-emulator-github-actions.git
cd cosmosdb-linux-emulator-github-actions
Desencadena el Flujo de Trabajo
Para desencadenar el flujo de trabajo, realiza un pequeño cambio en cualquiera/de todo el código (.NET, Java, Python o Go), y añade y confirma tus cambios. Para una mejor comprensión, se utilizan flujos de trabajo separados para cada lenguaje.
Sube tus cambios a tu repositorio bifurcado en GitHub:
git add .
git commit -m "Your commit message"
git push origin main
Después de empujar los cambios, GitHub Actions ejecutará automáticamente el flujo de trabajo. Ve a la pestaña “Actions” en tu repositorio para ver el estado y los resultados de los flujos de trabajo. Revisa cualquier registro o salida para asegurarte de que los flujos de trabajo se estén ejecutando correctamente.
Consideraciones sobre el Ejecutor de GitHub Actions
El repositorio de muestra demostró ejecutores basados en ubuntu
(para arquitecturas x64 y ARM64). Esto debería funcionar también para los ejecutores basados en ARM de Windows. Si estás considerando ejecutores x64 de Windows, ten en cuenta que en el momento de escribir esto, los contenedores de servicio de GitHub Actions no son compatibles con ejecutores que no sean de Linux. Sin embargo, puedes solucionarlo añadiendo pasos para instalar Docker y gestionar su ciclo de vida, incluyendo el inicio y la detención del contenedor.
Conclusión
Como mencioné anteriormente, hay muchos beneficios en usar contenedores Docker en los flujos de CI. GitHub Actions se utilizó como plataforma de CI/CD en este caso, pero estos conceptos también se aplican a otras soluciones. ¡Pruébalo y háznos saber qué piensas!
Source:
https://dzone.com/articles/use-azure-cosmos-db-as-a-docker-container-in-cicd