生成、测试和部署 .NET Core 应用

Azure DevOps Services |Azure DevOps Server 2022 - Azure DevOps Server 2019 |TFS 2018

使用管道自动生成和测试 .NET Core 项目。 了解如何执行以下任务:

注意

有关.NET Framework项目的帮助,请参阅使用 .NET Framework 生成 ASP.NET 应用

注意

在 Microsoft Team Foundation Server (TFS) 2018 和更低版本中,生成和发布管道被称为“定义”,运行被称为“生成”,服务连接被称为“服务终结点”,阶段被称为“环境”,而作业被称为“阶段” 。

创建第一个管道

你不熟悉 Azure Pipelines 吗? 如果是这样,建议首先尝试以下部分。

创建 .NET 项目

如果没有要使用的 .NET 项目,请创建一个新项目,并将代码上传到 GitHub 存储库或Azure Repos。 首先安装 最新的 .NET 6.0 SDK。

创建新的 .NET 6 Web 应用。

dotnet new webapp -f net6.0

在同一终端会话中,使用项目目录中的 dotnet run 命令在本地运行应用程序。

dotnet run

上载代码

将代码上传到新的 Webapp GitHub 或Azure Repos:

登录到 Azure Pipelines

登录到 Azure Pipelines。 登录后,浏览器会转到 https://dev.azure.com/my-organization-name 并显示 Azure DevOps 仪表板。

在所选组织中,创建项目。 如果组织中没有任何项目,则会显示“创建项目并开始使用”屏幕。 否则,请选择仪表板右上角的 “新建项目 ”按钮。

创建管道

  1. 登录到 Azure DevOps 组织并转到项目。

  2. 转到“管道”,然后选择“新建管道”。

  3. 完成向导中的各个步骤。首先选择“GitHub”作为源代码位置。

  4. 可能会重定向到 GitHub 进行登录。 如果是这样,请输入 GitHub 凭据。

  5. 看到存储库列表时,请选择你的存储库。

  6. 你可能会被重定向到 GitHub 来安装 Azure Pipelines 应用。 如果是这样,请选择“批准并安装”。

出现“配置”选项卡时,选择 ASP.NET Core

  1. 检查新管道以查看 YAML 的作用。 准备就绪后,选择“保存并运行”。

    在新的 YAML 管道中保存并运行按钮

  2. 将新的 azure-pipelines.yml 文件提交到存储库。 对消息感到满意后,选择“ 保存”并再次运行

    如果要监视管道的操作,请选择生成作业。

    由于代码似乎与 ASP.NET Core模板匹配良好,因此我们会自动为你创建管道。

    现在,存储库中有一个正在运行的 YAML 管道 (azure-pipelines.yml) ,可供你自定义!

  3. 准备好对管道进行更改时,请在“管道”页中选择它,然后编辑azure-pipelines.yml该文件。

阅读进一步了解自定义管道的一些更常见方法。

YAML

  1. azure-pipelines.yml在存储库中添加文件。 为生成自定义以下代码片段。
trigger:
- master

pool: Default

variables:
  buildConfiguration: 'Release'

# do this before all your .NET Core tasks
steps:
- task: DotNetCoreInstaller@2
  inputs:
    version: '2.2.402' # replace this value with the version that you need for your project
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
  1. 创建管道 并选择 YAML 模板。

  2. 为管道设置 代理池YAML 文件路径

  3. 保存管道并排队生成。 出现 “生成#nnnnnnnn.n ”消息时,选择编号链接以查看管道的操作。

  4. 准备好对管道进行更改时, 请对其进行编辑

阅读进一步了解自定义管道的一些更常见方法。

经典

  1. 创建管道 并选择 “空管道 ”模板。

  2. 在任务目录中,查找并添加 .NET Core 任务。 以下任务运行 dotnet build 以在示例存储库中生成代码。

  3. 保存管道并排队生成。 出现 “生成#nnnnnnnn.n ”消息时,选择编号链接以查看管道的操作。

    现在,你已有一个可供你自定义的工作管道!

  4. 准备好对管道进行更改时, 请对其进行编辑

阅读进一步了解自定义管道的一些更常见方法。

生成环境

使用 Azure Pipelines 生成 .NET Core 项目。 在 Windows、Linux 或 macOS 上生成项目,而无需设置基础结构。 Azure Pipelines 中的 Microsoft 托管代理 包括多个预安装的 .NET Core SDK 版本。

Ubuntu 18.04 在 YAML 文件中设置。

pool:
  vmImage: 'ubuntu-18.04' # examples of other options: 'macOS-10.15', 'windows-2019'

有关映像和的完整列表,请参阅 Microsoft 托管的代理,获取更多示例。

Microsoft 托管的代理不包括 .NET Core SDK 的一些较旧版本。 它们通常不包括预发行版版本。 如果需要 Microsoft 托管代理上的此类 SDK, 请将UseDotNet@2 任务添加到 YAML 文件。

若要安装用于生成的 6.0.x SDK,请添加以下代码片段:

steps:
- task: UseDotNet@2
  inputs:
    version: '6.0.x'

Windows 代理已包含 .NET Core 运行时。 若要安装较新的 SDK,请在以下代码片段中设置为performMultiLevelLookuptrue

steps:
- task: UseDotNet@2
  displayName: 'Install .NET Core SDK'
  inputs:
    version: 5.0.x
    performMultiLevelLookup: true
    includePreviewVersions: true # Required for preview versions

提示

若要节省运行工具安装程序的成本,可以设置 自承载代理。 请参阅 LinuxmacOSWindows。 如果拥有大型存储库或运行增量生成,还可以使用自承载代理节省额外的时间。 自承载代理还可以帮助你使用 Azure DevOps 正式支持的预览版或专用 SDK,或者只能在公司或本地环境中使用。

可以在 Windows、Linux 或 macOS 上使用 .NET Core SDK 和运行时生成 .NET Core 项目。 生成在 自承载代理上运行。 请确保已在代理上安装必要的 .NET Core SDK 和运行时版本。

还原依赖项

NuGet 是依赖于未生成的代码的常用方法。 可以通过通过 .NET Core 任务或直接在管道中的脚本中运行dotnet restore命令来下载项目文件中指定的 NuGet 包和特定于项目的工具。

可以从 Azure Artifacts、NuGet.org 或其他一些外部或内部 NuGet 存储库下载 NuGet 包。 .NET Core 任务对于从经过身份验证的 NuGet 源还原包尤其有用。

此管道使用 .NET Core CLI 任务中的项目源dotnet restore

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  buildConfiguration: 'Release'

steps:
- task: DotNetCoreCLI@2
  inputs:
    command: 'restore'
    feedsToUse: 'select'
    vstsFeed: 'my-vsts-feed' # A series of numbers and letters

- task: DotNetCoreCLI@2
  inputs:
    command: 'build'
    arguments: '--configuration $(buildConfiguration)'
  displayName: 'dotnet build $(buildConfiguration)'

可以从 NuGet.org 下载 NuGet 包。

dotnet restore 内部使用与 .NET Core SDK 打包的版本 NuGet.exedotnet restore 只能还原 .NET Core 项目 .csproj 文件中指定的包。 如果解决方案中还有 Microsoft .NET Framework 项目或用于package.json指定依赖项,请使用 NuGet 任务还原这些依赖项。

在 .NET Core SDK 版本 2.0 及更新版本中,运行其他命令(例如 dotnet build)时,包会自动还原。

在 .NET Core SDK 版本 2.0 及更新版本中,运行其他命令(例如 dotnet build)时,包会自动还原。 但是,如果使用经过身份验证的源,可能需要使用 .NET Core 任务来还原包。

从 NuGet.org 还原包时,生成有时可能会失败。可以将 Azure Artifacts 与 上游源 配合使用,并缓存包。 当管道连接到 Azure Artifacts 时,管道的凭据会自动使用。 这些凭据通常派生自 Project Collection 生成服务 帐户。

如果要指定 NuGet 存储库,请将 URL NuGet.config 放入存储库中的文件中。 如果源经过身份验证,请在“项目设置”下的“服务”选项卡中创建 NuGet 服务连接来管理其凭据。

如果使用 Microsoft 托管代理,则每次运行生成时都会获得一台新计算机,这意味着每次还原包。 还原可能需要很长时间。 若要缓解此问题,可以使用 Azure Artifacts 或自承载代理,并受益于使用包缓存。

若要从外部自定义源还原包,请使用以下 .NET Core 任务:

# do this before your build tasks
steps:
- task: DotNetCoreCLI@2
  displayName: Restore
  inputs:
    command: restore
    projects: '**/*.csproj'
    feedsToUse: config
    nugetConfigPath: NuGet.config    # Relative to root of the repository
    externalFeedCredentials: <Name of the NuGet service connection>
# ...

有关 NuGet 服务连接的详细信息,请参阅 发布到 NuGet 源

  1. 在管道中选择 “任务 ”。 选择运行生成任务的作业。 然后,选择 + 向该作业添加新任务。

  2. 在任务目录中,查找并添加 .NET Core 任务。

  3. 选择任务,对于 “命令”,请选择 “还原”。

  4. 指定此任务所需的任何其他选项。 然后保存生成。

注意

请确保在 NuGet.config 文件中指定了自定义源,并在 NuGet 服务连接中指定了凭据。

生成项目

可以通过在管道中运行 dotnet build 命令或使用 .NET Core 任务生成 .NET Core 项目。

若要使用 .NET Core 任务生成项目,请将以下代码片段添加到 azure-pipelines.yml 文件中:

steps:
- task: DotNetCoreCLI@2
  displayName: Build
  inputs:
    command: build
    projects: '**/*.csproj'
    arguments: '--configuration $(buildConfiguration)' # Update this to match your need

可以在管道中运行任何自定义 dotnet 命令。 以下示例演示如何安装和使用 .NET 全局工具 dotnetsay

steps:
- task: DotNetCoreCLI@2
  displayName: 'Install dotnetsay'
  inputs:
    command: custom
    custom: tool
    arguments: 'install -g dotnetsay'

构建

  1. 在管道中选择 “任务 ”。 选择运行生成任务的作业。 +然后选择将新任务添加到该作业。

  2. 在任务目录中,查找并添加 .NET Core 任务。

  3. 选择任务,对于 “命令”,选择 “生成 ”或 “发布”。

  4. 指定此任务所需的任何其他选项,然后保存生成。

安装工具

若要在 Windows 上运行的版本中安装 .NET Core 全局工具(如 dotnetsay ),请执行以下步骤:

  1. 添加 .NET Core 任务并设置以下属性:

    • 命令:自定义。
      • 项目路径留空
    • 自定义命令:工具。
    • 参数install -g dotnetsay.
  2. 添加 命令行 任务并设置以下属性:

    • 脚本:dotnetsay.

运行测试

如果存储库中有测试项目,请使用 .NET Core 任务通过 MSTest、xUnit 和 NUnit 等测试框架运行单元测试。测试项目必须引用 Microsoft.NET.Test.SDK 版本 15.8.0 或更高版本。 测试结果会自动发布到服务。 这些结果在生成摘要中可供你使用,可用于对失败的测试和测试计时分析进行故障排除。

将以下代码片段添加到 azure-pipelines.yml 文件:

steps:
# ...
# do this after other tasks such as building
- task: DotNetCoreCLI@2
  inputs:
    command: test
    projects: '**/*Tests/*.csproj'
    arguments: '--configuration $(buildConfiguration)'

另一种方法是使用特定的记录器运行 dotnet test 命令,然后使用 “发布测试结果 ”任务:

steps:
# ...
# do this after your tests have run
- script: dotnet test <test-project> --logger trx
- task: PublishTestResults@2
  condition: succeededOrFailed()
  inputs:
    testRunner: VSTest
    testResultsFiles: '**/*.trx'

.NET Core 任务与 命令 集配合使用以 进行测试项目路径 应引用解决方案中的测试项目。

收集代码覆盖率

如果要在 Windows 平台上构建,可以使用内置覆盖率数据收集器来收集代码覆盖率指标。 测试项目必须引用 Microsoft.NET.Test.SDK 版本 15.8.0 或更高版本。 如果使用 .NET Core 任务来运行测试,则覆盖率数据会自动发布到服务器。 可以从生成摘要下载 .coverage 文件,以便在 Visual Studio 中查看。

将以下代码片段添加到 azure-pipelines.yml 文件:

steps:
# ...
# do this after other tasks such as building
- task: DotNetCoreCLI@2
  inputs:
    command: test
    projects: '**/*Tests/*.csproj'
    arguments: '--configuration $(buildConfiguration) --collect "Code coverage"'

如果选择运行 dotnet test 命令,请指定测试结果记录器和覆盖率选项。 然后使用 “发布测试结果 ”任务:

steps:
# ...
# do this after your tests have run
- script: dotnet test <test-project> --logger trx --collect "Code coverage"
- task: PublishTestResults@2
  inputs:
    testRunner: VSTest
    testResultsFiles: '**/*.trx'
  1. 将 .NET Core 任务添加到生成作业并设置以下属性:

    • 命令:测试。
    • 项目路径应引用解决方案中的测试项目
    • 参数--configuration $(BuildConfiguration) --collect "Code coverage".
  2. 确保“ 发布测试结果 ”选项保持选中状态。

使用 Coverlet 收集代码覆盖率指标

如果要在 Linux 或 macOS 上进行构建,可以使用 Coverlet 或类似工具来收集代码覆盖率指标。

可以使用 “发布代码覆盖率结果 ”任务将代码覆盖率结果发布到服务器。 覆盖率工具必须配置为以 Cobertura 或 JaCoCo 覆盖率格式生成结果。

若要使用 Coverlet 运行测试和发布代码覆盖率,请执行以下任务:

  • 在测试项目中添加对 coverlet.msbuild NuGet 包的引用, (.NET 5 以下 .NET 项目的) 。 对于 .NET 5,请添加对 NuGet 包的 coverlet.collector 引用。
  • 将以下代码片段添加到 azure-pipelines.yml 文件:
- task: UseDotNet@2
  inputs:
    version: '5.0.x'
    includePreviewVersions: true # Required for preview versions
  
- task: DotNetCoreCLI@2
  displayName: 'dotnet build'
  inputs:
    command: 'build'
    configuration: $(buildConfiguration)
  
- task: DotNetCoreCLI@2
  displayName: 'dotnet test'
  inputs:
    command: 'test'
    arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura'
    publishTestResults: true
    projects: 'MyTestLibrary' # update with your test project directory
  
- task: PublishCodeCoverageResults@1
  displayName: 'Publish code coverage report'
  inputs:
    codeCoverageTool: 'Cobertura'
    summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'

打包并交付代码

将生成输出上传到 Azure Pipelines。 可以创建和发布 NuGet 包,或将生成输出打包到要部署到 Web 应用程序的.zip文件中。

将项目发布到 Azure Pipelines

若要发布 .NET 生成的输出,请执行以下任务:

  • dotnet publish --output $(Build.ArtifactStagingDirectory)在 CLI 上运行,或使用发布命令添加DotNetCoreCLI@2任务。
  • 使用发布项目任务发布项目。

将以下代码片段添加到 azure-pipelines.yml 文件:

steps:

- task: DotNetCoreCLI@2
  inputs:
    command: publish
    publishWebProjects: True
    arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)'
    zipAfterPublish: True

# this code takes all the files in $(Build.ArtifactStagingDirectory) and uploads them as an artifact of your build.
- task: PublishPipelineArtifact@1
  inputs:
    targetPath: '$(Build.ArtifactStagingDirectory)' 
    artifactName: 'myWebsiteName'

注意

dotNetCoreCLI@2 任务具有 publishWebProjects 默认设置为 true 的输入。 默认情况下,此任务会发布存储库 中的所有 Web 项目。 可以在 GitHub 上的开放源代码任务中找到更多帮助和信息。

若要在发布之前将更多文件复制到生成目录,请使用 实用工具:复制文件

发布到 NuGet 源

若要创建和发布 NuGet 包,请添加以下代码片段:

steps:
# ...
# do this near the end of your pipeline in most cases
- script: dotnet pack /p:PackageVersion=$(version)  # define version variable elsewhere in your pipeline
- task: NuGetAuthenticate@0
  input:
    nuGetServiceConnections: '<Name of the NuGet service connection>'
- task: NuGetCommand@2
  inputs:
    command: push
    nuGetFeedType: external
    publishFeedCredentials: '<Name of the NuGet service connection>'
    versioningScheme: byEnvVar
    versionEnvVar: version

有关版本控制和发布 NuGet 包的详细信息,请参阅 发布到 NuGet 源

部署 Web 应用

若要创建可供发布到 Web 应用的.zip文件存档,请添加以下代码片段:

steps:
# ...
# do this after you've built your app, near the end of your pipeline in most cases
# for example, you do this before you deploy to an Azure web app on Windows
- task: DotNetCoreCLI@2
  inputs:
    command: publish
    publishWebProjects: True
    arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)'
    zipAfterPublish: True

若要将此存档发布到 Web 应用,请参阅 Azure Web 应用部署

将项目发布到 Azure Pipelines

使用 “发布项目” 任务将生成输出发布到 Azure Pipelines。

发布到 NuGet 源

如果要将代码发布到 NuGet 源,请执行以下步骤:

  1. 将 .NET Core 任务与 命令 集配合使用以打包。

  2. 将包发布到 NuGet 源

部署 Web 应用

  1. 命令 集使用 .NET Core 任务进行发布。

  2. 请确保已选择用于创建.zip文件存档的选项。

  3. 若要将此存档发布到 Web 应用,请参阅 Azure Web 应用部署

生成映像并推送到容器注册表

对于应用,还可以 生成映像 并将其 推送到容器注册表

疑难解答

如果可以在开发计算机上生成项目,但在 Azure Pipelines 上生成项目时遇到问题,请浏览以下潜在原因和纠正措施:

  • 我们不会在 Microsoft 托管的代理上安装 .NET Core SDK 的预发行版版本。 发布新版本的 .NET Core SDK 后,可能需要几周时间才能推出到所有 Azure Pipelines 数据中心。 无需等待此推出完成。 可以使用 .NET Core 工具安装程序 在 Microsoft 托管的代理上安装所需的 .NET Core SDK 版本。
  • 检查开发计算机上的 .NET Core SDK 版本和运行时,并确保它们与代理匹配。 可以在管道中包含命令行脚本 dotnet --version 来打印 .NET Core SDK 的版本。 使用 .NET Core 工具安装程序 在代理上部署同一版本,或将项目和开发计算机更新到较新版本的 .NET Core SDK。

  • 你可能在未在管道中编码的 Visual Studio IDE 中使用某些逻辑。 Azure Pipelines 在一个新进程中一个接一个地运行任务中指定的每个命令。 检查管道生成中的日志,以查看作为生成一部分运行的确切命令。 按照开发计算机上的相同顺序重复相同的命令,以找到问题。

  • 如果混合解决方案包含一些 .NET Core 项目和一些.NET Framework项目,则还应使用 NuGet 任务还原文件中指定的packages.config包。 添加 MSBuildVisual Studio 生成任务以生成.NET Framework项目。

  • 还原包时,生成可能会间歇性失败:NuGet.org 出现问题,或者 Azure 数据中心与 NuGet.org 之间存在网络问题。你可能想要了解将 Azure Artifacts 与 NuGet.org 配合使用作为上游源是否提高了生成的可靠性,因为它不在我们的控制中。

  • 有时,当我们推出新版本的 .NET Core SDK 或 Visual Studio 时,你的生成可能会中断。 例如,如果 NuGet 工具的较新版本或功能随 SDK 一起提供。 若要隔离此问题,请使用 .NET Core 工具安装程序 任务指定生成中使用的 .NET Core SDK 版本。

常见问题解答

问:在哪里可以了解有关 Azure Artifacts 和 TFS 包管理服务的详细信息?

答: Azure Artifacts 中的包管理

问:在哪里可以了解有关 .NET Core 命令的详细信息?

答: .NET Core CLI 工具

问:在何处可以了解有关在解决方案中运行测试的详细信息?

答: .NET Core 项目中的单元测试

问:我可以在哪里了解有关任务的详细信息?

答: 生成和发布任务