差别包装

Eli*_*bel 11 azure-service-fabric

升级应用程序时,该Test-ServiceFabricApplicationPackage命令会为版本号未更改的每个代码包抛出错误(它表示内容已更改,即使代码尚未更改).我知道有一个功能允许创建部分包,但我无法使用它.我的问题是:

  1. 如何检查代码包的内容是否有变化?二元比较?
  2. 如何构建部分包(在VS构建包后删除代码目录?编辑ServiceManifest.xml文件?)
  3. 如何运行Test-ServiceFabricApplicationPackage(图像存储URL是什么?如何将该参数传递给标准部署脚本?)

我很欣赏一个彻底的例子.

and*_*rso 12

如果你想进行部分升级,我就是这样做的:

特定

app1 1.0.0
  service1 1.0.0
    code 1.0.0
    config 1.0.0
  service2 1.0.0
    code 1.0.0
    config 1.0.0
Run Code Online (Sandbox Code Playgroud)

并且您希望仅将Service 1更新为1.0.1版,如下所示:

app1 1.0.1
  service1 1.0.1
    code 1.0.1
    config 1.0.1
  service2 1.0.0
    code 1.0.0
    config 1.0.0
Run Code Online (Sandbox Code Playgroud)

在Service1中,更新ServiceManifest.xml以获得正确的版本号(服务本身和要升级的不同软件包).然后,在service2文件夹中,删除除ServiceManifest.xml之外的所有内容.

在ApplicationManifest.xml中,应将ServiceManifestImport for Service2保留为1.0.0版.还要为Service1更新ServiceManifestImport的版本号.

完成后,你应该能够做到:

Test-ServiceFabricApplicationPackage $packagePath -ImageStoreConnectionString $ImageStoreConnectionString
Run Code Online (Sandbox Code Playgroud)

验证包是否有效.这样做(据我所知)是它使用本地包以及当前部署的包,然后这两个组合应该等于一个有效的完整包.

所以,基本上,唯一改变的是:

  • 您删除了包中不需要的东西(但保留了ServiceManifest.xml)
  • 您更新已更改的服务中的版本号
  • 您可以更新应用程序清单中的应用程序和更改的服务的版本号.

另请参阅此文档:https://azure.microsoft.com/en-us/documentation/articles/service-fabric-application-upgrade-advanced/#upgrade-with-a-diff-package

关于将图像存储用于Test-ServiceFabricApplicationPackage调用(您可以通过查看默认部署脚本找到所有内容,但这是您需要的):

Open powershell
Connect to your cluster (Connect-ServiceFabricCluster ...)
Execute the following commands:

$ClusterManifestRaw = Get-ServiceFabricClusterManifest
$ClusterManifestXml = [xml]$ClusterManifestRaw
$ManagementSection = $ClusterManifestXml.ClusterManifest.FabricSettings.Section | ? { $_.Name -eq "Management" }
$ImageStoreConnectionString = $ManagementSection .ChildNodes | ? { $_.Name -eq "ImageStoreConnectionString" } | Select-Object -Expand Value
Run Code Online (Sandbox Code Playgroud)


Vac*_*cek 6

Service Fabric支持差异包,但使用差异包的升级尚未与Visual Studio完全集成.但你可以手动完成.

  1. 是的,这是二进制比较.
  2. 因此,在差异包中,只为已更改的包(代码,配置和数据)增加版本.如果二进制文件已更改为版本未更改的包(可能只是重新编译),那么您可以简单地从最终的应用程序包中省略其文件.
  3. 图像存储可以是外部位置(如Azure blob存储),但最简单的选项是内置图像存储服务,默认情况下在SDK和Azure中使用.要使用它,只需使用"fabric:ImageStore"作为图像存储字符串:Test-ServiceFabricApplicationPackage -ApplicationPackagePath/path/to/package -ImageStoreConnectionString fabric:ImageStore

这是diff包的一个例子.想象一下,你有以下几点:

app1 1.0.0
  service1 1.0.0
    code 1.0.0
    config 1.0.0
  service2 1.0.0
    code 1.0.0
    config 1.0.0
Run Code Online (Sandbox Code Playgroud)

并且您只想升级service1的代码包:

app1 2.0.0            <-- new version
  service1 2.0.0      <-- new version
    code 2.0.0        <-- new version
    config 1.0.0
  service2 1.0.0
    code 1.0.0
    config 1.0.0
Run Code Online (Sandbox Code Playgroud)

您更新应用程序和服务清单中的版本,但只包括最终应用程序包中已更改的软件包.您的应用程序包将如下所示:

app1/
  service1/
    code/
Run Code Online (Sandbox Code Playgroud)

不包括版本号未更改的软件包.请注意,您可以包含这些包,但前提是它们与当前为群集中的应用程序注册的相同版本的包相同(二进制差异),在这种情况下,它们将被忽略.

生成其中一个的快速简便方法是在Visual Studio中使用Package命令(右键单击该应用程序并选择Package).然后转到输出目录,只删除版本未更改的包的目录.