CI/CD 用于 C# 项目:高级 GitHub Actions

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么基础 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 支持在作业级别进行并行化。但对于

博客

书籍推荐