Дифференциальная упаковка
При обновлении приложения команда Test-ServiceFabricApplicationPackage
выдает ошибки для каждого пакета кода, номер версии которого не изменился (он сказал, что содержимое изменилось, хотя код не имеет). Я знаю, что есть функция, которая позволяет создавать частичные пакеты, но я не мог ее использовать. Мои вопросы:
- Как содержимое пакета кода проверяется на изменения? Бинарное сравнение?
- Как построить частичный пакет (просто удалите каталоги Code после сборки VS пакета? Отредактируйте файл
ServiceManifest.xml
?)
- Как запустить
Test-ServiceFabricApplicationPackage
(Что такое URL-адрес хранилища изображений? Как передать этот параметр стандартным развертываниям script?)
Буду признателен за подробный пример.
Ответы
Ответ 1
Если вы хотите сделать частичную модернизацию, вот как я это сделал:
Учитывая
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
И вы хотите обновить только 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
В вашем Service1 обновите ServiceManifest.xml, чтобы иметь правильные номера версий (сама служба и различные пакеты, которые вы хотите обновить).
Затем в вашей папке service2 удалите все, кроме ServiceManifest.xml.
В вашем ApplicationManifest.xml вы должны сохранить ServiceManifestImport для Service2 в версии 1.0.0. Также обновите номер версии для ServiceManifestImport для Service1.
После этого вы сможете выполнить:
Test-ServiceFabricApplicationPackage $packagePath -ImageStoreConnectionString $ImageStoreConnectionString
чтобы проверить, работает ли пакет. Что это делает (насколько я понимаю), он использует локальный пакет вместе с развёрнутым в настоящий момент пакетом, а эти два вместе должны равняться действительному полному пакету.
Итак, в основном, единственное, что меняется:
- Вы удаляете вещи, которые не хотите в своем пакете (но вы сохраняете
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
Ответ 2
Сервисная Fabric поддерживает дифференциальные пакеты, но обновления с дифференциальными пакетами еще не полностью интегрированы с Visual Studio. Но вы можете сделать это вручную.
- Да, это двоичное сравнение.
- Итак, в дифференциальном пакете вы увеличиваете версии только для измененных пакетов (кода, конфигурации и данных). Если двоичные файлы были изменены для пакета, версия которого не изменилась - это может быть просто перекомпиляция, то вы можете просто опустить свои файлы из окончательного пакета приложений.
- Хранилище изображений может быть внешним расположением (например, хранилище Azure blob), но самым простым вариантом является встроенная служба хранения изображений, которая по умолчанию используется в SDK и Azure. Чтобы использовать это, просто используйте "fabric: ImageStore" для строки хранилища изображений: Test-ServiceFabricApplicationPackage -ApplicationPackagePath/path/to/package -ImageStoreConnectionString: 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/
Пакеты, номера версий которых не изменены, не включены. Обратите внимание, что вы можете включать эти пакеты, но только если они идентичны (двоичный diff) для пакетов той же версии, которые в настоящее время зарегистрированы для приложения в кластере, и в этом случае они просто будут проигнорированы.
Быстрый и простой способ создания одного из них - использовать команду Пакет в Visual Studio (щелкните правой кнопкой мыши приложение и выберите "Пакет" ). Затем перейдите в выходной каталог и просто удалите каталоги для пакетов, версии которых не изменились.