Используйте Azure Cosmos DB в качестве контейнера Docker в конвейерах CI/CD

Существует множество преимуществ использования контейнеров Docker в конвейерах CI/CD, особенно для stateful-систем, таких как базы данных. Например, при запуске интеграционных тестов каждая задача CI может запускать базу данных в изолированном контейнере с чистым состоянием, предотвращая конфликты между тестами. Это приводит к надежной, последовательной и экономичной среде тестирования. Такой подход также снижает задержку и улучшает общую производительность конвейера CI/CD, поскольку база данных доступна локально.

В качестве Docker-контейнера доступен эмулятор Azure Cosmos DB на основе Linux, который может работать на различных платформах, включая архитектуры ARM64, такие как Apple Silicon. Он позволяет локальную разработку и тестирование приложений без необходимости подписки на Azure или дополнительных затрат на услуги. Вы легко можете запустить его как контейнер Docker и использовать для локальной разработки и тестирования:

Dockerfile

 

docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview

Azure Cosmos DB с помощью действий GitHub

Давайте рассмотрим пример, чтобы лучше понять, как использовать эмулятор Azure Cosmos DB с GitHub Actions, который является платформой непрерывной интеграции и непрерывной доставки (CI/CD), позволяющей автоматизировать ваш процесс сборки, тестирования и развертывания с помощью рабочих процессов. Рабочий процесс — это конфигурируемый автоматизированный процесс, который может выполнять одну или несколько задач. Он определяется файлом YAML, который проверяется в вашем репозитории, и запускается при срабатывании события в вашем репозитории или может быть запущен вручную или по установленному расписанию.

Пример: CI Рабочий процесс для .NET приложения

Этот рабочий процесс GitHub Actions настраивает эмулятор Azure Cosmos DB на базе Linux в качестве сервисного контейнера GitHub actions в рамках задачи. GitHub заботится о запуске контейнера Docker и уничтожает его, когда задача завершена — вмешательство человека не требуется (например, выполнение команды docker run).

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

Эта работа настроена для запуска на раннере Ubuntu и использует образ Docker mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview в качестве сервисного контейнера. Строка подключения, имя базы данных и имя контейнера настроены как переменные среды. Поскольку работа запускается непосредственно на раннере, предоставленном GitHub Actions, шаг “Запустить тесты” может получить доступ к эмулятору, используя localhost:8081.

Шаг “Экспорт сертификата эмулятора Cosmos DB” специфичен для приложений .NET (а также Java), потому что на момент написания SDK .NET и Java не поддерживают режим HTTP в эмуляторе. Переменная среды PROTOCOL установлена в https в разделе services, и этот шаг экспортирует сертификат эмулятора и добавляет их в хранилище доверенных сертификатов операционной системы.

Попробуйте сами!

Этот репозиторий GitHub предоставляет примеры того, как настроить эмулятор Linux в рамках рабочего процесса CI GitHub Actions для приложений на .NET, Python, Java и Go на архитектурах x64 и ARM64 (продемонстрировано для раннера Linux с использованием Ubuntu).

Клонирование репозитория

Перейдите на страницу репозитория на GitHub и нажмите кнопку Fork в правом верхнем углу страницы репозитория, чтобы создать копию репозитория в своей учетной записи GitHub.

На своей учетной записи GitHub откройте репозиторий и убедитесь, что в настройках репозитория включены рабочие процессы.

Добавьте строку подключения к эмулятору Cosmos DB (COSMOSDB_CONNECTION_STRING) в качестве секрета репозитория. Используйте следующее значение:

Plain Text

 

AccountEndpoint=http://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==

Добавьте имя базы данных (COSMOSDB_DATABASE_NAME) и имя контейнера (COSMOSDB_CONTAINER_NAME) как переменные репозитория:

Клонируйте созданную копию репозитория на свой локальный компьютер (убедитесь, что используете свое имя пользователя GitHub):

Plain Text

 

git clone https://github.com/<your-username>/cosmosdb-linux-emulator-github-actions.git

cd cosmosdb-linux-emulator-github-actions

Запуск рабочего процесса

Для запуска рабочего процесса внесите небольшие изменения в любой из кодов (.NET, Java, Python или Go), добавьте и зафиксируйте свои изменения. Для удобства понимания для каждого языка используются отдельные рабочие процессы.

Отправьте ваши изменения в вашу скопированную копию репозитория на GitHub:

Plain Text

 

git add . 
git commit -m "Your commit message" 
git push origin main

После внесения изменений GitHub Actions автоматически запустит рабочий процесс. Перейдите на вкладку “Actions” в вашем репозитории, чтобы увидеть статус и результаты рабочих процессов. Просмотрите любые логи или выводы, чтобы убедиться, что рабочие процессы работают корректно.

Соображения по GitHub Actions Runner

В примерном репозитории были продемонстрированы раннеры на базе ubuntu (для архитектур x64 и ARM64). Это должно работать и для раннеров на базе Windows ARM. Если вы рассматриваете раннеры Windows x64, обратите внимание, что на момент написания контейнеры сервисов GitHub Actions не поддерживаются на не-Linux раннерах. Но вы можете обойти это, добавив шаги для установки Docker и управления его жизненным циклом, включая запуск и остановку контейнера.

Заключение

Как я уже упоминал ранее, использование контейнеров Docker в CI-пайплайнах имеет много преимуществ. GitHub Actions использовался в качестве платформы CI/CD в этом случае, но эти концепции применимы и к другим решениям. Попробуйте, и дайте нам знать, что вы думаете!

Source:
https://dzone.com/articles/use-azure-cosmos-db-as-a-docker-container-in-cicd