引言:为什么 C# 项目需要 CI/CD?
\n使用 C# 和 .NET 平台开发现代应用程序不仅需要高质量的代码,还需要可靠的交付流程。手动构建、测试和部署不仅速度慢,而且容易出错。这时 CI/CD(持续集成/持续部署)就派上了用场——这是一种自动化软件生命周期所有阶段的实践。
\nGitHub Actions 是 GitHub 内置的工具,允许您直接在仓库中创建强大的流水线。在本文中,我们将探讨如何使用 GitHub Actions 为 C# 项目配置完整的 CI/CD:从简单的构建到自动部署。您将学习如何编写 YAML 配置、优化测试以及避免常见错误。
\n\nGitHub Actions 的 .NET 基础
\n什么是 workflow 和 job?
\nWorkflow(工作流程)是一个自动化的流程,由特定事件(push、pull request、创建 release)触发。它定义在 .github/workflows/*.yml 文件中。Workflow 由一个或多个 job(任务)组成,这些 job 在 runner(虚拟机)上执行。每个 job 可以包含一系列 steps(步骤)。
对于 C# 项目,关键步骤包括恢复依赖项(dotnet restore)、构建(dotnet build)、运行测试(dotnet test)和发布(dotnet publish)。
.NET 的基本 workflow 模板
\n以下是一个用于构建和测试 C# 项目的最小 workflow。将此代码保存到文件 .github/workflows/dotnet-ci.yml 中。
name: .NET CI\n\non:\n push:\n branches: [ main, develop ]\n pull_request:\n branches: [ main ]\n\njobs:\n build-and-test:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout repository\n uses: actions/checkout@v4\n\n - name: Setup .NET\n uses: actions/setup-dotnet@v4\n with:\n dotnet-version: '8.0.x'\n\n - name: Restore dependencies\n run: dotnet restore\n\n - name: Build\n run: dotnet build --no-restore --configuration Release\n\n - name: Run tests\n run: dotnet test --no-build --configuration Release --verbosity normal\n关键行解析:
\n- \n
actions/checkout@v4— 将仓库克隆到执行环境中。 \n actions/setup-dotnet@v4— 安装指定版本的 .NET SDK。 \n dotnet restore— 下载 NuGet 包。 \n dotnet build --configuration Release— 以 Release 模式构建项目。 \n dotnet test— 运行解决方案中的所有测试。 \n
高级配置:缓存和构建矩阵
\nNuGet 包缓存
\n每次运行 workflow 都从干净的环境开始。为了加速这个过程,可以缓存 ~/.nuget/packages 文件夹。这对于拥有数十个依赖项的大型项目尤其有用。
steps:\n - uses: actions/cache@v4\n with:\n path: ~/.nuget/packages\n key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}\n restore-keys: |\n ${{ runner.os }}-nuget-\n - run: dotnet restore\n缓存键基于项目文件(.csproj)的哈希值构建。如果依赖项没有变化,缓存将在几秒钟内恢复。
构建矩阵(Matrix Strategy)
\n如果您的应用程序需要针对不同的 .NET 版本或操作系统运行,请使用矩阵。GitHub Actions 会自动为每个组合创建一个单独的 job。
\njobs:\n build:\n strategy:\n matrix:\n os: [ubuntu-latest, windows-latest]\n dotnet: ['6.0.x', '8.0.x']\n runs-on: ${{ matrix.os }}\n steps:\n - uses: actions/checkout@v4\n - name: Setup .NET\n