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

Azure Pipelines | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018 | TFS 2017

使用管道自动生成和测试 .NET Core 项目。 了解如何:

备注

有关创建.NET Framework的帮助,请参阅使用ASP.NET 生成.NET Framework。

备注

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

备注

本指南适用于 TFS 版本 2017.3 及更高版本。

创建第一个管道

你是新Azure Pipelines? 如果是这样,建议在继续阅读其他部分之前尝试本部分。

获取代码

为此存储库分叉GitHub:

在 2019 年 1 月,Azure DevOps Server Git 存储库:

在 TFS 中将此存储库导入 Git 存储库:

https://github.com/MicrosoftDocs/pipelines-dotnet-core

登录到 Azure Pipelines

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

在选定的组织中,创建一个 项目。 如果组织中没有任何项目,则会看到 " 创建用于入门的项目 " 屏幕。 否则,请选择仪表板右上角的 "创建 Project " 按钮。

创建管道

  1. 登录到 Azure DevOps 组织,并导航到你的项目。

  2. 转到 "Pipelines", 然后选择"新建 管道"。

  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. 准备好更改管道后,请在"编辑"页中选择 Pipelines,然后选择"编辑 azure-pipelines.yml 文件"。

  4. 请参阅以下部分,了解自定义管道的一些更常用方法。

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. 准备好对管道进行更改时,请 对其进行 编辑。

  5. 请参阅以下部分,了解自定义管道的一些更常用方法。

经典

  1. 如果 (创建管道,请参阅创建第一个 管道) 。 为 模板选择" 空管道"。

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

  3. 保存管道并排入生成队列。 当" 生成#nnnnnnnn.n 已排队"消息出现时,选择数字链接以查看管道的运行状态。

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

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

  5. 请参阅以下部分,了解自定义管道的一些更常用方法。

生成环境

使用 Azure Pipelines 在 Windows、Linux 或 macOS 上生成 .NET Core 项目,而无需设置自己的任何基础结构。 Microsoft托管的代理Azure Pipelines预安装的几个 .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 文件。

若要安装用于构建的 5.0.x SDK 预览版和用于运行面向 .NET Core 3.0.x 的测试的 3.0.x,请添加以下代码片段:

steps:
- task: UseDotNet@2
  inputs:
    version: '5.0.x'
    includePreviewVersions: true # Required for preview versions

- task: UseDotNet@2
  inputs:
    version: '3.0.x'
    packageType: runtime

Windows代理已包含 .NET Core 运行时。 若要安装较新的 SDK,请 performMultiLevelLookup 在此 true 代码片段中将 设置为 :

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

提示

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

可以在 linux 或 macOS 上使用 .NET Core SDK 和运行时Windows .NET Core 项目。 生成在自 承载代理 中运行。 请确保在代理上安装所需的 .NET Core SDK和运行时版本。

还原依赖项

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

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

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

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 在内部使用随应用程序 NuGet.exe 一起打包的 .NET Core SDK。 dotnet restore 只能还原 .NET Core 项目文件中指定的 .csproj 包。 如果解决方案中还具有 Microsoft .NET Framework项目或使用 指定依赖项,则还必须使用 NuGet package.json 任务还原这些依赖项。

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

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

如果在从 NuGet.org 还原包时,由于连接问题,生成偶尔会失败,Azure Artifacts上游源缓存包。 连接到管道时,会自动使用管道的Azure Artifacts。 这些凭据通常派生自 Project 生成服务 帐户。

如果要指定一个NuGet,请将 URL 放在 NuGet.config 存储库中的文件中。 如果源已经过身份验证,请管理其凭据,NuGet下"服务 " 选项卡 Project 设置。

如果使用 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)来运行单元测试。 对于此功能,测试项目 必须引用 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 平台上构建,则可以使用内置覆盖率数据收集器收集代码覆盖率指标。 对于此功能,测试项目 必须引用 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 任务添加到生成作业,并设置以下属性:

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

通过 Coverlet 收集代码覆盖率指标

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

可以使用 " 发布代码覆盖率结果 " 任务将代码覆盖率结果发布到服务器。 若要使用此功能,必须将覆盖区工具配置为以 Cobertura 或 JaCoCo 覆盖率格式生成结果。

若要运行测试并发布代码覆盖率和 Coverlet:

  • 将引用添加到 coverlet.msbuild 测试项目中的 NuGet 包 (s) .net 5 下的 .net 项目。 对于 .net 5,请添加对 coverlet.collector NuGet 包的引用。
  • 将此代码片段添加到 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 或 TFS,创建并发布 NuGet 包,或将生成输出打包到要部署到 web 应用程序的 .zip 文件中。

将项目发布到 Azure Pipelines

若要发布 .NET build 的输出,

  • 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

使用 "发布 Artifacts " 任务可将生成的输出发布到 Azure Pipelines 或 TFS。

发布到 NuGet 源

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

  1. 结合使用 .NET Core 任务和 命令 集进行打包。

  2. 包发布到 NuGet 源

部署 Web 应用

  1. 使用带有 命令 集的 .net Core 任务进行发布。

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

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

构建映像并推送到容器注册表

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

疑难解答

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

  • 我们不会在 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 或 TFS 将在任务中指定的每个命令执行一次。 查看 Azure Pipelines 或 TFS build 中的日志,以查看作为生成的一部分运行的确切命令。 在开发计算机上重复相同的命令以找到问题。

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

  • 如果你的生成在还原包时间歇性地失败,请 NuGet。 org 遇到问题,或者 Azure 数据中心与 NuGet 组织之间存在网络问题。这些不在我们的控制下,你可能需要探索是否将 Azure Artifacts 与 NuGet 作为上游源结合使用可以提高生成的可靠性。

  • 有时,当我们使用 .NET Core SDK 或 Visual Studio 的新版本来推出对托管映像的更新时,可能会导致生成中断。 例如,如果 SDK 附带了 NuGet工具的较新版本或功能,则可能会发生这种情况。 若要隔离这些问题,请使用 .NET Core 工具 安装程序任务指定生成.NET Core SDK版本。

常见问题解答

在哪里可以了解有关服务Azure Artifacts TFS 包管理服务?

包管理和 TFS Azure Artifacts

在哪里可以了解有关 .NET Core 命令的更多信息?

.NET Core CLI 工具

在哪里可以了解有关在解决方案中运行测试的更多信息?

.NET Core 项目中的单元测试

在哪里可以详细了解任务?

生成和发布应用