Service Fabric Guest .Net Core 3.1 API exe 的 Azure DevOps 构建管道在创建包时失败

Posted

技术标签:

【中文标题】Service Fabric Guest .Net Core 3.1 API exe 的 Azure DevOps 构建管道在创建包时失败【英文标题】:Azure DevOps build pipeline for Service Fabric Guest .Net Core 3.1 API exe fails on creating package 【发布时间】:2020-12-21 00:24:30 【问题描述】:

我有一个 .NET Core 3.1 API,我正在尝试使用 Azure DevOps 构建管道将其部署为 Service Fabric 中的来宾可执行文件。所有项目/配置的平台都是 x64。

我已经在本地测试了 API,并且还在本地测试了在服务结构中作为来宾可执行文件运行的 API。我能够构建/重建 API,并且能够打包服务结构应用程序。

在我的构建管道中,我有如下图所示的以下步骤。

下图定义了 Create Service Fabric 包

构建管道运行时,总是失败并出现错误:

##[error]AppraisalStatusUpdatesContainer\AppraisalStatusUpdatesContainer.sfproj(0,0):错误 MSB4057:项目中不存在目标“包”。

我找不到任何有关如何解决此问题的文档,我花了几天时间尝试。有谁知道如何让它工作?

编辑 1

下面提供了sfproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.10\build\Microsoft.VisualStudio.Azure.Fabric.Application.props" Condition="Exists('..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.10\build\Microsoft.VisualStudio.Azure.Fabric.Application.props')" />
  <PropertyGroup Label="Globals">
    <ProjectGuid>ffefa7ed-cf72-4780-9910-816deed2ed4f</ProjectGuid>
    <ProjectVersion>2.5</ProjectVersion>
    <MinToolsVersion>1.5</MinToolsVersion>
    <SupportedMSBuildNuGetPackageVersion>1.6.10</SupportedMSBuildNuGetPackageVersion>
    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
  </PropertyGroup>
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <ItemGroup>
    <None Include="ApplicationPackageRoot\ApplicationManifest.xml" />
    <None Include="ApplicationParameters\Prod.xml" />
    <None Include="ApplicationParameters\QA.xml" />
    <None Include="ApplicationParameters\UAT.xml" />
    <None Include="ApplicationParameters\Local.1Node.xml" />
    <None Include="ApplicationParameters\Local.5Node.xml" />
    <None Include="PublishProfiles\QA.xml" />
    <None Include="PublishProfiles\UAT.xml" />
    <None Include="PublishProfiles\Prod.xml" />
    <None Include="PublishProfiles\Local.1Node.xml" />
    <None Include="PublishProfiles\Local.5Node.xml" />
    <None Include="Scripts\Deploy-FabricApplication.ps1" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="..\AppraisalStatusUpdates\bin\Release\netcoreapp3.1\publish\**\*.*">
      <Link>ApplicationPackageRoot\AppraisalStatusUpdatesContainerPkg\Code\%(RecursiveDir)%(Filename)%(Extension)</Link>
    </Content>
    <Content Include="ApplicationPackageRoot\AppraisalStatusUpdatesContainerPkg\Config\Settings.xml" />
    <Content Include="ApplicationPackageRoot\AppraisalStatusUpdatesContainerPkg\ServiceManifest.xml" />
    <Content Include="packages.config" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.Common.targets" />
  <PropertyGroup>
    <ApplicationProjectTargetsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Service Fabric Tools\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets</ApplicationProjectTargetsPath>
  </PropertyGroup>
  <Import Project="$(ApplicationProjectTargetsPath)" Condition="Exists('$(ApplicationProjectTargetsPath)')" />
  <Import Project="..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.10\build\Microsoft.VisualStudio.Azure.Fabric.Application.targets" Condition="Exists('..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.10\build\Microsoft.VisualStudio.Azure.Fabric.Application.targets')" />
  <Target Name="ValidateMSBuildFiles" BeforeTargets="PrepareForBuild">
    <Error Condition="!Exists('..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.10\build\Microsoft.VisualStudio.Azure.Fabric.Application.props')" Text="Unable to find the '..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.10\build\Microsoft.VisualStudio.Azure.Fabric.Application.props' file. Please restore the 'Microsoft.VisualStudio.Azure.Fabric.MSBuild' Nuget package." />
    <Error Condition="!Exists('..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.10\build\Microsoft.VisualStudio.Azure.Fabric.Application.targets')" Text="Unable to find the '..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.10\build\Microsoft.VisualStudio.Azure.Fabric.Application.targets' file. Please restore the 'Microsoft.VisualStudio.Azure.Fabric.MSBuild' Nuget package." />
  </Target>
</Project>

编辑 2 @LeoLiu-MSFT,我尝试了您提到的方法。我没有收到原始错误,但现在正在尝试解决导致的后续问题。另外,在此步骤之前,我正在执行 dotnet publish 和 dotnet test 任务。除了运行测试需要它之外,似乎不需要发布步骤。

我的 msbuild 步骤现在如下

这会导致以下异常:

##[错误]C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(777,5):错误:OutputPath未为项目“AppraisalStatusUpdatesContainer.sfproj”设置属性。请检查以确保您为此项目指定了有效的配置和平台组合。配置='发布'平台='x64'。您可能会看到此消息,因为您正在尝试构建一个没有解决方案文件的项目,并且指定了该项目不存在的非默认配置或平台。

【问题讨论】:

您可以添加您的sfproj 文件以查看您在那里定义的目标docs.microsoft.com/en-us/visualstudio/msbuild/… 吗? @KrzysztofMadej 感谢您的回复 - 我已将 sfproj 文件添加为帖子的编辑。 这个问题怎么样?下面的答案是否解决了您的问题,如果没有,请告诉我有关此问题的最新信息吗? @LeoLiu-MSFT 我已经花了至少 8 个小时试图为 OutputPath 问题提出的问题找到解决方案,但没有任何效果。虽然这个项目不是我的主要任务,但在我的组织中推动将 MuleSoft 用于 API,并且通过 Azure DevOps 部署到 ServiceFabric 的困难使它看起来像是一个更好的选择 【参考方案1】:

为此,我的服务结构存储库中有一个自定义 Powershell 脚本。 它为 .sfproj 执行单独的 nuget 恢复。

脚本restore-sf.ps1:

Push-Location $PSScriptRoot
$ProjectFolder = "..\src\YourProjectFolder"

$PackageFolder = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot "..\Packages"))

Push-Location $ProjectFolder

nuget restore YourServiceFabricProject.sfproj -PackagesDirectory $PackageFolder -MSBuildVersion 15

Pop-Location
Pop-Location

我的文件夹结构:

├───Root
    ├───packages
    ├───src
        ├───YourProjectFolder
            ├───YourServiceFabricProject.sfproj  
    ├───scripts
        ├───restore-sf.ps1

根据您的文件夹结构,您需要更改脚本中的路径。

在管道中,第一步是调用脚本,以恢复 Microsoft.VisualStudio.Azure.Fabric.MSBuild 包。

脚本假定nuget 在路径中可用。

【讨论】:

【参考方案2】:

Service Fabric Guest .Net Core 3.1 API exe 的 Azure DevOps 构建管道在创建包时失败

根据错误:

MSB4057:项目中不存在目标“包”。

当您将 MSBuild 用于具有目标包的项目 (.sln) 解决方案时,但并非所有项目都定义了包任务。这可能是您收到此错误的原因之一。

要解决这个问题,我们可以在.sfproj 文件中添加以下自定义目标:

  <Target Name="ForcePackageTarget" AfterTargets="Build" Condition="'$(ForcePackageTarget)' =='true'">
    <CallTarget Targets="Package"/>
  </Target>

然后将 /p:ForcePackageTarget=true 作为参数添加到 msbuild 构建任务。

请查看this thread 和this post 了解更多详情。

【讨论】:

以上是关于Service Fabric Guest .Net Core 3.1 API exe 的 Azure DevOps 构建管道在创建包时失败的主要内容,如果未能解决你的问题,请参考以下文章

从 .net 核心调用 Service Fabric

如何在基于 Service Fabric ASP.NET 5 的服务中扩展从 StatelessService 派生的类?

未为部署在 Service Fabric Linux 集群上的 .Net 核心应用生成应用洞察

无法选择 .NET Core 作为 Service Fabric 应用程序的框架

用于 asp.net 核心的 Service Fabric 中 docker 中的 HTTPS 不起作用

ASP.NET Core 404 响应中的 Service Fabric 反向代理集成