removed update
This commit is contained in:
+20
-55
@@ -167,27 +167,8 @@ MSIX всегда выполняются в контексте вошедшег
|
||||
|
||||
## Обновления
|
||||
|
||||
Проверка выполняется при открытии окна настроек, а не при включении машины:
|
||||
фоновая половина в сеть больше не ходит вовсе, да и показать ответ ей нечем.
|
||||
Настройка в окне так и написана.
|
||||
|
||||
Приложение ищет новые версии среди выпусков собственного репозитория. Выпуск
|
||||
годится, если его тег — это просто версия (`v1.2.3` или `1.2.3`) и к нему
|
||||
приложен пакет MSIX. Тег, в котором есть что-то ещё, — в том числе `v1.2.3-beta`
|
||||
— пропускается: предварительную версию берут намеренно, приложение её не
|
||||
предлагает.
|
||||
|
||||
Из приложенных файлов предпочитается `.msixbundle` — он несёт обе архитектуры.
|
||||
Если его нет, берётся пакет, в имени которого стоит архитектура этой машины:
|
||||
`CursorLang-1.2.3.0-x64.msix`. Такие имена даёт `build-msix.ps1`, так что выпуск
|
||||
делается прикладыванием того, что он собрал.
|
||||
|
||||
Пакет скачивается во временную папку и передаётся установщику приложений
|
||||
Windows: тот показывает издателя, спрашивает подтверждение и заменяет
|
||||
установленную версию. Подпись проверяет Windows, поэтому приложенный к выпуску
|
||||
пакет должен быть подписан — неподписанный установится только на машине в режиме
|
||||
разработчика; пайплайн подписывает то, что прикладывает. Работающее приложение
|
||||
до перезапуска продолжает жить на старых файлах.
|
||||
Приложение обновляет Store, а само приложение об этом не заботится: раздела
|
||||
обновлений в окне нет, запросов в сеть нет и кода для них тоже нет.
|
||||
|
||||
Дело не во вкусе, а в цене подписи. MSIX Windows установит только тогда, когда
|
||||
доверяет подписи на нём, а публично доверенный сертификат для подписи кода
|
||||
@@ -246,11 +227,11 @@ dotnet test --collect:"XPlat Code Coverage" --settings coverage.runsettings
|
||||
|
||||
Пайплайны лежат в `.gitea/workflows` и работают на Gitea Actions. Запрос
|
||||
на слияние в `master` собирается и проверяется тестами; по тегу вида `v1.2.3`
|
||||
проект собирается, проходит тесты, пакуется в MSIX и выкладывается релизом
|
||||
с приложенными подписанными пакетами. Номер версии берётся только из тега — тег
|
||||
любого другого вида останавливает прогон в самом начале. Версия пакета получается
|
||||
`1.2.3.0`: Store принимает четыре числа и последнее оставляет себе, так что тег
|
||||
на него не влияет.
|
||||
проект собирается, проходит тесты и пакуется в MSIX, который остаётся
|
||||
в артефактах прогона. Номер версии берётся только из тега — тег любого другого
|
||||
вида останавливает прогон в самом начале. Версия пакета получается `1.2.3.0`:
|
||||
Store принимает четыре числа и последнее оставляет себе, так что тег на него не
|
||||
влияет.
|
||||
|
||||
Обоим пайплайнам нужен runner под Windows с меткой `windows-x64`, на нём —
|
||||
.NET 10 SDK и git-lfs. Выгрузка исходников тянет файлы LFS: без них иконка
|
||||
@@ -260,29 +241,18 @@ dotnet test --collect:"XPlat Code Coverage" --settings coverage.runsettings
|
||||
окно на переднем плане или каретку, — на runner’е, живущем службой в нулевом
|
||||
сеансе, пропускают себя: показать окно там негде.
|
||||
|
||||
Пакет собирается дважды: Store и релиз хотят от него разного.
|
||||
Пакет идёт в Store и больше никуда: он не подписан, подпись на него ставит сам
|
||||
Partner Center. Поэтому прогон оставляет его в артефактах под именем
|
||||
`msix-1.2.3.0`, откуда его забирают и загружают руками; к релизу не прикладывается
|
||||
ничего — релиз по тегу Gitea заводит сама, и в нём один только тег. Неподписанный
|
||||
пакет, висящий в релизе, выглядел бы как то, что можно установить, и не
|
||||
устанавливался бы нигде — см. раздел об обновлениях.
|
||||
|
||||
Тот, что для Store, несёт identity, зарезервированную в Partner Center, и не
|
||||
подписан — подпись на него ставит сам Partner Center. Дальше артефактов прогона
|
||||
он не уходит: его забирают и загружают руками. Что это он, видно по имени —
|
||||
`CursorLang-1.2.3.0-store.msixbundle`. Identity берётся из переменных
|
||||
репозитория, а если те не заданы — из значений по умолчанию в скрипте:
|
||||
`MSIX_IDENTITY_NAME`, `MSIX_PUBLISHER` и `MSIX_PUBLISHER_DISPLAY_NAME`.
|
||||
|
||||
Тот, что приложен к релизу, пайплайн подписывает сертификатом от SSL.com:
|
||||
закрытый ключ остаётся в их HSM и на runner не попадает — на нём ставится
|
||||
eSigner CKA как поставщик хранилища ключей, и `signtool` спрашивает ключ у него
|
||||
так же, как спросил бы у токена. Учётная запись — три секрета репозитория:
|
||||
`ESIGNER_USERNAME`, `ESIGNER_PASSWORD` и `ESIGNER_TOTP_SECRET`; последний — тот
|
||||
секрет, который eSigner выдаёт для автоматической подписи, а не код с телефона.
|
||||
Проверяются они до сборки, а не на шаге подписи: релиз без подписанного пакета —
|
||||
не релиз.
|
||||
|
||||
`Publisher` у него не `MSIX_PUBLISHER`, а subject этого сертификата, прочитанный
|
||||
прямо в прогоне: пакет, называющий кого-то другого, Windows считает подделкой.
|
||||
Вместе с identity этот subject задаёт family name пакета, поэтому от релиза к
|
||||
релизу оба должны оставаться прежними — иначе обновление встанет рядом со старой
|
||||
версией, а не заменит её.
|
||||
Identity берётся из переменных репозитория, а если те не заданы — из значений по
|
||||
умолчанию в скрипте: `MSIX_IDENTITY_NAME`, `MSIX_PUBLISHER`
|
||||
и `MSIX_PUBLISHER_DISPLAY_NAME`. Вместе identity и publisher задают family name
|
||||
пакета, поэтому от версии к версии оба должны оставаться прежними — иначе Store
|
||||
примет следующую за другое приложение.
|
||||
|
||||
## Сборка пакета MSIX
|
||||
|
||||
@@ -312,13 +282,8 @@ Partner Center как есть.
|
||||
Здесь ничего не подписывается: подпись на пакет ставит сам Store, а для установки
|
||||
на эту машину вместо пакета регистрируется layout — см. `-Install` ниже.
|
||||
|
||||
`-CertificateThumbprint` подписывает всё, что собрано, сертификатом с этим
|
||||
отпечатком из личного хранилища текущего пользователя; `-Publisher` тогда должен
|
||||
называть его subject — скрипт говорит об этом до сборки, а не после. Обычно
|
||||
подписывает пайплайн, но то же работает и руками, как только eSigner CKA — или
|
||||
сертификат любого другого рода — положит сертификат в хранилище.
|
||||
`-PackageSuffix` дописывается в конец имён файлов: сборки для Store и для релиза
|
||||
различаются тем, что внутри, и больше ничем.
|
||||
Здесь ничего не подписывается: подпись на пакет ставит сам Store, а для установки
|
||||
на эту машину вместо пакета регистрируется layout — см. `-Install` ниже.
|
||||
|
||||
Приложение поставляется с собственной копией .NET: Windows не включает .NET 10, а
|
||||
MSIX не может установить среду выполнения как зависимость пакета.
|
||||
|
||||
Reference in New Issue
Block a user