添加.NET项目的CI/CD工作流 dotnet-add-ci

这个技能用于自动化地为 .NET 项目添加 CI/CD 工作流,检测平台(GitHub Actions 或 Azure DevOps)并生成构建、测试和打包的启动工作流,简化持续集成过程。关键词:.NET, CI/CD, GitHub Actions, Azure DevOps, 工作流生成。

DevOps 0 次安装 0 次浏览 更新于 3/6/2026

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 builddotnet 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 发布
  • 容器镜像构建
  • 代码覆盖率报告和执行

参考