C#的CI/CD:如何停止手动部署,开始享受生活
\n\n如果你还在本地构建C#项目,通过FTP上传构建产物,并祈祷一切顺利——那我有个消息要告诉你。在2025年,这样做已经说不过去了。即使对于一个小型的个人项目也是如此。
\n\nCI/CD不是月薪30万的高级开发人员的魔法,而只是一组为你处理日常工作的脚本。今天,我们将从零开始配置一个完整的C# CI/CD流水线。没有废话,只有真实示例和错误分析。
\n\n顺便说一句,如果你用Python编写代码,我们在pythonlib.ru上也有自动化指南。但今天,我们专注于C#。
\n\n什么是CI/CD,为什么C#开发者需要它
\n\nCI(持续集成)——意味着你每次提交到Git的代码都会自动构建和测试。不再有“在我机器上能跑”的情况。
\n\nCD(持续交付/部署)——意味着在成功构建后,代码会自动部署到服务器(或云端)。
\n\n对于C#来说,这一点尤其重要:dotnet build在不同机器上的构建结果可能不同,而测试更是经常被所有人遗忘。CI/CD解决了这两个问题。
选择工具:GitHub Actions vs GitLab CI vs Jenkins
\n\n对于初学者,我推荐GitHub Actions。为什么?
\n\n- \n
- 对公共仓库免费(是的,对C#也免费) \n
- 无需搭建服务器 \n
- 有现成的.NET Actions \n
- YAML易于阅读 \n
如果你使用GitLab——原理相同,语法类似。Jenkins就留给企业级的地狱吧。
\n\n为C#项目编写第一个流水线
\n\n在仓库根目录创建文件 .github/workflows/dotnet.yml。是的,文件必须放在这个文件夹里。
这是一个最小可用的流水线,用于构建项目和运行测试:
\n\nname: .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
推送后,进入仓库的Actions选项卡——你会看到流水线正在执行。如果测试失败,你会收到红色状态和邮件通知。
\n\n添加代码覆盖率(因为没有覆盖率的测试是虚假的)
\n\n一个漂亮的流水线应该显示有多少代码被测试覆盖。对于C#,我们使用coverlet配合ReportGenerator。
\n\n首先,将NuGet包添加到测试项目:
\n\ndotnet 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