github actions是c#项目ci/cd最省事可靠的选择,关键需显式配置actions/checkout@v4和actions/setup-dotnet@v4并指定dotnet-version:'8.x',避免因sdk版本不匹配或环境缺失导致build失败。

GitHub Actions 是 C# 项目做 CI/CD 最省事、最可靠的选择——前提是别跳过 setup-dotnet 和 checkout 这两个关键步骤,否则 dotnet build 必然报 “command not found” 或 “SDK not found”。
dotnet build 报错 “The SDK 'Microsoft.NET.Sdk' specified could not be found” 怎么办
这不是代码问题,是环境没配对。GitHub 默认 runner(比如 ubuntu-latest)只预装部分 .NET SDK 版本,而你的项目可能被 global.json 锁死了精确版本(如 "8.0.100"),但 runner 上只有 8.0.103 或 8.0.200,就不认。
- 删掉根目录的
global.json(除非你真要卡死补丁号) - 或者改用
"rollForward": "latestMinor",让 SDK 自动匹配可用的8.x版本 - 更稳妥的做法:在 workflow 里显式安装,用
actions/setup-dotnet@v4+dotnet-version: '8.x'(注意不是8.0.x,后者常匹配失败)
dotnet test 找不到测试或直接崩溃
常见于跨平台运行测试时,尤其在 ubuntu-latest 上跑 Windows-only 代码,比如访问 Registry、WMI 或使用 System.Drawing 的 GDI+ 调用。
- 测试项目必须引用
Microsoft.NET.Test.Sdk,否则dotnet test会静默跳过所有测试 - 用 xUnit 的话,还得装
xunit.runner.visualstudio(.NET Framework)或xunit.runner.console(.NET Core+) - 加
--no-build --verbosity normal参数,能快速区分是“找不到测试”还是“一跑就 PlatformNotSupportedException”
dotnet publish 输出路径和部署动作对不上
默认 dotnet publish -c Release 输出到 bin/Release/net8.0/publish/,但大多数部署 Action(比如 azure/webapps-deploy@v2 或 SFTP 脚本)默认找的是 ./publish 或你指定的相对路径,一 mismatch 就报 No such file or directory。
- 统一加
-o ./publish,强制输出到项目根下的publish目录 - 避免滥用
--self-contained true:它会让体积暴涨(+30MB+),且容易因 RID(如win-x64vslinux-x64)不匹配导致部署失败 - ASP.NET Core 部署后 500 错误?大概率是
ASPNETCORE_ENVIRONMENT没生效,记得在 workflow 里加echo "ASPNETCORE_ENVIRONMENT=Production" >> $GITHUB_ENV
密钥和敏感配置怎么安全注入
硬编码 secrets 到 YAML 里是高危操作,GitHub 会自动 redact 日志,但一旦泄露就不可逆。Secrets 只能在 job 的 runtime 注入,不能在 build 阶段读取(比如 dotnet build 里读取 ${{ secrets.API_KEY }} 是无效的)。
- 密钥只用于部署阶段:比如
docker/login-action用${{ secrets.DOCKER_USERNAME }},azure/webapps-deploy@v2用${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }} - 连接字符串、API 地址等非密钥配置,建议走
appsettings.{Environment}.json+ GitHub Environment 变量管理,而非塞进 Secrets - 微信云托管这类特殊平台,要用 CLI 工具配合
WXCLOUD_APPID和WXCLOUD_CLI_SECRET,这两个必须存在 Secrets 里,且不能出现在任何日志输出中
最容易被忽略的一点:GitHub Actions 的 runs-on 不只是选操作系统,它决定了你能用哪些 SDK、哪些 CLI 工具、甚至哪些底层系统调用。Windows runner 能跑 PowerShell 和注册表操作,Linux runner 更轻更快但缺 GUI 和部分 Windows API——选错平台,测试和部署都会无声失败。











