This commit is contained in:
+37
-10
@@ -186,8 +186,8 @@ MSIX всегда выполняются в контексте вошедшег
|
||||
Windows: тот показывает издателя, спрашивает подтверждение и заменяет
|
||||
установленную версию. Подпись проверяет Windows, поэтому приложенный к выпуску
|
||||
пакет должен быть подписан — неподписанный установится только на машине в режиме
|
||||
разработчика. Работающее приложение до перезапуска продолжает жить на старых
|
||||
файлах.
|
||||
разработчика; пайплайн подписывает то, что прикладывает. Работающее приложение
|
||||
до перезапуска продолжает жить на старых файлах.
|
||||
|
||||
У приложения, установленного из Store, раздела обновлений нет вовсе: его
|
||||
обновляет Store, а пакет со стороны Windows поверх него всё равно не примет.
|
||||
@@ -263,8 +263,8 @@ dotnet test --collect:"XPlat Code Coverage" --settings coverage.runsettings
|
||||
Пайплайны лежат в `.gitea/workflows` и работают на Gitea Actions. Запрос
|
||||
на слияние в `master` собирается и проверяется тестами; по тегу вида `v1.2.3`
|
||||
проект собирается, проходит тесты, пакуется в MSIX и выкладывается релизом
|
||||
с приложенными пакетами. Номер версии берётся только из тега — тег любого
|
||||
другого вида останавливает прогон в самом начале. Версия пакета получается
|
||||
с приложенными подписанными пакетами. Номер версии берётся только из тега — тег
|
||||
любого другого вида останавливает прогон в самом начале. Версия пакета получается
|
||||
`1.2.3.0`: Store принимает четыре числа и последнее оставляет себе, так что тег
|
||||
на него не влияет.
|
||||
|
||||
@@ -276,10 +276,29 @@ dotnet test --collect:"XPlat Code Coverage" --settings coverage.runsettings
|
||||
окно на переднем плане или каретку, — на runner’е, живущем службой в нулевом
|
||||
сеансе, пропускают себя: показать окно там негде.
|
||||
|
||||
Пакет, который несёт релиз, загружается в Partner Center как есть. Identity
|
||||
берётся из переменных репозитория, а если те не заданы — из значений по
|
||||
умолчанию в скрипте: `MSIX_IDENTITY_NAME`, `MSIX_PUBLISHER`
|
||||
и `MSIX_PUBLISHER_DISPLAY_NAME`.
|
||||
Пакет собирается дважды: Store и релиз хотят от него разного.
|
||||
|
||||
Тот, что для 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 пакета, поэтому от релиза к
|
||||
релизу оба должны оставаться прежними — иначе обновление встанет рядом со старой
|
||||
версией, а не заменит её.
|
||||
|
||||
## Сборка пакета MSIX
|
||||
|
||||
@@ -297,13 +316,21 @@ powershell -File Packaging\build-msix.ps1 -Architectures x64
|
||||
|
||||
# Для Partner Center — identity та, что зарезервирована там
|
||||
powershell -File Packaging\build-msix.ps1 -Version 1.0.1.0 `
|
||||
-IdentityName 12345AleksandrNeychev.CursorLang -Publisher "CN=ABCD1234-..."
|
||||
-IdentityName 12345AleksandrNeichev.CursorLang -Publisher "CN=ABCD1234-..."
|
||||
```
|
||||
|
||||
Результат — `artifacts\packages\CursorLang-<версия>.msixbundle`, покрывающий x64
|
||||
и arm64; рядом лежат пакеты отдельных архитектур. Bundle загружается в Partner
|
||||
Center как есть.
|
||||
|
||||
`-CertificateThumbprint` подписывает всё, что собрано, сертификатом с этим
|
||||
отпечатком из личного хранилища текущего пользователя; `-Publisher` тогда должен
|
||||
называть его subject — скрипт говорит об этом до сборки, а не после. Обычно
|
||||
подписывает пайплайн, но то же работает и руками, как только eSigner CKA — или
|
||||
сертификат любого другого рода — положит сертификат в хранилище.
|
||||
`-PackageSuffix` дописывается в конец имён файлов: сборки для Store и для релиза
|
||||
различаются тем, что внутри, и больше ничем.
|
||||
|
||||
Приложение поставляется с собственной копией .NET: Windows не включает .NET 10, а
|
||||
MSIX не может установить среду выполнения как зависимость пакета.
|
||||
|
||||
@@ -324,5 +351,5 @@ pwsh -File Packaging\build-msix.ps1 -Architectures x64 -Install
|
||||
Удалить вручную:
|
||||
|
||||
```powershell
|
||||
Remove-AppxPackage (Get-AppxPackage -Name AleksandrNeychev.CursorLang).PackageFullName
|
||||
Remove-AppxPackage (Get-AppxPackage -Name AleksandrNeichev.CursorLang).PackageFullName
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user