Существует множество преимуществ использования контейнеров Docker в конвейерах CI/CD, особенно для stateful-систем, таких как базы данных. Например, при запуске интеграционных тестов каждая задача CI может запускать базу данных в изолированном контейнере с чистым состоянием, предотвращая конфликты между тестами. Это приводит к надежной, последовательной и экономичной среде тестирования. Такой подход также снижает задержку и улучшает общую производительность конвейера CI/CD, поскольку база данных доступна локально.
В качестве Docker-контейнера доступен эмулятор Azure Cosmos DB на основе Linux, который может работать на различных платформах, включая архитектуры ARM64, такие как Apple Silicon. Он позволяет локальную разработку и тестирование приложений без необходимости подписки на Azure или дополнительных затрат на услуги. Вы легко можете запустить его как контейнер Docker и использовать для локальной разработки и тестирования:
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).
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
) в качестве секрета репозитория. Используйте следующее значение:
AccountEndpoint=http://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==
Добавьте имя базы данных (COSMOSDB_DATABASE_NAME
) и имя контейнера (COSMOSDB_CONTAINER_NAME
) как переменные репозитория:
Клонируйте созданную копию репозитория на свой локальный компьютер (убедитесь, что используете свое имя пользователя GitHub):
git clone https://github.com/<your-username>/cosmosdb-linux-emulator-github-actions.git
cd cosmosdb-linux-emulator-github-actions
Запуск рабочего процесса
Для запуска рабочего процесса внесите небольшие изменения в любой из кодов (.NET, Java, Python или Go), добавьте и зафиксируйте свои изменения. Для удобства понимания для каждого языка используются отдельные рабочие процессы.
Отправьте ваши изменения в вашу скопированную копию репозитория на GitHub:
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