Azure Cosmos DBをCI/CDパイプラインでDockerコンテナとして使用する

CI/CDパイプラインでDockerコンテナを使用する利点は多数ありますが、特にデータベースなどの状態を持つシステムに適しています。例えば、統合テストを実行する際、各CIジョブはクリーンな状態でデータベースを分離されたコンテナで起動し、テスト間の競合を防ぎます。これにより、信頼性の高い、一貫性のある、費用対効果の高いテスト環境が実現されます。このアプローチは、データベースがローカルでアクセス可能であるため、レイテンシを低減し、CI/CDパイプライン全体のパフォーマンスを向上させます。

LinuxベースのAzure Cosmos DBエミュレータは、Dockerコンテナとして利用可能であり、Apple SiliconなどのARM64アーキテクチャを含む様々なプラットフォームで実行できます。これにより、Azureサブスクリプションを必要とせず、サービスコストを発生させることなく、アプリケーションのローカル開発とテストが可能です。簡単にDockerコンテナとして実行し、ローカル開発とテストに使用できます。

Dockerfile

 

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 コマンドを実行するなど)。

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ランナーで実行されるように構成されており、サービスコンテナとして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)をリポジトリシークレットとして追加します。以下の値を使用してください。

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をインストールし、そのライフサイクルを管理する手順を追加することで、この問題を回避できます。コンテナの起動や停止を含めてください。

まとめ

前述のように、CIパイプラインでDockerコンテナを使用することには多くの利点があります。この場合、GitHub ActionsがCI/CDプラットフォームとして使用されましたが、これらの概念は他のソリューションにも適用されます。試してみて、感想をお聞かせください!

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