在 CI/CD 流程中使用 Docker 容器有很多好處,尤其是對於像數據庫這樣有狀態的系統。例如,在運行集成測試時,每個 CI 作業都可以在一個隔離的容器中啟動數據庫,保持乾淨的狀態,從而防止測試之間的衝突。這導致了一個可靠、一致且具有成本效益的測試環境。這種方法還可以減少延遲,提高 CI/CD 流程的整體性能,因為數據庫是本地可訪問的。
基於 Linux 的 Azure Cosmos DB 模擬器可作為 Docker 容器使用,並可在包括 Apple Silicon 在內的多種平台上運行。它允許在本地開發和測試應用程序,而無需 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) 平台,允許您使用工作流程自動化您的構建、測試和部署管道。工作流程是一個可配置的自動化過程,可以運行一個或多個作業。它由檢入您庫中的 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 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工作流程的示例,支持x64
和ARM64
架構(在Ubuntu上使用Linux runner演示)。
複製存儲庫
前往 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