使用Docker容器在CI/CD流水线中有许多好处,特别适用于像数据库这样有状态的系统。例如,在运行集成测试时,每个CI作业都可以在一个具有干净状态的隔离容器中启动数据库,从而避免测试之间的冲突。这会导致一个可靠、一致且具有成本效益的测试环境。这种方法还可以减少延迟,提高CI/CD流水线的整体性能,因为数据库是本地可访问的。
基于Linux的Azure Cosmos DB模拟器可作为Docker容器使用,可在多种平台上运行,包括像Apple Silicon这样的ARM64架构。它允许在本地开发和测试应用程序,无需Azure订阅或产生服务费用。您可以轻松将其作为一个
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 托管的 runner 上运行,因此“运行测试”步骤可以使用 localhost:8081
访问模拟器。
导出 Cosmos DB 模拟器证书步骤专门针对.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
)作为存储库变量:
将fork后的存储库克隆到本地计算机(确保使用您的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上的您的forked存储库:
git add .
git commit -m "Your commit message"
git push origin main
提交更改后,GitHub Actions 将自动运行工作流程。转到存储库中的 “Actions” 选项卡,查看工作流程的状态和结果。查看任何日志或输出,确保工作流程正常运行。
GitHub Actions 运行器考虑事项
这个示例存储库展示了基于 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