Files
senboost/electron-builder.yml
maeneko 30248656a8
CI / Линт и типы (push) Canceled after 0s
CI / Сборка (Windows) (push) Canceled after 0s
CI / Сборка (Linux) (push) Canceled after 0s
CI / Сборка (macOS) (push) Canceled after 0s
CI: сборка macOS
Джоба build-mac на macos-latest по образцу Windows/Linux: та же заготовка релиза с
`|| true` (все три джобы стартуют параллельно и конкурируют за создание релиза),
electron-builder --mac с публикацией только на тег, артефакты в Artifacts на push/PR.

Отличия от соседних джоб, которые нельзя было скопировать как есть:
  • контрольная сумма считается через `md5 -q` — md5sum на macOS 14/15 нет вовсе;
  • шага «Описание релиза» здесь нет, он намеренно живёт только в Windows-джобе;
  • из релиза удаляются `*-mac.zip.blockmap`: у dmg блокмап отключён свежим
    writeUpdateInfo: false, а у mac-zip выключателя нет (зашит в macPackager), при
    этом electron-updater'а в приложении нет и блокмапы никому не нужны.
2026-09-04 15:00:38 +03:00

181 lines
10 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
appId: com.senboost.app
productName: SenBoost
directories:
buildResources: build
output: release
# releaseType: release — публиковать релиз сразу, без черновика (draft — поведение по
# умолчанию у electron-builder). С черновиком параллельная загрузка нескольких файлов иногда
# создаёт два черновика с одним и тем же тегом вместо одного релиза.
#
# publishAutoUpdate: false — не заливать latest.yml. Это метаданные для electron-updater,
# которого в приложении нет (обновляется пользователь вручную, скачивая новый инсталлятор
# со страницы релиза) — файл был бы мёртвым грузом в ассетах.
publish:
provider: github
releaseType: release
publishAutoUpdate: false
files:
- '!**/.vscode/*'
- '!src/*'
- '!electron.vite.config.{js,ts,mjs,cjs}'
- '!{.eslintcache,eslint.config.mjs,.prettierignore,.prettierrc.yaml,README.md}'
- '!{.env,.env.*,.npmrc,pnpm-lock.yaml,yarn.lock}'
- '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}'
- '!.github/*'
# zapret и linux-helper/darwin-helper идут отдельно через extraResources ниже — не
# дублировать их в app.asar.
- '!resources/zapret/**'
- '!resources/linux-helper/**'
- '!resources/darwin-helper/**'
asarUnpack:
- 'resources/**'
# Бинарники zapret (npm run zapret:fetch) кладём рядом с приложением, а не в asar —
# это исполняемые файлы, которые main-процесс запускает через spawn.
#
# Общие для всех платформ куски (списки, fake-пакеты, лицензии zapret/Flowseal) — здесь;
# платформенные бинарники — в extraResources соответствующего раздела (win/mac/linux) ниже.
# extraResources платформы ДОБАВЛЯЕТСЯ к этому списку, а не заменяет его (проверено по
# исходникам electron-builder, app-builder-lib/fileMatcher.js) — так Windows-сборка не везёт
# nfqws и Mach-O tpws, а Linux-сборка не везёт WinDivert и winws.exe.
extraResources:
- from: resources/zapret/lists
to: zapret/lists
- from: resources/zapret/fakes
to: zapret/fakes
- from: resources/zapret
to: zapret
filter:
- 'LICENSE.zapret.txt'
- 'LICENSE.flowseal.txt'
win:
executableName: SenBoost
# Приложение запрашивает права администратора при КАЖДОМ запуске (манифест exe).
# Внимание на компромисс: установка при этом остаётся per-user, то есть exe лежит в
# %LocalAppData%\Programs\SenBoost — папке, доступной на запись обычному пользователю.
# Значит подмена этого exe даёт злоумышленнику администратора с подтверждения самого
# пользователя. Это осознанный выбор владельца проекта; безопасный вариант — вернуть
# perMachine: true, чтобы exe лежал в защищённом от записи Program Files.
requestedExecutionLevel: requireAdministrator
target:
# arm64 не собираем: WinDivert (драйвер для winws — src/main/zapret/engine.win32.ts)
# не имеет подписанной сборки под arm64, только x64 через эмуляцию (docs/windows.md
# в поставке zapret) — arm64-инсталлятор был бы заведомо нерабочим.
- target: nsis
arch: [x64]
extraResources:
- from: resources/zapret/win32
to: zapret/win32
- from: resources/zapret
to: zapret
filter:
- 'LICENSE.WinDivert.txt'
nsis:
# Быстрая установка per-user, без UAC и без мастера: ставится в %LocalAppData%, куда
# обычный пользователь и так пишет без повышения прав. Раньше здесь стоял perMachine —
# это была защита от того, что служба (LocalSystem) ссылалась бы на winws.exe прямо
# в папке установки. Теперь вместо этого при первом включении обхода приложение сама
# копирует winws.exe в защищённый ACL'ом каталог в %ProgramData% (см. applyServiceConfig
# в src/main/zapret/service.win32.ts) — сама установка приложения per-user безопасна.
oneClick: true
perMachine: false
# Без electron-updater (см. publishAutoUpdate выше) differential-обновления не нужны —
# differentialPackage: false отключает генерацию .blockmap, который иначе всегда
# заливался бы в ассеты релиза рядом с инсталлятором.
differentialPackage: false
# Удалять %APPDATA%\senboost (списки сайтов, метка первого запуска) вместе с приложением.
# По умолчанию electron-builder этого НЕ делает, и данные оставались бы в системе после
# удаления. Обновление приложения под это не попадает — в шаблоне деинсталлятора стоит
# проверка `ifNot isUpdated`, так что отредактированные списки переживают обновление.
deleteAppDataOnUninstall: true
include: build/installer.nsh
artifactName: ${name}-${version}-setup-${arch}.${ext}
shortcutName: ${productName}
uninstallDisplayName: ${productName}
createDesktopShortcut: always
mac:
category: public.app-category.productivity
# utunws (форк nfqws под utun+BPF, см. src/main/zapret/engine.darwin.ts) собран под
# -target …-macos14.0 в самом релизе Flowseal/zapret-mac-discord-youtube — на более
# старой системе он не запустится, минимум объявляем и на уровне инсталлятора.
minimumSystemVersion: '14.0'
target:
- target: dmg
arch: [x64, arm64]
- target: zip
arch: [x64, arm64]
entitlements: build/entitlements.mac.plist
entitlementsInherit: build/entitlements.mac.plist
hardenedRuntime: true
# utunws — сторонний Mach-O внутри .app; hardened runtime требует, чтобы electron-builder
# подписал и его тем же Developer ID, иначе Gatekeeper убьёт процесс при первом spawn.
binaries:
- Contents/Resources/zapret/darwin/utunws
# Подпись и нотаризация выключены: без Apple Developer ID сборка иначе падает.
# Как включить — см. раздел «Подпись» в README.md.
notarize: false
extraResources:
- from: resources/zapret/darwin
to: zapret/darwin
# install.sh/stop.sh/daemon.sh/watchdog.sh/autostart.sh — привилегированные скрипты,
# запускаются через osascript "with administrator privileges" (elevate.darwin.ts).
# Не из resources/zapret: тот качает fetch-zapret.mjs, а этот каталог — свой, лежит
# в репозитории (см. src/main/zapret/paths.ts:bundledDarwinHelperDir()).
- from: resources/darwin-helper
to: darwin-helper
dmg:
artifactName: ${name}-${version}-${arch}.${ext}
# Тот же мотив, что differentialPackage: false у nsis — electron-updater'а в приложении
# нет, и .blockmap рядом с .dmg был бы мёртвым грузом в ассетах релиза. У mac-таргета zip
# такого выключателя нет (isWriteUpdateInfo зашит в macPackager), поэтому
# `*-mac.zip.blockmap` всё равно соберётся — см. комментарий в джобе «Сборка (macOS)».
writeUpdateInfo: false
linux:
executableName: senboost
# desktopName в package.json + syncDesktopName — иначе Electron не свяжет открытые окна
# с .desktop-записью (app_id/WM_CLASS), и часть окружений не покажет иконку в панели задач.
syncDesktopName: true
target:
- target: AppImage
arch: [x64]
- target: deb
arch: [x64]
maintainer: SenBoost
category: Network
synopsis: Обход блокировок через zapret
extraResources:
- from: resources/zapret/linux
to: zapret/linux
# senboost-helper.sh — привилегированный помощник (nfqws.linux.ts зовёт его через
# pkexec). Не из resources/zapret: тот качает fetch-zapret.mjs, а этот файл — свой,
# лежит в репозитории (см. src/main/zapret/paths.ts:bundledHelperPath()).
- from: resources/linux-helper
to: linux-helper
appImage:
artifactName: ${name}-${version}-${arch}.${ext}
deb:
artifactName: ${name}-${version}-${arch}.${ext}
# electron-builder ЗАМЕНЯЕТ этим списком свои дефолтные зависимости Electron, а не
# дополняет их (проверено по исходникам, app-builder-lib/targets/FpmTarget.js) — потерять
# хотя бы одну из первых девяти значило бы получить .deb, который ставится и не запускается.
# nftables и polkit — уже наши, для nfqws/pkexec.
depends:
- libgtk-3-0
- libnotify4
- libnss3
- libxss1
- libxtst6
- xdg-utils
- libatspi2.0-0
- libuuid1
- libsecret-1-0
- nftables
- policykit-1
npmRebuild: false