Er zijn veel voordelen aan het gebruik van Docker-containers in CI/CD-pijplijnen, vooral voor stateful systemen zoals databases. Wanneer je bijvoorbeeld integratietests uitvoert, kan elke CI-taak de database starten in een geïsoleerde container met een schone staat, waardoor conflicten tussen tests worden voorkomen. Dit resulteert in een testomgeving die betrouwbaar, consistent en kosteneffectief is. Deze aanpak vermindert ook de latentie en verbetert de algehele prestaties van de CI/CD-pijplijn, omdat de database lokaal toegankelijk is.
De op Linux gebaseerde Azure Cosmos DB-emulator is beschikbaar als een Docker-container en kan draaien op verschillende platforms, waaronder ARM64-architecturen zoals Apple Silicon. Het stelt lokale ontwikkeling en testing van applicaties mogelijk zonder dat een Azure-abonnement nodig is of dat er kosten voor de service worden gemaakt. Je kunt het eenvoudig uitvoeren als een Docker-container en het gebruiken voor lokale ontwikkeling en testing:
docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
Azure Cosmos DB met GitHub Actions
Laten we aan de hand van een voorbeeld bekijken hoe je de Azure Cosmos DB-emulator kunt gebruiken met GitHub Actions, dat is een platform voor continue integratie en continue levering (CI/CD) dat je in staat stelt om je build-, test- en implementatiepijplijn te automatiseren met workflows. Een workflow is een configureerbaar geautomatiseerd proces dat één of meer taken kan uitvoeren. Het wordt gedefinieerd door een YAML-bestand dat wordt ingecheckt in je repository en wordt uitgevoerd wanneer het wordt geactiveerd door een gebeurtenis in je repository, of het kan handmatig worden geactiveerd of op een bepaald schema.
Voorbeeld: CI-workflow voor een .NET-toepassing
Deze GitHub Actions-workflow configureert de op Linux gebaseerde Azure Cosmos DB-emulator als een GitHub Actions-servicecontainer als onderdeel van een taak. GitHub zorgt voor het starten van de Docker-container en vernietigt deze wanneer de taak is voltooid – er is geen handmatige interventie vereist (zoals het uitvoeren van het docker run-commando).
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
Deze taak is geconfigureerd om te draaien op een Ubuntu-runner en gebruikt de mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
docker-afbeelding als een servicecontainer. De verbindingsreeks, databasenaam en containernaam zijn geconfigureerd als omgevingsvariabelen. Aangezien de taak direct draait op een GitHub Actions gehoste runner, kan de stap “Tests uitvoeren” de emulator bereiken via localhost:8081
.
De stap Export Cosmos DB Emulator Certificaat is specifiek voor .NET (en Java) applicaties omdat op het moment van schrijven, de .NET en Java SDK’s geen
HTTP
modus in de emulator ondersteunen. DePROTOCOL
omgevingsvariabele is ingesteld op https in deservices
sectie en deze stap exporteert het emulatorcertificaat en voegt het toe aan de vertrouwde certificaatopslag van het besturingssysteem.
Probeer het uit!
Deze GitHub-repository biedt voorbeelden van hoe je de Linux-emulator kunt configureren als onderdeel van een GitHub Actions CI-werkstroom voor .NET, Python, Java en Go-applicaties op zowel x64
als ARM64
architecturen (aangetoond voor Linux-runner met Ubuntu).
Fork de Repository
Navigeer naar de GitHub-repository en klik op de Fork knop in de rechterbovenhoek van de repositorypagina om een kopie van de repository onder je eigen GitHub-account te maken.
Open de repository in je GitHub-account en zorg ervoor dat je de workflows inschakelt in de repository-instellingen.
Voeg de Cosmos DB-emulatorverbindingstring (COSMOSDB_CONNECTION_STRING
) toe als een repositorygeheim aan de repository. Gebruik de volgende waarde:
AccountEndpoint=http://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==
Voeg de databasenaam (COSMOSDB_DATABASE_NAME
) en de containernaam (COSMOSDB_CONTAINER_NAME
) toe als repositoryvariabelen:
Kloon de geforkte repository naar je lokale machine (zorg ervoor dat je je GitHub-gebruikersnaam gebruikt):
git clone https://github.com/<your-username>/cosmosdb-linux-emulator-github-actions.git
cd cosmosdb-linux-emulator-github-actions
Trigger de Workflow
Om de workflow te triggeren, maak een kleine wijziging aan een of alle code (.NET, Java, Python of Go), en voeg je wijzigingen toe en commit ze. Voor een makkelijker begrip worden aparte workflows gebruikt voor elke taal.
Push je wijzigingen naar je geforkte repository op GitHub:
git add .
git commit -m "Your commit message"
git push origin main
Na het pushen van de wijzigingen zal GitHub Actions automatisch de workflow uitvoeren. Ga naar het “Actions” tabblad in je repository om de status en resultaten van de workflows te bekijken. Controleer eventuele logs of output om ervoor te zorgen dat de workflows correct worden uitgevoerd.
Overwegingen voor GitHub Actions Runners
De voorbeeldrepository toonde ubuntu
gebaseerde runners (voor x64 en ARM64 architecturen). Dit zou ook moeten werken voor Windows ARM-gebaseerde runners. Als je Windows x64 runners overweegt, let dan op dat op het moment van schrijven, GitHub Actions service containers niet worden ondersteund in non-Linux runners. Maar je kunt dit omzeilen door stappen toe te voegen om Docker te installeren en het levenscyclus te beheren, inclusief het starten en stoppen van de container.
Conclusie
Zoals eerder vermeld, zijn er veel voordelen aan het gebruik van Docker containers in CI pipelines. GitHub Actions werd gebruikt als het CI/CD platform in dit geval, maar deze concepten zijn ook van toepassing op andere oplossingen. Probeer het uit en laat ons weten wat je ervan vindt!
Source:
https://dzone.com/articles/use-azure-cosmos-db-as-a-docker-container-in-cicd