跳至主要内容

构建和测试 .NET

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

简介

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

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

先决条件

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

我们建议您对 .NET Core SDK 有基本了解。有关更多信息,请参阅 开始使用 .NET

使用 .NET 启动工作流

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

GitHub 为 .NET 提供了一个启动工作流,该工作流应该适用于大多数 .NET 项目。本指南的后续部分将提供有关如何自定义此启动工作流的示例。

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

  2. 在您的仓库名称下,点击 操作.

    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 托管的运行器上使用预安装的 .NET Core SDK 版本,请使用 setup-dotnet 操作。此操作会在每个运行器上的工具缓存中找到特定版本的 .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