在 CI/CD 流水線中將 Azure Cosmos DB 用作 Docker 容器

在 CI/CD 流程中使用 Docker 容器有很多好處,尤其是對於像數據庫這樣有狀態的系統。例如,在運行集成測試時,每個 CI 作業都可以在一個隔離的容器中啟動數據庫,保持乾淨的狀態,從而防止測試之間的衝突。這導致了一個可靠、一致且具有成本效益的測試環境。這種方法還可以減少延遲,提高 CI/CD 流程的整體性能,因為數據庫是本地可訪問的。

基於 Linux 的 Azure Cosmos DB 模擬器可作為 Docker 容器使用,並可在包括 Apple Silicon 在內的多種平台上運行。它允許在本地開發和測試應用程序,而無需 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) 平台,允許您使用工作流程自動化您的構建、測試和部署管道。工作流程是一個可配置的自動化過程,可以運行一個或多個作業。它由檢入您庫中的 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 runner上運行,並使用mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview docker映像作為服務容器。連接字串、資料庫名稱和容器名稱被設定為環境變數。由於這份工作直接在GitHub Actions hosted runner上運行,”Run tests”步驟可以使用localhost:8081訪問模擬器。

“Export Cosmos DB Emulator Certificate”步驟專門針對.NET(以及Java)應用程序,因為在撰寫時,.NET和Java SDK不支持模擬器中的HTTP模式。在services部分將PROTOCOL環境變數設置為https,這一步將導出模擬器證書並將其添加到作業系統信任的證書存儲。

試試吧!

這個GitHub存儲庫提供了如何將Linux模擬器配置為.NET、Python、Java和Go應用程序的GitHub Actions CI工作流程的示例,支持x64ARM64架構(在Ubuntu上使用Linux runner演示)。

複製存儲庫

前往 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