Modular Monolith DDD持续部署:GitLab CI/CD流水线设计

Modular Monolith DDD持续部署:GitLab CI/CD流水线设计

【免费下载链接】modular-monolith-with-ddd Full Modular Monolith application with Domain-Driven Design approach. 【免费下载链接】modular-monolith-with-ddd 项目地址: https://gitcode.com/GitHub_Trending/mo/modular-monolith-with-ddd

引言:从"部署噩梦"到"一键发布"的蜕变

你是否正面临这些模块化单体应用的部署痛点?发布周期长达数天手动操作导致频繁失误测试环境与生产环境配置不一致?本文将基于Domain-Driven Design (DDD)模块化单体项目,提供一套完整的GitLab CI/CD流水线解决方案,帮助团队实现从代码提交到生产部署的全自动化流程。

读完本文你将获得:

  • 模块化单体应用的CI/CD最佳实践
  • 基于GitLab Runner的多阶段流水线配置
  • DDD架构下的数据库迁移自动化方案
  • 容器化部署与环境隔离策略
  • 集成测试与质量门禁实现

一、流水线架构概览

1.1 核心设计原则

针对DDD模块化单体应用的特点,我们的CI/CD流水线遵循以下原则:

原则具体实现收益
阶段隔离划分为build/test/deploy三大阶段故障定位精准,资源利用高效
环境一致性全流程使用Docker容器消除"在我电脑上能运行"问题
质量内建自动化测试覆盖率门禁提前发现模块间集成问题
增量部署基于变更检测的选择性构建缩短构建时间,提升部署频率

1.2 流水线流程图

mermaid

二、构建阶段:模块化应用的编译策略

2.1 多模块构建优化

针对项目中的Administration/Meetings/Payments/UserAccess四大业务模块,采用选择性构建策略:

build:
  stage: build
  image: mcr.microsoft.com/dotnet/sdk:8.0
  script:
    - |
      # 检测变更模块
      CHANGED_MODULES=$(git diff --name-only HEAD^ HEAD | grep '^src/Modules/' | cut -d'/' -f3 | uniq)
      if [ -z "$CHANGED_MODULES" ]; then
        echo "No module changes detected, building all modules"
        dotnet build src/ --configuration Release
      else
        echo "Building changed modules: $CHANGED_MODULES"
        for module in $CHANGED_MODULES; do
          dotnet build src/Modules/$module/ --configuration Release
        done
        dotnet build src/API/ --configuration Release  # API层依赖所有业务模块
      fi
  artifacts:
    paths:
      - src/**/bin/Release/
      - src/**/obj/Release/

2.2 Docker镜像构建

基于项目已有的Dockerfile,优化构建流程:

docker-build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -t $CI_REGISTRY_IMAGE:latest -f src/Dockerfile .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    - docker push $CI_REGISTRY_IMAGE:latest
  dependencies:
    - build

三、测试阶段:DDD应用的质量防线

3.1 测试金字塔实现

根据项目runIntegrationTests.cmd脚本分析,设计完整测试策略:

unit-test:
  stage: test
  image: mcr.microsoft.com/dotnet/sdk:8.0
  script:
    - dotnet test src/Modules/Administration/Tests/UnitTests/
    - dotnet test src/Modules/Meetings/Tests/UnitTests/
    - dotnet test src/Modules/Payments/Tests/UnitTests/
    - dotnet test src/Modules/UserAccess/Tests/UnitTests/
  artifacts:
    reports:
      junit: src/**/TestResults/**/*.trx

integration-test:
  stage: test
  image: mcr.microsoft.com/dotnet/sdk:8.0
  services:
    - name: mcr.microsoft.com/mssql/server:2017-latest-ubuntu
      alias: mssql
      command: ["-e", "ACCEPT_EULA=Y", "-e", "SA_PASSWORD=61cD4gE6!"]
  variables:
    ASPNETCORE_MyMeetings_IntegrationTests_ConnectionString: "Server=mssql,1433;Database=MyMeetings;User=sa;Password=61cD4gE6!"
  script:
    - dotnet build src/Database/DatabaseMigrator/
    - dotnet run --project src/Database/DatabaseMigrator/ $ASPNETCORE_MyMeetings_IntegrationTests_ConnectionString
    - dotnet test src/Tests/IntegrationTests/

3.2 质量门禁配置

code-quality:
  stage: test
  image: sonarsource/sonar-scanner-cli
  variables:
    SONAR_HOST_URL: $SONAR_URL
    SONAR_TOKEN: $SONAR_TOKEN
  script:
    - sonar-scanner -Dsonar.projectKey=$CI_PROJECT_NAME -Dsonar.sources=. -Dsonar.exclusions=**/bin/**,**/obj/**
  allow_failure: true
  artifacts:
    when: always
    paths:
      - sonar-report.json

四、部署阶段:环境一致性保障

4.1 多环境配置管理

基于appsettings.json设计环境变量注入策略:

deploy-dev:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - |
      envsubst < k8s/deployment.yaml | kubectl apply -f -
      kubectl set env deployment/my-meetings \
        -e ConnectionStrings__MeetingsConnectionString=$DEV_DB_CONNECTION \
        -e Security__TextEncryptionKey=$DEV_ENCRYPTION_KEY \
        -e EmailsConfiguration__FromEmail=$DEV_FROM_EMAIL
    - kubectl rollout status deployment/my-meetings
  environment:
    name: development
    url: https://dev.mymeetings.com

4.2 数据库迁移自动化

database-migrate:
  stage: deploy
  image: mcr.microsoft.com/dotnet/sdk:8.0
  script:
    - dotnet run --project src/Database/DatabaseMigrator/ $TARGET_DB_CONNECTION
  before_script:
    - echo "Backup database before migration"
    - dotnet tool install -g dotnet-ef
    - dotnet ef database update --project src/Database/CompanyName.MyMeetings.Database/ --connection $TARGET_DB_CONNECTION --script > migration_backup_$CI_PIPELINE_ID.sql
  artifacts:
    paths:
      - migration_backup_$CI_PIPELINE_ID.sql

五、完整流水线配置

stages:
  - build
  - test
  - deploy

variables:
  DOTNET_CLI_TELEMETRY_OPTOUT: "1"
  NUGET_PACKAGES: "$CI_PROJECT_DIR/.nuget/packages"

cache:
  paths:
    - .nuget/packages/
    - node_modules/

# 构建阶段作业
build:
  stage: build
  # 构建作业配置...

docker-build:
  stage: build
  # Docker构建配置...

# 测试阶段作业
unit-test:
  stage: test
  # 单元测试配置...

integration-test:
  stage: test
  # 集成测试配置...

code-quality:
  stage: test
  # 代码质量检查配置...

# 部署阶段作业
database-migrate:
  stage: deploy
  # 数据库迁移配置...

deploy-dev:
  stage: deploy
  # 开发环境部署配置...

deploy-prod:
  stage: deploy
  when: manual
  # 生产环境部署配置...

六、流水线优化与最佳实践

6.1 常见问题解决方案

问题解决方案实施代码
构建时间过长启用Docker层缓存docker build --cache-from $CI_REGISTRY_IMAGE:cache
测试环境不稳定实现测试数据隔离dotnet test --filter "Category!=Integration"
部署回滚困难版本化部署配置kubectl apply -f k8s/deployment_v$CI_PIPELINE_ID.yaml
敏感信息泄露使用GitLab变量$SECRET_VARIABLE而非明文

6.2 性能优化指标

通过实施上述流水线,可实现以下改进:

mermaid

七、总结与展望

本文详细介绍了基于GitLab CI/CD的DDD模块化单体应用部署方案,通过多阶段流水线设计容器化构建自动化测试环境一致性保障,解决了传统部署流程中的效率低下和质量风险问题。特别针对DDD架构特点,优化了模块构建策略和数据库迁移流程,确保领域模型变更能够安全高效地交付到生产环境。

随着项目规模增长,建议进一步探索:

  • 基于GitOps的声明式部署
  • 混沌工程在CI/CD中的应用
  • 模块独立部署的演进路径

点赞+收藏本文,关注作者获取更多DDD架构与DevOps实践干货!下期预告:《Modular Monolith到微服务的平滑迁移策略》

附录:关键配置文件模板

Dockerfile优化版

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
ENV ASPNETCORE_ENVIRONMENT=Production

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["Directory.Packages.props", "."]
COPY ["src/API/CompanyName.MyMeetings.API/CompanyName.MyMeetings.API.csproj", "src/API/CompanyName.MyMeetings.API/"]
# 仅复制变更的模块项目文件
COPY ["src/Modules/*/Application/*.csproj", "src/Modules/"]
RUN dotnet restore "src/API/CompanyName.MyMeetings.API/CompanyName.MyMeetings.API.csproj"
COPY . .
WORKDIR "/src/src/API/CompanyName.MyMeetings.API"
RUN dotnet build -c Release -o /app/build

FROM build AS publish
RUN dotnet publish -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost/health || exit 1
ENTRYPOINT ["dotnet", "CompanyName.MyMeetings.API.dll"]

环境变量配置模板

{
  "ConnectionStrings": {
    "MeetingsConnectionString": "${DB_CONNECTION_STRING}"
  },
  "Security": {
    "TextEncryptionKey": "${ENCRYPTION_KEY}"
  },
  "EmailsConfiguration": {
    "FromEmail": "${FROM_EMAIL}"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}

【免费下载链接】modular-monolith-with-ddd Full Modular Monolith application with Domain-Driven Design approach. 【免费下载链接】modular-monolith-with-ddd 项目地址: https://gitcode.com/GitHub_Trending/mo/modular-monolith-with-ddd

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值