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 构建管道在创建包时失败的主要内容,如果未能解决你的问题,请参考以下文章
如何在基于 Service Fabric ASP.NET 5 的服务中扩展从 StatelessService 派生的类?
未为部署在 Service Fabric Linux 集群上的 .Net 核心应用生成应用洞察
无法选择 .NET Core 作为 Service Fabric 应用程序的框架