removed update

This commit is contained in:
2026-08-13 16:24:23 +05:00
parent 1aa9d9b44e
commit f75ab0f077
4 changed files with 64 additions and 415 deletions
+20 -55
View File
@@ -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 не может установить среду выполнения как зависимость пакета.