Дифференциальная упаковка

При обновлении приложения команда 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 (щелкните правой кнопкой мыши приложение и выберите "Пакет" ). Затем перейдите в выходной каталог и просто удалите каталоги для пакетов, версии которых не изменились.