Last active 2 weeks ago

instruction.md Raw

Установка зависимостей раннеров для сборки 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 должен лежать именно там.

# после установки 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) [проверено]:

/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]:

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].

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)

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 [проверено]):

# 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».

cd ~/act_runner
./act_runner register --no-interactive \
  --instance https://git.byte-mate.ru \
  --token <RUNNER_REGISTRATION_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.

mkdir -p ~/Library/LaunchAgents
cat > ~/Library/LaunchAgents/ru.byte-mate.act_runner.plist <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>ru.byte-mate.act_runner</string>
  <key>ProgramArguments</key>
  <array>
    <string>$HOME/act_runner/act_runner</string>
    <string>daemon</string>
    <string>--config</string>
    <string>$HOME/act_runner/config.yaml</string>
  </array>
  <key>WorkingDirectory</key><string>$HOME/act_runner</string>
  <key>EnvironmentVariables</key>
  <dict>
    <key>PATH</key><string>/Applications/CMake.app/Contents/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    <key>LANG</key><string>en_US.UTF-8</string>
    <key>HOME</key><string>$HOME</string>
  </dict>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><true/>
  <key>StandardOutPath</key><string>$HOME/act_runner/runner.log</string>
  <key>StandardErrorPath</key><string>$HOME/act_runner/runner.log</string>
</dict>
</plist>
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 Проверка

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.

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) на фактический путь (прямые слэши).

$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].

$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 потребует другие, он назовёт их в логе, доставьте той же командой.

$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]:

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 <QT_ACCOUNT_EMAIL> --pw <QT_ACCOUNT_PASSWORD> `
  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 [проверено]; сама установка не запускалась [не проверено].

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:

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]. Перерегистрация не нужна.

cd <ПАПКА_РАННЕРА>                      # где лежат act_runner.exe, config.yaml и .runner
Copy-Item config.yaml config.yaml.bak
notepad config.yaml

В config.yaml:

runner:
  labels:
    - "windows:host"
    - "windows-android:host"

(Если раннер был зарегистрирован с другой основной меткой — сохраните её; посмотреть текущие: Get-Content .runner.) Перезапуск службы NSSM:

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 Диагностика

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]:

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 целиком:

$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 Проверка

& '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).

# Экспортируйте «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.

& "$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, чтобы не публиковать):

curl -H "Authorization: token <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 на тот же тег.