创建自包含部署时如何解决 Azure Devops Pipeline 中的目标问题

Posted

技术标签:

【中文标题】创建自包含部署时如何解决 Azure Devops Pipeline 中的目标问题【英文标题】:How to resolve target-issues in Azure Devops Pipeline when creating Self-contained deployments 【发布时间】:2021-05-19 02:59:25 【问题描述】:

由于 Azure AppServices 不再(不再)支持在 x64 上使用依赖于框架的部署的 .NET Core 2.1,我们目前正在发布我们的 .NET Core 2.1 Web API 的自包含 win-x64 版本。

我正在尝试在 Yaml 中为 CI/CD 设置 Azure 管道并将其部署到 Azure 应用服务部署槽。

我要解决的问题是以下错误消息:project.assets.json' doesn't have a target for 'netcoreapp2.1/win10-x64'

/usr/bin/dotnet publish /home/vsts/work/1/s/MyApp.WebApi/MyApp.WebApi.csproj --configuration Release -f netcoreapp2.1 -r win10-x64 --self-contained true --no-restore --output /home/vsts/work/1/a/MyApp.WebApi

Microsoft (R) Build Engine version 16.8.3+39993bd9d for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

/usr/share/dotnet/sdk/5.0.102/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(241,5): error NETSDK1047: Assets file '/home/vsts/work/1/s/MyApp.WebApi/obj/project.assets.json' doesn't have a target for 'netcoreapp2.1/win10-x64'. Ensure that restore has run and that you have included 'netcoreapp2.1' in the TargetFrameworks for your project. You may also need to include 'win10-x64' in your project's RuntimeIdentifiers. [/home/vsts/work/1/s/MyApp.WebApi/MyApp.WebApi.csproj]
##[error]Error: The process '/usr/bin/dotnet' failed with exit code 1

这是我的 yaml 文件:

# ASP.NET Core
# Build and test ASP.NET Core projects targeting .NET Core.
# Add steps that run tests, create a NuGet package, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core

trigger:
- develop

pool:
  vmImage: 'ubuntu-20.04'

variables:
  buildConfiguration: 'Release'
  buildPlatform: x64

steps:
- task: DotNetCoreCLI@2
  displayName: dotnet restore
  inputs:
    command: 'restore'
    projects: '**/*.csproj'
    feedsToUse: 'config'
    nugetConfigPath: './NuGet.config'
    externalFeedCredentials: 'Hangfire Pro'

- task: DotNetCoreCLI@2
  displayName: dotnet publish
  inputs:
    command: 'publish'
    publishWebProjects: true
    feedsToUse: 'config'
    nugetConfigPath: './NuGet.config'
    externalFeedCredentials: 'Hangfire Pro'
    arguments: '--configuration $(BuildConfiguration) -f netcoreapp2.1 -r win10-x64 --self-contained true --no-restore --output $(build.artifactstagingdirectory)'

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

我尝试通过添加以下内容来修改 CSPROJ 文件:

<PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    **<RuntimeIdentifiers>win10-x64;win-x64</RuntimeIdentifiers>**

and

<PlatformTarget>x64</PlatformTarget>

【问题讨论】:

顺便说一句。我尝试在 ubuntu-20.04/windows-2019 之间切换。没有结果。使用 Visual Studio 2019 在我的机器上部署时它可以工作。 是的,我们计划在未来几个月进入 LTS 3.1,因为 2.1 将于今年夏天 EOL :)。 【参考方案1】:

请从您的项目中删除 obj 和 bin 文件夹。 .csproj 文件中的 &lt;TargetFramework&gt; 也是单数。请尝试添加一个“s”并将其变为"TargetFrameworks",看看是否有效。

  <PropertyGroup>
    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  </PropertyGroup>

您可以参考此thread 以获得更多可能的解决方案。

顺便说一句,Microsoft-hosted Windows-2019 agents(安装 Visual Studio Enterprise 2019)和您的本地计算机之间存在不同的构建环境,您可以尝试使用 self-hosted Windows agents 来构建您的项目,而无需额外的环境准备步骤。

【讨论】:

谢谢!我尝试了您上面显示的步骤。可悲的是它没有做出任何改变。 git repo 中不存在 obj 和 bin 文件夹,因此对于此管道,它们尚不存在。 当你使用self-hosted Windows agents时是否存在这个问题,它将使用你本地的Visual Studio2019构建项目?【参考方案2】:

在我的工作中出现了一些问题。最重要的是,当管道在不同的分支上运行时,我尝试进行的所有更改都被推送到了开发分支。我对 Pipelines(以及 Git)的缺乏经验主要导致了这一点。我的印象是 YAML 中的 trigger 行指向要恢复和发布的存储库。

我终于通过以下步骤让它工作了。就像 Edward Han 提到的那样,我尝试在本地机器上通过命令行恢复和发布。这些也给了我一些我需要修复的错误。就像将此行添加到所有 (30+) 引用的 csproj 文件中:

<TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>

然后将这个配置添加到webproject csproj中:

<RuntimeIdentifiers>win-x64</RuntimeIdentifiers>

那么我最终的 YAML 文件是这样的:

trigger:
- develop

pool:
  vmImage: 'windows-2019'

variables:
  buildConfiguration: 'Release'
  buildPlatform: x64

steps:
- task: UseDotNet@2
  displayName: 'Use .Net Core sdk 2.1.x'
  inputs:
    version: 2.1.x

- task: DotNetCoreCLI@2
  displayName: dotnet restore
  inputs:
    command: 'restore'
    projects: '**/*.csproj'
    arguments: '-r win-x64'
    feedsToUse: 'config'
    nugetConfigPath: './NuGet.config'
    externalFeedCredentials: 'Hangfire Pro'

- task: DotNetCoreCLI@2
  displayName: dotnet test
  inputs:
   command: 'test'
   projects: '**/*[Tt]ests/*.csproj'
   arguments: '--configuration $(BuildConfiguration)'
   testRunTitle: 'dotnet test 2'

- task: DotNetCoreCLI@2
  displayName: dotnet publish
  inputs:
    command: 'publish'
    publishWebProjects: true
    arguments: '--configuration $(BuildConfiguration) -r win-x64 --self-contained true --no-restore --output $(build.artifactstagingdirectory)'

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

我更改/添加的一些重要内容:

明确告知使用 .NET Core 2.1.* 在 RESTORE 命令中添加 -runtime 参数

结论

虽然我学习了一些 Pluralsight 课程、YouTube 视频和博客,但我最终还是阅读了 Microsoft Docs/MSDN。习惯于使用 Visual Studio 用户界面发布,切换到命令行确实是一个很大的不同。需要查看更多的依赖项。提示:请认真阅读这些错误消息提供的网址,它们确实包含足够的信息来解决您的问题。至少,这是我学到的。

【讨论】:

以上是关于创建自包含部署时如何解决 Azure Devops Pipeline 中的目标问题的主要内容,如果未能解决你的问题,请参考以下文章

azure devops 中的部署前批准

Azure Devops:管道生成新工件时继续部署不会触发

Azure DevOps 在发布期间获取部署代理状态

如何利用Azure DevOps快速实现自动化构建测试打包及部署

在 Azure DevOps 管道中为 WebApp 创建部署槽

如何设置子模块 Azure DevOps