# Установка зависимостей раннеров для сборки Aspia (macOS, Android) — команды Соответствует `.gitea/workflows/release.yml` на коммите `5565451d6` (ветка `domain-auth`, `Coder/aspia` на `https://git.byte-mate.ru`). Пояснения «зачем» — в `RUNNERS.md`, здесь только команды. Пометки: **[проверено]** — версия/ID/URL проверены 20.10.2026 по официальному источнику (ссылка рядом); **[не проверено]** — не удалось проверить, сверьте на месте. --- ## 0. Версия раннера Проект переименован: новые версии называются **gitea-runner 3.x–5.x** (последняя — 5.1.1 от 16.10.2026, https://gitea.com/gitea/act_runner/releases) [проверено]. У вас сейчас **act_runner v0.2.13**; его файлы по-прежнему доступны [проверено, HTTP 200]: - `https://gitea.com/gitea/act_runner/releases/download/v0.2.13/act_runner-0.2.13-darwin-arm64` - `https://gitea.com/gitea/act_runner/releases/download/v0.2.13/act_runner-0.2.13-windows-amd64.exe` Ниже используется **v0.2.13** — та же версия, что на работающих раннерах. Переход на 5.x — отдельная задача: в 5.0.0 есть несовместимые изменения (нужен Git ≥ 2.34.1 в PATH раннера, `${NAME}` в config.yaml раскрывается из окружения, job без `runs-on` падает); совместимость 5.x с Gitea 1.25.4 **[не проверено]**. **Важно — таймаут на стороне Gitea.** В примере config.yaml act_runner сказано: у Gitea свой таймаут задачи (**3 ч по умолчанию**) [проверено: комментарий в config.example.yaml v0.2.13]. Первая сборка macOS universal без кэша может идти дольше. Если задача обрывается через 3 ч, увеличьте в `app.ini` Gitea секцию `[actions]` (параметр `ENDLESS_TASK_TIMEOUT`, имя **[не проверено]** для 1.25 — сверьте с https://docs.gitea.com/administration/config-cheat-sheet#actions-actions), либо задайте `vars.MACOS_UNIVERSAL=false` для первой сборки. --- ## 1. macOS (Apple Silicon), метка `macos-arm64:host` Все команды — в Terminal под пользователем раннера (`runner`, без прав администратора; для `sudo` нужен администратор — выполните эти строки от него). ### 1.1 Xcode и Rosetta Полный Xcode из App Store (Qt 6.10+ не собирается только с Command Line Tools — так в upstream workflow). Workflow задаёт `DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer`, поэтому Xcode должен лежать именно там. ```bash # после установки Xcode из App Store: sudo xcode-select -s /Applications/Xcode.app/Contents/Developer sudo xcodebuild -license accept sudo xcodebuild -runFirstLaunch xcode-select --install # Command Line Tools (если спросит) # Rosetta 2 — нужна для x86_64-половины universal-сборки (workflow запускает `arch -x86_64 cmake`) sudo softwareupdate --install-rosetta --agree-to-license ``` Homebrew для x86_64 (`arch -x86_64 brew`, `/usr/local`) **не нужен**: компиляцию под x86_64 делает clang из Xcode (universal). Но workflow запускает **`arch -x86_64 cmake`**, а `arch` требует, чтобы в самом `cmake` была x86_64-часть. Бутылки Homebrew — только arm64, поэтому CMake ставится не из Homebrew, а официальный **universal** CMake.app (1.3a), как в upstream workflow (`/Applications/CMake.app/Contents/bin`). Остальные инструменты (ninja и т. д.) запускаются как дочерние процессы и работают нативно в arm64 **[не проверено]** на реальной сборке. ### 1.2 Homebrew Официальная команда установки (https://brew.sh) [проверено]: ```bash /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile eval "$(/opt/homebrew/bin/brew shellenv)" ``` ### 1.3 Инструменты Шаг «Check the tools» в workflow проверяет: `cmake ninja pkg-config autoconf automake libtool nasm python3 gzip lipo` (+ `xcodebuild`, при universal — `arch -x86_64`). Формулы Homebrew [проверено: https://formulae.brew.sh/api/formula/<имя>.json → 200]: ```bash brew install ninja pkgconf autoconf autoconf-archive automake libtool nasm python@3.13 git gnu-tar xz node ``` ### 1.3a CMake 4.4.4 universal (официальный) Та же версия, что закреплена для Linux-job (`cmake==4.4.4`); файл `cmake-4.4.4-macos-universal.dmg` [проверено: https://github.com/Kitware/CMake/releases/tag/v4.4.4]. ```bash cd /tmp curl -fLO https://github.com/Kitware/CMake/releases/download/v4.4.4/cmake-4.4.4-macos-universal.dmg hdiutil attach cmake-4.4.4-macos-universal.dmg -mountpoint /Volumes/cmake-4.4.4 -nobrowse sudo ditto /Volumes/cmake-4.4.4/CMake.app /Applications/CMake.app hdiutil detach /Volumes/cmake-4.4.4 lipo -archs /Applications/CMake.app/Contents/bin/cmake # ожидается: x86_64 arm64 ``` (Есть и cask `brew install --cask cmake-app` [проверено: formulae.brew.sh], но его версия не закреплена.) Если `cmake` ставили через brew — `brew uninstall cmake`, чтобы в PATH был только universal. `/Applications/CMake.app/Contents/bin` должен стоять в PATH **первым** (plist в 1.6). - `pkgconf` даёт команду `pkg-config` (формула `pkg-config` в Homebrew — псевдоним pkgconf). - `gzip`, `tar`, `lipo`, `openssl`, `security`, `ditto`, `PlistBuddy`, `productbuild` — системные / из Xcode. - `node` — для JavaScript-actions (checkout, cache, upload-artifact) в host-режиме. - `autoconf-archive`, `xz`, `gnu-tar`, `git` — не проверяются workflow, но нужны портам vcpkg / удобны; точный список, нужный портам vcpkg на macOS, **[не проверено]** — если порт попросит ещё что-то (например `bison`, `flex`, `gperf`, `meson`), доставьте через `brew install`. ### 1.4 act_runner v0.2.13 (darwin-arm64) ```bash mkdir -p ~/act_runner && cd ~/act_runner curl -fL -o act_runner https://gitea.com/gitea/act_runner/releases/download/v0.2.13/act_runner-0.2.13-darwin-arm64 chmod +x act_runner xattr -d com.apple.quarantine act_runner 2>/dev/null || true ./act_runner --version ./act_runner generate-config > config.yaml ``` Правка `config.yaml` (ключи из config.example.yaml v0.2.13 [проверено]): ```bash # capacity: 1 (по умолчанию уже 1), timeout: 12h (workflow ставит timeout-minutes: 720), метка host sed -i '' 's/^ timeout: 3h/ timeout: 12h/' config.yaml python3 - <<'PY' import re p='config.yaml'; s=open(p).read() s=re.sub(r'(?ms)^ labels:\n( - .*\n)+', ' labels:\n - "macos-arm64:host"\n', s) open(p,'w').write(s) PY grep -nE '^ (capacity|timeout|labels)' -A1 config.yaml ``` ### 1.5 Регистрация Токен: `Coder/aspia` → Settings → Actions → Runners → «Create new runner». ```bash cd ~/act_runner ./act_runner register --no-interactive \ --instance https://git.byte-mate.ru \ --token \ --name mac-arm64-01 \ --labels macos-arm64:host \ --config config.yaml ``` ### 1.6 Сервис launchd (LaunchAgent пользователя runner) Включите автологин пользователя `runner` (System Settings → Users & Groups) — LaunchAgent и связки ключей работают в его сессии. Отключите сон: `sudo pmset -a sleep 0 disksleep 0`. ```bash mkdir -p ~/Library/LaunchAgents cat > ~/Library/LaunchAgents/ru.byte-mate.act_runner.plist < Labelru.byte-mate.act_runner ProgramArguments $HOME/act_runner/act_runner daemon --config $HOME/act_runner/config.yaml WorkingDirectory$HOME/act_runner EnvironmentVariables PATH/Applications/CMake.app/Contents/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin LANGen_US.UTF-8 HOME$HOME RunAtLoad KeepAlive StandardOutPath$HOME/act_runner/runner.log StandardErrorPath$HOME/act_runner/runner.log PLIST plutil -lint ~/Library/LaunchAgents/ru.byte-mate.act_runner.plist launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/ru.byte-mate.act_runner.plist launchctl kickstart -k gui/$(id -u)/ru.byte-mate.act_runner launchctl print gui/$(id -u)/ru.byte-mate.act_runner | grep -E 'state|pid' tail -f ~/act_runner/runner.log # Ctrl+C для выхода ``` Перезапуск после правки config.yaml: `launchctl kickstart -k gui/$(id -u)/ru.byte-mate.act_runner`. Удаление: `launchctl bootout gui/$(id -u)/ru.byte-mate.act_runner`. ### 1.7 Проверка ```bash xcodebuild -version xcode-select -p # /Applications/Xcode.app/Contents/Developer arch -x86_64 /usr/bin/true && echo "rosetta ok" for t in cmake ninja pkg-config autoconf automake libtool nasm python3 gzip lipo git node; do printf '%-11s ' "$t"; command -v "$t" || echo "НЕТ"; done export PATH="/Applications/CMake.app/Contents/bin:$PATH" # как в plist command -v cmake # /Applications/CMake.app/Contents/bin/cmake cmake --version | head -1 # cmake version 4.4.4 lipo -archs "$(command -v cmake)" # x86_64 arm64 arch -x86_64 cmake --version | head -1 # должна запуститься под Rosetta df -h ~ # нужно ≥ 150 ГБ свободно ``` В Gitea: Settings → Actions → Runners — `mac-arm64-01`, статус Idle, метка `macos-arm64`. --- ## 2. Android на существующем Windows-раннере, метка `windows-android` PowerShell **от администратора**. Пути — ровно те, что workflow ждёт по умолчанию (иначе задайте переменные, см. 2.6). | Что | Путь по умолчанию в workflow | Переменная | |---|---|---| | Qt for Android | `C:/Qt/6.11.1/android_arm64_v8a` | `ANDROID_QT_PATH` | | Host Qt | `C:/Qt/6.11.1/mingw_64` | `ANDROID_QT_HOST_PATH` | | Android SDK | `C:/Android/sdk` | `ANDROID_SDK_ROOT` | | NDK | `C:/Android/sdk/ndk/27.2.12479018` | `ANDROID_NDK_ROOT` | | JDK | `C:/Program Files/Eclipse Adoptium/jdk-21.0.11.10-hotspot` | `ANDROID_JAVA_HOME` | Требования Qt 6.11 для Android: **NDK r27c (27.2.12479018), JDK 21** [проверено: https://doc.qt.io/qt-6.11/android.html]. Gradle (9.3.1, AGP 9.0.0 по той же странице) скачивается сам через Gradle wrapper — нужен доступ в интернет (`services.gradle.org`, `dl.google.com`, `repo.maven.apache.org`). ### 2.1 JDK 21 (Eclipse Temurin) winget-ID `EclipseAdoptium.Temurin.21.JDK` [проверено: microsoft/winget-pkgs]. Альтернатива — `Microsoft.OpenJDK.21` [проверено], но тогда путь другой → задайте `ANDROID_JAVA_HOME`. ```powershell winget install --id EclipseAdoptium.Temurin.21.JDK -e --accept-package-agreements --accept-source-agreements Get-ChildItem 'C:\Program Files\Eclipse Adoptium' | Select-Object Name ``` Точная папка зависит от версии, которую поставит winget (например `jdk-21.0.9.10-hotspot`); если она не `jdk-21.0.11.10-hotspot` — задайте переменную `ANDROID_JAVA_HOME` (2.6) на фактический путь (прямые слэши). ```powershell $jdk = (Get-ChildItem 'C:\Program Files\Eclipse Adoptium' -Directory | Where-Object Name -like 'jdk-21*' | Select-Object -First 1).FullName setx /M JAVA_HOME "$jdk" & "$jdk\bin\java.exe" -version ``` ### 2.2 Android SDK command-line tools Файл `commandlinetools-win-15859902_latest.zip`, SHA-256 `90ae805d20434428bffcb699c290860f19bb5f66a67e6b330067e3de801fb04a` [проверено: https://developer.android.com/studio#command-line-tools-only]. ```powershell $sdk = 'C:\Android\sdk' New-Item -ItemType Directory -Force -Path "$sdk\cmdline-tools" | Out-Null $zip = "$env:TEMP\cmdline-tools.zip" Invoke-WebRequest -Uri 'https://dl.google.com/android/repository/commandlinetools-win-15859902_latest.zip' -OutFile $zip if ((Get-FileHash $zip -Algorithm SHA256).Hash -ne '90AE805D20434428BFFCB699C290860F19BB5F66A67E6B330067E3DE801FB04A') { throw 'SHA-256 mismatch' } Expand-Archive $zip -DestinationPath "$sdk\cmdline-tools" -Force Rename-Item "$sdk\cmdline-tools\cmdline-tools" 'latest' # структура, которую ждёт sdkmanager setx /M ANDROID_SDK_ROOT $sdk setx /M ANDROID_HOME $sdk ``` ### 2.3 Пакеты SDK NDK `27.2.12479018` — как в workflow/upstream и в требованиях Qt 6.11 [проверено]. Уровень API и build-tools: Qt берёт самые новые установленные; `platforms;android-35` / `build-tools;35.0.0` взяты как разумный минимум **[не проверено]** для Qt 6.11 — если Gradle потребует другие, он назовёт их в логе, доставьте той же командой. ```powershell $env:JAVA_HOME = $jdk $sm = 'C:\Android\sdk\cmdline-tools\latest\bin\sdkmanager.bat' & $sm --sdk_root=C:\Android\sdk --list | Select-String -Pattern 'ndk;27|platforms;android-3[5-9]|build-tools;3[5-9]' | Select-Object -First 15 'y' * 20 | & $sm --sdk_root=C:\Android\sdk --licenses & $sm --sdk_root=C:\Android\sdk "platform-tools" "platforms;android-35" "build-tools;35.0.0" "ndk;27.2.12479018" Test-Path 'C:\Android\sdk\ndk\27.2.12479018\source.properties' ``` ### 2.4 Qt 6.11.1 (Android arm64-v8a + host MinGW) Нужны два компонента [проверено по `Updates.xml` в https://download.qt.io/online/qtsdkrepository/]: - `qt.qt6.6111.android_arm64_v8a` (репозиторий `all_os/android/qt6_6111/qt6_6111_arm64_v8a`) - `qt.qt6.6111.win64_mingw` (репозиторий `windows_x86/desktop/qt6_6111/qt6_6111_mingw`) Модули проекта (Core, Gui, Network, Widgets, Xml, Svg, PrintSupport, Test, LinguistTools) входят в базовый пакет — в списке add-on'ов Android 6.11.1 их нет, add-on'ы не нужны [проверено]. **Вариант А — официальный онлайн-установщик (нужна учётная запись Qt).** URL установщика [проверено, HTTP 200]: ```powershell Invoke-WebRequest -Uri 'https://download.qt.io/official_releases/online_installers/qt-online-installer-windows-x64-online.exe' -OutFile "$env:TEMP\qt-online-installer.exe" & "$env:TEMP\qt-online-installer.exe" --root C:\Qt --accept-licenses --accept-obligations ` --default-answer --confirm-command --email --pw ` install qt.qt6.6111.android_arm64_v8a qt.qt6.6111.win64_mingw ``` Ключи `--root --accept-licenses --accept-obligations --default-answer --confirm-command --email --pw install` — из документации Qt Installer Framework / Qt Online Installer CLI **[не проверено]** на этой версии установщика (`qt-online-installer.exe --help` покажет точный список). Вместо `--email/--pw` можно задать токен в переменной `QT_INSTALLER_JWT_TOKEN` **[не проверено]**. Пароль не оставляйте в истории PowerShell (`Clear-History`). **Вариант Б — aqtinstall (без учётной записи).** aqtinstall 3.3.0 — текущая версия на PyPI [проверено]; `aqt list-qt all_os android` показывает 6.11.1 и arch `android_arm64_v8a` [проверено]; сама установка не запускалась **[не проверено]**. ```powershell py -m pip install --upgrade aqtinstall==3.3.0 py -m aqt install-qt windows desktop 6.11.1 win64_mingw --outputdir C:\Qt py -m aqt install-qt all_os android 6.11.1 android_arm64_v8a --outputdir C:\Qt ``` Проверка путей, которые ждёт workflow: ```powershell Test-Path 'C:\Qt\6.11.1\android_arm64_v8a\lib\cmake\Qt6\qt.toolchain.cmake' Test-Path 'C:\Qt\6.11.1\mingw_64\bin\qmake.exe' ``` Сам компилятор MinGW (`qt.tools.win64_mingw1310`) для сборки **не нужен** — host-инструменты собираются MSVC (шаг `Set up MSVC`); нужен только host Qt `mingw_64` как `QT_HOST_PATH` (так в upstream). ### 2.5 Метка `windows-android` для существующего раннера В act_runner v0.2.13: если в `config.yaml` задан `runner.labels`, используется он; если пусто — метки из `.runner` [проверено: комментарий в config.example.yaml v0.2.13]. Перерегистрация не нужна. ```powershell cd <ПАПКА_РАННЕРА> # где лежат act_runner.exe, config.yaml и .runner Copy-Item config.yaml config.yaml.bak notepad config.yaml ``` В `config.yaml`: ```yaml runner: labels: - "windows:host" - "windows-android:host" ``` (Если раннер был зарегистрирован с другой основной меткой — сохраните её; посмотреть текущие: `Get-Content .runner`.) Перезапуск службы NSSM: ```powershell nssm status <ИМЯ_СЛУЖБЫ> # имя: Get-Service | ? Name -like '*runner*' nssm restart <ИМЯ_СЛУЖБЫ> ``` В Gitea: Settings → Actions → Runners — у раннера метки `windows` и `windows-android`. ### 2.6 Переменные репозитория (если пути отличаются) `Coder/aspia` → Settings → Actions → Variables (прямые слэши): `ANDROID_QT_PATH`, `ANDROID_QT_HOST_PATH`, `ANDROID_SDK_ROOT`, `ANDROID_NDK_ROOT`, `ANDROID_JAVA_HOME`. --- ## 3. Windows: gzip для кэша vcpkg (сейчас «Save vcpkg cache» падает) Ошибка: `C:\Program Files\Git\usr\bin\tar.exe ... -z` → `/bin/sh: gzip: command not found`. tar из Git for Windows вызывает `gzip` через `sh`, а `sh` ищет его по PATH. Две причины: нет файла `gzip.exe` в `usr\bin` (MinGit / урезанная установка) или в PATH **службы** нет `C:\Program Files\Git\usr\bin`. Полный Git for Windows содержит `usr\bin\gzip.exe` **[не проверено]** для текущей 2.55.0 — проверьте командой ниже. ### 3.1 Диагностика ```powershell Test-Path 'C:\Program Files\Git\usr\bin\gzip.exe' & 'C:\Program Files\Git\usr\bin\sh.exe' -c 'command -v gzip; echo PATH=$PATH' nssm get <ИМЯ_СЛУЖБЫ> AppEnvironmentExtra ``` ### 3.2 Если файла нет — поставить полный Git for Windows winget-ID `Git.Git` (последняя в каталоге — 2.55.0) [проверено: microsoft/winget-pkgs]: ```powershell winget install --id Git.Git -e --accept-package-agreements --accept-source-agreements Test-Path 'C:\Program Files\Git\usr\bin\gzip.exe' ``` ### 3.3 Если файл есть, но служба его не видит — добавить usr\bin в PATH службы NSSM `AppEnvironmentExtra` дописывает переменные к окружению службы; `%PATH%` при этом **[не проверено]** раскрывается не во всех версиях NSSM — надёжнее записать PATH целиком: ```powershell $sysPath = [Environment]::GetEnvironmentVariable('Path','Machine') nssm set <ИМЯ_СЛУЖБЫ> AppEnvironmentExtra "PATH=C:\Program Files\Git\usr\bin;$sysPath" nssm get <ИМЯ_СЛУЖБЫ> AppEnvironmentExtra nssm restart <ИМЯ_СЛУЖБЫ> ``` (Если в `AppEnvironmentExtra` уже есть другие переменные — передайте их тем же вызовом через пробел: `nssm set <ИМЯ> AppEnvironmentExtra "A=1" "PATH=..."`, иначе они перезапишутся.) ### 3.4 Проверка ```powershell & 'C:\Program Files\Git\usr\bin\sh.exe' -c 'command -v gzip && gzip --version | head -1' & 'C:\Program Files\Git\usr\bin\sh.exe' -c 'echo test | gzip -c | gzip -dc' ``` Окончательная проверка — в логе следующего прогона шаг «Save vcpkg cache» должен закончиться `Cache saved successfully` (раньше — `gzip: command not found`). --- ## 4. Секреты и переменные Gitea (`Coder/aspia` → Settings → Actions) Все необязательные; без них — неподписанные `.pkg` и debug-APK. **macOS (подпись/нотаризация)** — секреты: `MACOS_CERT_P12_BASE64`, `MACOS_CERT_PASSWORD`, `MACOS_APP_SIGN_IDENTITY`, `MACOS_INSTALLER_SIGN_IDENTITY`, `MACOS_NOTARY_APPLE_ID`, `MACOS_NOTARY_TEAM_ID`, `MACOS_NOTARY_PASSWORD`. Переменная: `MACOS_UNIVERSAL` (`false` — только arm64). ```bash # Экспортируйте «Developer ID Application» и «Developer ID Installer» с ключами в один certs.p12 # (Keychain Access → выделить оба → Export Items…), затем: base64 -i certs.p12 | pbcopy # вставить в MACOS_CERT_P12_BASE64 security find-identity -v -p codesigning # точная строка для MACOS_APP_SIGN_IDENTITY security find-identity -v # строка "Developer ID Installer: ..." для MACOS_INSTALLER_SIGN_IDENTITY # MACOS_NOTARY_PASSWORD — app-specific password: https://account.apple.com → Sign-In and Security rm -P certs.p12 2>/dev/null || rm certs.p12 ``` **Android (release-подпись)** — секреты: `ANDROID_KEYSTORE_BASE64`, `ANDROID_KEYSTORE_PASSWORD`, `ANDROID_KEY_ALIAS`, `ANDROID_KEY_PASSWORD`. Переменные (если пути другие): см. 2.6. ```powershell & "$env:JAVA_HOME\bin\keytool.exe" -genkeypair -v -keystore aspia-release.keystore -alias aspia ` -keyalg RSA -keysize 4096 -validity 10000 -storetype PKCS12 [Convert]::ToBase64String([IO.File]::ReadAllBytes("$PWD\aspia-release.keystore")) | Set-Clipboard # → ANDROID_KEYSTORE_BASE64 # альтернатива: certutil -encode aspia-release.keystore ks.b64 (затем удалить строки BEGIN/END и переносы) ``` Для PKCS12 пароль ключа равен паролю хранилища — задайте одно значение в `ANDROID_KEYSTORE_PASSWORD` и `ANDROID_KEY_PASSWORD`. Keystore и пароли сохраните в надёжном месте: без них обновлять приложение у пользователей нельзя. **Уже есть:** `VCPKG4ASPIA_TOKEN` (секрет), при желании `RELEASE_TOKEN`, `RELEASE_API_URL`, `VCPKG4ASPIA_URL`. --- ## 5. Итоговый чек-лист и тестовый запуск macOS: - [ ] Xcode в `/Applications/Xcode.app`, лицензия принята, `xcode-select -p` указывает на него - [ ] Rosetta 2 (`arch -x86_64 /usr/bin/true`) - [ ] brew-инструменты (1.3), universal CMake 4.4.4 первым в PATH (1.3a) - [ ] act_runner v0.2.13, `config.yaml`: `timeout: 12h`, `labels: macos-arm64:host` - [ ] зарегистрирован, LaunchAgent запущен, в Gitea статус Idle - [ ] ≥ 150 ГБ свободно, сон отключён, автологин Windows / Android: - [ ] JDK 21, `ANDROID_JAVA_HOME` задан, если путь не `jdk-21.0.11.10-hotspot` - [ ] `C:\Android\sdk` с `cmdline-tools\latest`, platform-tools, platforms/build-tools, `ndk\27.2.12479018`, лицензии приняты - [ ] `C:\Qt\6.11.1\android_arm64_v8a` и `C:\Qt\6.11.1\mingw_64` - [ ] метки `windows:host` + `windows-android:host`, служба перезапущена - [ ] `sh.exe -c 'command -v gzip'` находит gzip Тестовый запуск — по одной платформе, чтобы не ждать остальные (новый тег, например `v3.1.3-lota.4`; `release_type=draft`, чтобы не публиковать): ```bash curl -H "Authorization: token " -H "Content-Type: application/json" -X POST \ https://git.byte-mate.ru/api/v1/repos/Coder/aspia/actions/workflows/release.yml/dispatches \ -d '{"ref":"domain-auth","inputs":{"tag":"v3.1.3-lota.4","release_type":"draft","replace":"false","build_linux":"false","build_windows":"false","build_macos":"true","build_android":"false","run_tests":"true","use_cache":"true"}}' ``` Затем то же с `"build_android":"true"` (и `"build_macos":"false"`), и отдельно с `"build_windows":"true"` — проверить, что «Save vcpkg cache» на Windows теперь проходит. Через форму: Actions → release → Run workflow, те же параметры. Черновики-релизы после проверки удалите (Releases → Edit → Delete) или запускайте с `replace=true` на тот же тег.