引言:为什么 CI/CD 是现代 .NET 开发的标准
现代 C# 和 .NET 平台的开发离不开自动化。手动运行构建、测试和部署是导致错误、浪费时间以及发布延迟的根源。 CI/CD(持续集成 / 持续部署) 解决了这些问题,使代码交付过程变得可预测且快速。
GitHub Actions 是 GitHub 内置的自动化工具,非常适合 C# 项目。它允许您直接在仓库中使用 YAML 文件配置流水线。在本文中,我们将分析完整流程:从基础构建到发布 NuGet 包和部署 Web 应用程序。
1. 面向 .NET 的 GitHub Actions 基础
什么是 workflow 和 job?
Workflow 是一个自动化流程,由事件(push、pull request、schedule)触发。Workflow 由一个或多个 jobs(任务)组成,这些 jobs 在运行器(runner——一台运行 Ubuntu、Windows 或 macOS 的虚拟机)上执行。
每个 job 由多个步骤(steps)组成,这些步骤可以执行 shell 命令或使用来自市场的现成 actions。
第一个 workflow:构建 .NET 项目
在仓库根目录下创建文件夹 .github/workflows 和文件 build.yml:
name: Build .NET Project
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore --configuration Release
- name: Run tests
run: dotnet test --no-build --configuration Release --verbosity normal
此 workflow 在每次向 main 分支进行 push 或 pull request 时触发。它会还原依赖项,以 Release 配置构建项目,并运行测试。如果任何步骤失败,workflow 将停止,您将在 PR 中看到红色状态。
2. 高级配置:构建矩阵与缓存
.NET 版本矩阵
要检查与不同 .NET 版本的兼容性,请使用矩阵(matrix):
jobs:
build:
strategy:
matrix:
dotnet-version: ['6.0.x', '7.0.x', '8.0.x']
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Setup .NET ${{ matrix.dotnet-version }}
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ matrix.dotnet-version }}
- run: dotnet build --configuration Release
- run: dotnet test
Runner 将并行地为每个操作系统和 .NET 版本的组合执行构建。这节省了时间并保证了跨平台兼容性。
依赖项缓存
每次都还原 NuGet 包会花费时间。启用缓存:
- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Restore dependencies
run: dotnet restore
现在,如果 .csproj 文件未更改,再次运行时包将从缓存中还原。
3. 将 NuGet 包发布到 GitHub Packages
如果您正在开发 C# 库,可以在创建发布时自动将其发布到 GitHub Packages。
用于发布的 Workflow
name: Publish NuGet Package
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
```