C#的CI/CD:为懒人和忙人从零搭建流水线

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

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

开始课程

C#的CI/CD:如何停止手动部署,开始享受生活

\n\n

如果你还在本地构建C#项目,通过FTP上传构建产物,并祈祷一切顺利——那我有个消息要告诉你。在2025年,这样做已经说不过去了。即使对于一个小型的个人项目也是如此。

\n\n

CI/CD不是月薪30万的高级开发人员的魔法,而只是一组为你处理日常工作的脚本。今天,我们将从零开始配置一个完整的C# CI/CD流水线。没有废话,只有真实示例和错误分析。

\n\n

顺便说一句,如果你用Python编写代码,我们在pythonlib.ru上也有自动化指南。但今天,我们专注于C#。

\n\n

什么是CI/CD,为什么C#开发者需要它

\n\n

CI(持续集成)——意味着你每次提交到Git的代码都会自动构建和测试。不再有“在我机器上能跑”的情况。

\n\n

CD(持续交付/部署)——意味着在成功构建后,代码会自动部署到服务器(或云端)。

\n\n

对于C#来说,这一点尤其重要:dotnet build在不同机器上的构建结果可能不同,而测试更是经常被所有人遗忘。CI/CD解决了这两个问题。

\n\n

选择工具:GitHub Actions vs GitLab CI vs Jenkins

\n\n

对于初学者,我推荐GitHub Actions。为什么?

\n\n
    \n
  • 对公共仓库免费(是的,对C#也免费)
  • \n
  • 无需搭建服务器
  • \n
  • 有现成的.NET Actions
  • \n
  • YAML易于阅读
  • \n
\n\n

如果你使用GitLab——原理相同,语法类似。Jenkins就留给企业级的地狱吧。

\n\n

为C#项目编写第一个流水线

\n\n

在仓库根目录创建文件 .github/workflows/dotnet.yml。是的,文件必须放在这个文件夹里。

\n\n

这是一个最小可用的流水线,用于构建项目和运行测试:

\n\n
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    - 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\n
    \n
  • on: push — 当推送到main或develop分支时触发流水线
  • \n
  • runs-on: ubuntu-latest — 在Linux上构建(C#在.NET Core/8+上可以运行在任何平台)
  • \n
  • setup-dotnet — 安装指定版本的.NET SDK
  • \n
  • dotnet restore — 恢复NuGet包
  • \n
  • dotnet build — 编译发布版本
  • \n
  • dotnet test — 运行项目中的所有测试
  • \n
\n\n

推送后,进入仓库的Actions选项卡——你会看到流水线正在执行。如果测试失败,你会收到红色状态和邮件通知。

\n\n

添加代码覆盖率(因为没有覆盖率的测试是虚假的)

\n\n

一个漂亮的流水线应该显示有多少代码被测试覆盖。对于C#,我们使用coverlet配合ReportGenerator。

\n\n

首先,将NuGet包添加到测试项目:

\n\n
dotnet add YourTestProject.csproj package coverlet.collector\ndotnet add YourTestProject.csproj package coverlet.msbuild
\n\n

现在,更新流水线中的测试步骤:

\n\n
    - name: Run tests with coverage\n      run: |\n        dotnet test --no-build --configuration Release \\\n          /p:CollectCoverage=true \\\n          /p:CoverletOutputFormat=opencover \\\n          /p:CoverletOutput=./TestResults/coverage.xml\n\n    - name: Install ReportGenerator\n      run: dotnet t                

博客

书籍推荐