差异包装
Differential packaging
当升级一个应用程序时,Test-ServiceFabricApplicationPackage
命令会为每个版本号没有改变的代码包抛出错误(它说内容已经改变,即使代码没有)。我知道有一个允许创建部分包的功能,但我无法使用它。我的问题是:
- 代码包的内容是如何检查变化的?二进制比较?
- 如何构建部分包(VS构建包后删除代码目录?编辑
ServiceManifest.xml
文件?)
- 如何运行
Test-ServiceFabricApplicationPackage
(什么是图像存储URL?如何将该参数传递给标准部署脚本?)
我会很感激一个完整的例子。
Service Fabric 支持差异包,但使用差异包进行升级尚未与 Visual Studio 完全集成。但你可以手动完成。
- 是的,这是二进制比较。
- 因此,在差异包中,您只为已更改的包(代码、配置和数据)增加版本。如果二进制文件已针对版本未更改的包进行了更改(这可能只是来自重新编译),那么您可以简单地从最终应用程序包中省略其文件。
- 图像存储可以是外部位置(如 Azure blob 存储),但最简单的选项是 built-in 图像存储服务,默认情况下在 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
而您只想升级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
您更新了应用程序和服务清单中的版本,但您只在最终应用程序包中包含了已更改的包。您的应用程序包将如下所示:
app1/
service1/
code/
不包含版本号没有变化的包。请注意,您 可以 包含这些包,但前提是它们与当前为集群中的应用程序注册的相同版本的包相同(二进制差异),在这种情况下,它们只会被忽略。
一种快速简便的生成其中之一的方法是在 Visual Studio 中使用 Package 命令(right-click 应用程序和 select 包裹)。然后转到输出目录,只需删除版本未更改的包的目录即可。
如果你想进行部分升级,我是这样做的:
给定
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
并且您只想将服务 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
在您的 Service1 中,更新 ServiceManifest.xml 以获得正确的版本号(服务本身和您要升级的不同包)。
然后,在您的 service2 文件夹中,删除除 ServiceManifest.xml 之外的所有内容。
在您的 ApplicationManifest.xml 中,您应该将 Service2 的 ServiceManifestImport 保持在版本 1.0.0。同时更新 Service1 的 ServiceManifestImport 的版本号。
完成后,您应该可以执行以下操作:
Test-ServiceFabricApplicationPackage $packagePath -ImageStoreConnectionString $ImageStoreConnectionString
验证包是否有效。这是做什么的(据我所知)是它使用本地包和当前部署的包,然后这两个组合应该等于一个有效的完整包。
所以,基本上,唯一改变的是:
- 您删除了包裹中不需要的东西(但保留了
ServiceManifest.xml)
- 您在已更改的服务中更新版本号
- 您在应用程序清单中为应用程序和更改的服务更新版本号。
关于获取图像存储以用于 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
当升级一个应用程序时,Test-ServiceFabricApplicationPackage
命令会为每个版本号没有改变的代码包抛出错误(它说内容已经改变,即使代码没有)。我知道有一个允许创建部分包的功能,但我无法使用它。我的问题是:
- 代码包的内容是如何检查变化的?二进制比较?
- 如何构建部分包(VS构建包后删除代码目录?编辑
ServiceManifest.xml
文件?) - 如何运行
Test-ServiceFabricApplicationPackage
(什么是图像存储URL?如何将该参数传递给标准部署脚本?)
我会很感激一个完整的例子。
Service Fabric 支持差异包,但使用差异包进行升级尚未与 Visual Studio 完全集成。但你可以手动完成。
- 是的,这是二进制比较。
- 因此,在差异包中,您只为已更改的包(代码、配置和数据)增加版本。如果二进制文件已针对版本未更改的包进行了更改(这可能只是来自重新编译),那么您可以简单地从最终应用程序包中省略其文件。
- 图像存储可以是外部位置(如 Azure blob 存储),但最简单的选项是 built-in 图像存储服务,默认情况下在 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
而您只想升级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
您更新了应用程序和服务清单中的版本,但您只在最终应用程序包中包含了已更改的包。您的应用程序包将如下所示:
app1/
service1/
code/
不包含版本号没有变化的包。请注意,您 可以 包含这些包,但前提是它们与当前为集群中的应用程序注册的相同版本的包相同(二进制差异),在这种情况下,它们只会被忽略。
一种快速简便的生成其中之一的方法是在 Visual Studio 中使用 Package 命令(right-click 应用程序和 select 包裹)。然后转到输出目录,只需删除版本未更改的包的目录即可。
如果你想进行部分升级,我是这样做的:
给定
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
并且您只想将服务 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
在您的 Service1 中,更新 ServiceManifest.xml 以获得正确的版本号(服务本身和您要升级的不同包)。 然后,在您的 service2 文件夹中,删除除 ServiceManifest.xml 之外的所有内容。
在您的 ApplicationManifest.xml 中,您应该将 Service2 的 ServiceManifestImport 保持在版本 1.0.0。同时更新 Service1 的 ServiceManifestImport 的版本号。
完成后,您应该可以执行以下操作:
Test-ServiceFabricApplicationPackage $packagePath -ImageStoreConnectionString $ImageStoreConnectionString
验证包是否有效。这是做什么的(据我所知)是它使用本地包和当前部署的包,然后这两个组合应该等于一个有效的完整包。
所以,基本上,唯一改变的是:
- 您删除了包裹中不需要的东西(但保留了 ServiceManifest.xml)
- 您在已更改的服务中更新版本号
- 您在应用程序清单中为应用程序和更改的服务更新版本号。
关于获取图像存储以用于 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