CI/CDパイプラインでDockerコンテナを使用する利点は多数ありますが、特にデータベースなどの状態を持つシステムに適しています。例えば、統合テストを実行する際、各CIジョブはクリーンな状態でデータベースを分離されたコンテナで起動し、テスト間の競合を防ぎます。これにより、信頼性の高い、一貫性のある、費用対効果の高いテスト環境が実現されます。このアプローチは、データベースがローカルでアクセス可能であるため、レイテンシを低減し、CI/CDパイプライン全体のパフォーマンスを向上させます。
LinuxベースのAzure Cosmos DBエミュレータは、Dockerコンテナとして利用可能であり、Apple SiliconなどのARM64アーキテクチャを含む様々なプラットフォームで実行できます。これにより、Azureサブスクリプションを必要とせず、サービスコストを発生させることなく、アプリケーションのローカル開発とテストが可能です。簡単にDockerコンテナとして実行し、ローカル開発とテストに使用できます。
docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
GitHub Actionsを使用したAzure Cosmos DB
Azure Cosmos DB エミュレーターを GitHub Actions と一緒に使用する方法を理解するために、例を見てみましょう。継続的インテグレーションと継続的デリバリー (CI/CD) プラットフォームである GitHub Actions は、ワークフローを使用してビルド、テスト、およびデプロイメントパイプラインを自動化することを可能にします。ワークフローは、1 つ以上のジョブを実行できる設定可能な自動化プロセスです。これは、リポジトリにチェックインされた YAML ファイルによって定義され、リポジトリ内のイベントによってトリガーされるか、手動または定義されたスケジュールでトリガーされることができます。
例: .NET アプリケーションの CI ワークフロー
この 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ランナーで実行されるように構成されており、サービスコンテナとしてmcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
のDockerイメージを使用します。接続文字列、データベース名、コンテナ名は環境変数として構成されています。このジョブはGitHub Actionsホストランナー上で直接実行されるため、「テストを実行」ステップではlocalhost:8081
を使用してエミュレータにアクセスできます。
「Cosmos DBエミュレータ証明書のエクスポート」ステップは、.NET(およびJava)アプリケーションに特有であり、現時点では.NETおよびJava SDKはエミュレータでの
HTTP
モードをサポートしていないためです。「PROTOCOL」環境変数はservices
セクションでhttpsに設定され、このステップではエミュレータ証明書をエクスポートしてオペレーティングシステムの信頼された証明書ストアに追加します。
試してみてください!
このGitHubリポジトリでは、Linuxエミュレータを.NET、Python、Java、Goアプリケーション用にx64
およびARM64
アーキテクチャ(Ubuntuを使用したLinuxランナーでデモ)のGitHub Actions CIワークフローの一部として構成する方法の例が提供されています。
リポジトリをフォークします。
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をインストールし、そのライフサイクルを管理する手順を追加することで、この問題を回避できます。コンテナの起動や停止を含めてください。
まとめ
前述のように、CIパイプラインでDockerコンテナを使用することには多くの利点があります。この場合、GitHub ActionsがCI/CDプラットフォームとして使用されましたが、これらの概念は他のソリューションにも適用されます。試してみて、感想をお聞かせください!
Source:
https://dzone.com/articles/use-azure-cosmos-db-as-a-docker-container-in-cicd