跳至主要内容

构建和测试 .NET

您可以创建一个持续集成 (CI) 工作流来构建和测试您的 .NET 项目。

简介

本指南将向您展示如何构建、测试和发布 .NET 包。

GitHub 托管的 Runner 具有预安装软件的工具缓存,其中包括 .NET Core SDK。有关最新软件和预安装 .NET Core SDK 版本的完整列表,请参阅 GitHub 托管的 Runner 上安装的软件

先决条件

您应该已经熟悉 YAML 语法以及如何在 GitHub Actions 中使用它。有关更多信息,请参阅“GitHub Actions 的工作流语法”。

我们建议您对 .NET Core SDK 有基本的了解。有关更多信息,请参阅 .NET 入门

使用 .NET 工作流模板

要快速入门,请将工作流模板添加到存储库的 .github/workflows 目录。

GitHub 提供了一个适用于 .NET 的工作流模板,该模板应该适用于大多数 .NET 项目。本指南后续部分将举例说明如何自定义此工作流模板。

  1. 在 GitHub 上,导航到存储库的主页。

  2. 在您的存储库名称下,单击 Actions.

    Screenshot of the tabs for the "github/docs" repository. The "Actions" tab is highlighted with an orange outline.

  3. 如果您存储库中已经有工作流,请单击 **新建工作流**。

  4. “选择工作流”页面显示推荐的工作流模板选择。搜索“dotnet”。

  5. 在“.NET”工作流上,单击 **配置**。

  6. 根据需要编辑工作流。例如,更改 .NET 版本。

  7. 单击 **提交更改**。

    dotnet.yml 工作流文件将添加到存储库的 .github/workflows 目录。

指定 .NET 版本

要在 GitHub 托管的 Runner 上使用预安装的 .NET Core SDK 版本,请使用 setup-dotnet 操作。此操作从每个 Runner 上的工具缓存中查找特定版本的 .NET,并将必要的二进制文件添加到 PATH。这些更改将在作业的剩余时间内持续存在。

推荐使用setup-dotnet操作来在GitHub Actions中使用.NET,因为它可以确保在不同的运行器和不同的.NET版本之间保持一致的行为。如果您使用的是自托管运行器,则必须安装.NET并将其添加到PATH中。更多信息,请参阅setup-dotnet操作。

使用多个.NET版本

name: dotnet package

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        dotnet-version: [ '3.1.x', '6.0.x' ]

    steps:
      - uses: actions/checkout@v4
      - name: Setup dotnet ${{ matrix.dotnet-version }}
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: ${{ matrix.dotnet-version }}
      # You can test your matrix by printing the current dotnet version
      - name: Display dotnet version
        run: dotnet --version

使用特定.NET版本

您可以将作业配置为使用特定版本的.NET,例如6.0.22。或者,您可以使用语义版本语法来获取最新的次要版本。此示例使用.NET 6的最新次要版本。

    - name: Setup .NET 6.x
      uses: actions/setup-dotnet@v3
      with:
        # Semantic version range syntax or exact version of a dotnet version
        dotnet-version: '6.x'

安装依赖项

GitHub 托管的运行器已安装 NuGet 包管理器。您可以使用 dotnet CLI 从 NuGet 包注册表安装依赖项,然后再构建和测试您的代码。例如,以下 YAML 安装了Newtonsoft包。

steps:
- uses: actions/checkout@v4
- name: Setup dotnet
  uses: actions/setup-dotnet@v3
  with:
    dotnet-version: '6.0.x'
- name: Install dependencies
  run: dotnet add package Newtonsoft.Json --version 12.0.1

缓存依赖项

您可以使用可选的cache输入为将来的工作流缓存 NuGet 依赖项。例如,以下 YAML 缓存了 NuGet global-packages文件夹,然后安装了Newtonsoft包。第二个可选输入cache-dependency-path可用于指定依赖项文件的路径:packages.lock.json

更多信息,请参阅“缓存依赖项以加快工作流速度”。

steps:
- uses: actions/checkout@v4
- name: Setup dotnet
  uses: actions/setup-dotnet@v3
  with:
    dotnet-version: '6.x'
    cache: true
- name: Install dependencies
  run: dotnet add package Newtonsoft.Json --version 12.0.1

注意

根据依赖项的数量,使用依赖项缓存可能会更快。拥有许多大型依赖项的项目将看到性能提升,因为它减少了下载所需的时间。依赖项较少的项目可能不会看到明显的性能提升,甚至可能由于 NuGet 安装缓存的依赖项的方式而略有下降。性能因项目而异。

构建和测试您的代码

您可以使用与本地相同的命令来构建和测试您的代码。此示例演示如何在作业中使用dotnet builddotnet test

steps:
- uses: actions/checkout@v4
- name: Setup dotnet
  uses: actions/setup-dotnet@v3
  with:
    dotnet-version: '6.0.x'
- name: Install dependencies
  run: dotnet restore
- name: Build
  run: dotnet build
- name: Test with the dotnet CLI
  run: dotnet test

将工作流数据打包为项目

工作流完成后,您可以上传生成的项目进行分析。例如,您可能需要保存日志文件、核心转储、测试结果或屏幕截图。以下示例演示如何使用upload-artifact操作上传测试结果。

更多信息,请参阅“存储和共享工作流数据”。

name: dotnet package

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        dotnet-version: [ '3.1.x', '6.0.x' ]

      steps:
        - uses: actions/checkout@v4
        - name: Setup dotnet
          uses: actions/setup-dotnet@v3
          with:
            dotnet-version: ${{ matrix.dotnet-version }}
        - name: Install dependencies
          run: dotnet restore
        - name: Test with dotnet
          run: dotnet test --logger trx --results-directory "TestResults-${{ matrix.dotnet-version }}"
        - name: Upload dotnet test results
          uses: actions/upload-artifact@v4
          with:
            name: dotnet-results-${{ matrix.dotnet-version }}
            path: TestResults-${{ matrix.dotnet-version }}
          # Use always() to always run this step to publish test results when there are test failures
          if: ${{ always() }}

发布到包注册表

您可以将工作流配置为在 CI 测试通过时将您的 .NET 包发布到包注册表。您可以使用仓库密钥存储发布二进制文件所需的任何令牌或凭据。以下示例使用dotnet core cli创建并发布到 GitHub Packages 的包。

name: Upload dotnet package

on:
  release:
    types: [created]

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-dotnet@v3
        with:
          dotnet-version: '6.0.x' # SDK Version to use.
          source-url: https://nuget.pkg.github.com/<owner>/index.json
        env:
          NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
      - run: dotnet build --configuration Release <my project>
      - name: Create the package
        run: dotnet pack --configuration Release <my project>
      - name: Publish the package to GPR
        run: dotnet nuget push <my project>/bin/Release/*.nupkg