引言:为什么基础 CI/CD 不够用?
C# 项目的基础 CI/CD 级别通常仅限于简单的 dotnet build 和 dotnet test 运行。然而,当项目扩展到微服务架构、单体仓库或需要支持多个 .NET 版本时,标准方法就不够用了。构建时间增加,测试重复,NuGet 包的部署过程变得繁琐。
在本文中,我们将探讨为 C# (.NET) 项目配置 GitHub Actions 的高级技术。您将了解如何通过缓存加速流水线、组织并行测试、实现矩阵构建以及配置自动发布到 NuGet。所有代码示例均可直接用于您的项目。
1. 矩阵构建与多版本 .NET 测试
矩阵 (matrix) 是 GitHub Actions 的一个强大工具,允许使用不同参数运行同一个工作流。对于 C# 来说,当需要检查代码与 .NET 6、.NET 8 和 .NET 9 的兼容性时,这必不可少。
矩阵配置示例
创建文件 .github/workflows/ci-matrix.yml:
name: Matrix Build and Test
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest strategy: matrix: dotnet-version: ['6.0.x', '8.0.x', '9.0.x'] configuration: ['Release', 'Debug'] fail-fast: false # 即使某个版本失败,也继续构建
steps: - uses: actions/checkout@v4 - name: Setup .NET ${{ matrix.dotnet-version }} uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ matrix.dotnet-version }} - name: Restore dependencies run: dotnet restore - name: Build run: dotnet build --configuration ${{ matrix.configuration }} --no-restore - name: Run tests run: dotnet test --configuration ${{ matrix.configuration }} --no-build --verbosity normal关键点:
fail-fast: false— 允许查看所有版本的结果,即使其中一个版本失败。- 矩阵不仅可以包含 .NET 版本,还可以包含操作系统(例如
os: [ubuntu-latest, windows-latest])。 - 对于单体仓库,可以添加参数
project-path来测试不同模块。
2. 依赖缓存:将构建速度提升 3 倍
每次运行 GitHub Actions 都从干净的环境开始。如果没有缓存,dotnet restore 每次都会重新下载所有 NuGet 包。对于大型项目,这可能需要 2-5 分钟。解决方案是缓存 ~/.nuget/packages 文件夹。
高级缓存配置
使用 actions/cache action,并设置考虑锁定文件的正确键值:
steps: - uses: actions/checkout@v4
- name: Cache NuGet packages uses: actions/cache@v4 with: path: ~/.nuget/packages # 键值:锁定文件的哈希值 + 操作系统名称 key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }} # 如果锁定文件未更改,则回退到之前的键值 restore-keys: | ${{ runner.os }}-nuget-
- name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '8.0.x'
- name: Restore dependencies run: dotnet restore提示: 如果项目中有多个 .csproj 文件,请使用 hashFiles('**/*.csproj', '**/packages.lock.json') 以获得更精确的哈希值。
3. 并行运行测试与生成报告
当项目中有数百个测试时,顺序运行可能需要数十分钟。GitHub Actions 支持在作业级别进行并行化。但对于