从 .NET 7 升级到 .NET 8 后,Azure Functions 不再在构建服务器上编译

问题描述 投票:0回答:1

我有许多 Azure Functions 设置,它们通过

vmImage: 'windows-latest'
构建服务器上的 Azure Pipelines 进行构建。它们最初是使用 .NET 7 设置的,并且运行良好一年左右。

我最近将项目升级到.NET 8(刚刚更新了版本),它们将不再在构建服务器上编译。它们在本地编译并运行得很好。

构建过程如下:

  • 使用.NET 8.0.x
  • 安装 nuget > 6.0.0
  • Nuget 缓存(如果包已存在则跳过恢复)
  • 点网恢复
  • dotnet 构建

dotnet build
步骤是现在失败的步骤。它似乎试图从 azure pipeline 工件而不是上游源下载依赖包(这些包没有直接安装到我的项目中)。

无法从“https://pkgs.dev.azure.com/MYPROJECT/someguid/_packaging/anotherguid/nuget/v3/flat2/microsoft.netcore.targets/”下载包“Microsoft.NETCore.Targets.3.0.0” 3.0.0/microsoft.netcore.targets.3.0.0.nupkg'。
响应状态码并不表示成功:401(未经授权)。

这样的页面有几十个,每个页面都有几十个包依赖项。

什么不起作用:

  • 据我所知,401 确实应该是 404(它不存在)。据我所知,权限配置是正确的,这些项目作为 .NET 7 目标运行良好,没有身份验证问题
  • 我已经检查了有关工件配置的所有内容,并且可以从 nuget.org 检查上游源。许多其他包已经渗透到本地工件中 - 而且,当目标是 .NET 7 时它可以工作
  • 我尝试过手动将“丢失”的依赖项直接导入到项目中。这似乎没有任何区别,你仍然会遇到相同的错误
  • 将 nuget 升级到 6.11 - 没有区别

有什么作用:

  • 回滚到.NET 7.0。我可以通过改变目标来自由地“前进”到失败的构建,并“后退”到成功的构建

具体有哪些变化?

  • .csproj
    net8.0
     更新为 
    net7.0

  • 更新以下 nuget 包(不更新它们会出现奇怪的

    Invalid combination of TargetFramework and AzureFunctionsVersion is set
    错误)

    Microsoft.Extensions.DependencyInjection -> 8.0.1
    Microsoft.Azure.Functions.Worker.Extensions.Abstractions -> 1.3.0
    Microsoft.Azure.Functions.Worker -> 2.0.0
    Microsoft.Azure.Functions.Worker.Extensions.Storage -> 6.6.0
    Microsoft.Azure.Functions.Worker.Sdk -> 2.0.0
    

当发生此类事情时,管道总是看起来像一个猜谜游戏,所以希望其他人也遇到过这种情况,或者有一个很好的猜测,我可以尝试一下。这些功能在 .NET 7 上仍然可以正常构建,但我真的很想将它们更新到 .NET 8。

我猜测这可能与功能工作程序包更新有关,但我似乎无法将两者分开。

azure-devops azure-functions azure-pipelines .net-8.0 azure-functions-isolated
1个回答
0
投票

从您对问题的描述来看,401错误存在于dotnet构建步骤中。

请参阅此文档:为什么我的构建、发布或测试步骤无法恢复包?

大多数 dotnet 命令(包括构建、发布和测试)都包含隐式恢复步骤。即使您在前面的步骤中成功运行了 dotnet 恢复,这也会对经过身份验证的提要失败,因为前面的步骤将清除它使用的凭据。

401错误的原因是dotnet恢复步骤将清除它使用的凭据。那么在 dotnet 构建步骤中无法读取有效凭据。

要解决此问题,您可以在用于 NuGet 身份验证的 dotnet 恢复任务之前添加 NuGet Authenticate 任务

这是管道示例:

steps:
- task: UseDotNet@2
  inputs:
    packageType: 'sdk'
    version: '8.0.x'
- task: NuGetToolInstaller@1
  inputs:
    versionSpec: '6.0.x'
- task: NuGetAuthenticate@1
  displayName: 'NuGet Authenticate'

- task: DotNetCoreCLI@2
  inputs:
    command: 'restore'

- task: DotNetCoreCLI@2
  inputs:
    command: 'build'

NuGet Authenticate 任务生成的 NuGet 凭据将在整个代理作业中有效。它可以解决dotnet构建任务中的401身份验证错误。

© www.soinside.com 2019 - 2024. All rights reserved.