name: dotnet-add-ci description: “为 .NET 项目添加 CI/CD。GitHub Actions 与 Azure DevOps 检测,工作流模板。”
dotnet-add-ci
为现有 .NET 项目添加启动 CI/CD 工作流。检测托管平台(GitHub Actions 或 Azure DevOps)并生成适当的构建、测试和打包启动工作流。
范围
- 平台检测(GitHub Actions 与 Azure DevOps)
- 启动构建/测试/打包工作流生成
- .NET 项目的基础 CI 工作流模板
超出范围
- 高级 CI/CD 模式(可重用工作流、矩阵构建、部署)-- 参见 [技能:dotnet-gha-patterns] 和 [技能:dotnet-ado-patterns]
先决条件: 首先运行 [技能:dotnet-version-detection] 以确定工作流的 SDK 版本。运行 [技能:dotnet-project-analysis] 以了解解决方案结构。
交叉引用:对于构建属性布局,参见 [技能:dotnet-project-structure],对于生成这些工作流构建的项目结构,参见 [技能:dotnet-scaffold-project]。
平台检测
从现有仓库指示器中检测 CI 平台:
| 指示器 | 平台 |
|---|---|
.github/ 目录存在 |
GitHub Actions |
azure-pipelines.yml 存在 |
Azure DevOps |
.github/workflows/ 包含 YAML 文件 |
GitHub Actions(已配置) |
| 两者皆无 | 询问用户目标平台 |
GitHub Actions 启动工作流
创建 .github/workflows/build.yml:
name: 构建和测试
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: read
env:
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 设置 .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json
- name: 恢复
run: dotnet restore --locked-mode
- name: 构建
run: dotnet build --no-restore -c Release
- name: 测试
run: dotnet test --no-build -c Release --logger trx --results-directory TestResults
- name: 上传测试结果
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results
path: TestResults/**/*.trx
关键决策解释
global-json-file— 使用仓库的global.json来安装确切的 SDK 版本。如果项目没有global.json,替换为dotnet-version: '10.0.x'(或适当版本)--locked-mode— 确保packages.lock.json文件被尊重;如果它们过时则失败。如果项目不使用锁定文件,替换为普通dotnet restore-c Release— 以 Release 模式构建,以便ContinuousIntegrationBuild生效permissions: contents: read— 最小权限原则- 环境变量 — 在日志中抑制 .NET CLI 噪音
添加 NuGet 打包(库)
对于发布到 NuGet 的项目,添加打包步骤:
- name: 打包
run: dotnet pack --no-build -c Release -o artifacts
- name: 上传包
uses: actions/upload-artifact@v4
with:
name: nuget-packages
path: artifacts/*.nupkg
Azure DevOps 启动管道
在仓库根目录创建 azure-pipelines.yml:
trigger:
branches:
include:
- main
pr:
branches:
include:
- main
pool:
vmImage: 'ubuntu-latest'
variables:
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
buildConfiguration: 'Release'
steps:
- task: UseDotNet@2
displayName: '设置 .NET SDK'
inputs:
useGlobalJson: true
- script: dotnet restore --locked-mode
displayName: '恢复'
- script: dotnet build --no-restore -c $(buildConfiguration)
displayName: '构建'
- task: DotNetCoreCLI@2
displayName: '测试'
inputs:
command: 'test'
arguments: '--no-build -c $(buildConfiguration) --logger trx'
publishTestResults: true
添加 NuGet 打包(库)
- script: dotnet pack --no-build -c $(buildConfiguration) -o $(Build.ArtifactStagingDirectory)
displayName: '打包'
- task: PublishBuildArtifacts@1
displayName: '发布 NuGet 包'
inputs:
pathToPublish: '$(Build.ArtifactStagingDirectory)'
artifactName: 'nuget-packages'
调整启动工作流
多 TFM 项目
如果项目多目标,默认工作流无需更改 — dotnet build 和 dotnet test 自动处理所有 TFM。启动器无需矩阵。
仅 Windows 项目(MAUI, WPF, WinForms)
更改运行器:
# GitHub Actions
runs-on: windows-latest
# Azure DevOps
pool:
vmImage: 'windows-latest'
解决方案筛选器
如果仓库有多个解决方案或使用解决方案筛选器:
- name: 构建
run: dotnet build MyApp.slnf --no-restore -c Release
验证
添加工作流后,本地验证:
# GitHub Actions — 验证 YAML 语法
# 安装:gh extension install moritztomasi/gh-workflow-validator
gh workflow-validator .github/workflows/build.yml
# 或者简单地验证构建步骤在本地工作
dotnet restore --locked-mode
dotnet build --no-restore -c Release
dotnet test --no-build -c Release
推送分支并打开 PR 以触发工作流。
下一步
这个启动器涵盖构建-测试-打包。对于高级场景,参见 CI/CD 深度技能:
- 可重用复合操作和工作流模板
- 跨 OS/TFM 组合的矩阵构建
- 带有环境门的部署管道
- 带签名的 NuGet 发布
- 容器镜像构建
- 代码覆盖率报告和执行