在CI/CD流水线中将Azure Cosmos DB用作Docker容器

使用Docker容器在CI/CD流水线中有许多好处,特别适用于像数据库这样有状态的系统。例如,在运行集成测试时,每个CI作业都可以在一个具有干净状态的隔离容器中启动数据库,从而避免测试之间的冲突。这会导致一个可靠、一致且具有成本效益的测试环境。这种方法还可以减少延迟,提高CI/CD流水线的整体性能,因为数据库是本地可访问的。

基于Linux的Azure Cosmos DB模拟器可作为Docker容器使用,可在多种平台上运行,包括像Apple Silicon这样的ARM64架构。它允许在本地开发和测试应用程序,无需Azure订阅或产生服务费用。您可以轻松将其作为一个运行,并将其用于本地开发和测试:

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 托管的 runner 上运行,因此“运行测试”步骤可以使用 localhost:8081 访问模拟器。

导出 Cosmos DB 模拟器证书步骤专门针对.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)作为存储库变量

将fork后的存储库克隆到本地计算机(确保使用您的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上的您的forked存储库:

Plain Text

 

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