Gebruik Azure Cosmos DB als een Docker-container in CI/CD-pijplijnen

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:

Dockerfile

 

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).

YAML

 

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. De PROTOCOL omgevingsvariabele is ingesteld op https in de services 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:

Plain Text

 

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):

Plain Text

 

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:

Plain Text

 

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