revert CI: сборка релизов под Windows, Linux и macOS через Gitea Actions

- .gitea/workflows/release.yml: по тегу vX.Y.Z черновик релиза, три сборки
  (Inno Setup + portable zip, AppImage + tar.gz, universal DMG), SHA256SUMS
  и публикация; workflow_dispatch собирает артефакты без релиза.
- ci/setup-runner-{linux.sh,windows.ps1}: подготовка раннеров поверх уже
  установленного Qt (компилятор, git, node, appimagetool/Inno, gitea-runner).
- packaging/: THIRD_PARTY_LICENSES.txt (без него падал cmake --install на
  Windows/Linux) и скрипт установщика Inno Setup.
- Linux: недостающий #include <QCoreApplication> в zlibreference.cpp и
  OUTPUT_DIRECTORY QML-модуля — каталог BiLauncher в build-dir совпадал с
  именем исполняемого файла, и линковка падала.
- Из ресурсов убраны неиспользуемые mp4 и дубли icon.rc; из git — icon.rc
  (генерируется из icon.rc.in) и doc/.DS_Store.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
galeonandClaude Opus 5.5 committed 2026-10-08 20:12:31 +00:00
1 parent 586201ac4e
commit 3ee47a4ce3
9 files changed
+5 -658

No files matched your search

-278
View File
@@ -1,278 +0,0 @@
# Сборка BiLauncher под Windows, Linux и macOS и публикация в Gitea Releases.
#
# push тега vX.Y.Z (или vX.Y.Z-rc1 → pre-release):
# create-release создаёт черновик релиза → три сборки прикладывают к нему файлы →
# publish добавляет SHA256SUMS.txt и снимает флаг черновика. Если какая-то сборка
# упала, релиз остаётся черновиком и пользователям не виден.
# Ручной запуск (workflow_dispatch): те же сборки, но результат — артефакты прогона,
# релиз не создаётся.
#
# Пути к Qt на раннерах задаются в их config.yaml (runner.envs): QT_ROOT — kit Qt,
# QT_TOOLS — папка Tools из Qt Online Installer (там CMake и Ninja).
# Секрет RELEASE_TOKEN — PAT с правом repository: write.
name: release
on:
push:
tags: ["v*"]
workflow_dispatch:
env:
API: ${{ github.server_url }}/api/v1/repos/${{ github.repository }}
jobs:
create-release:
runs-on: linux
outputs:
version: ${{ steps.meta.outputs.version }}
tag: ${{ steps.meta.outputs.tag }}
release_id: ${{ steps.release.outputs.id }}
steps:
- uses: actions/checkout@v4
- id: meta
name: Версия из CMakeLists.txt и сверка с тегом
run: |
version=$(sed -nE 's/^project\(BiLauncher VERSION ([0-9]+\.[0-9]+\.[0-9]+).*/\1/p' CMakeLists.txt)
[ -n "$version" ] || { echo "Не нашёл project(BiLauncher VERSION ...)"; exit 1; }
tag=""
if [ "${GITHUB_REF_TYPE}" = "tag" ]; then
tag="${GITHUB_REF_NAME}"
base="${tag#v}"; base="${base%%-*}"
if [ "$base" != "$version" ]; then
echo "Тег $tag не совпадает с версией $version в CMakeLists.txt"; exit 1
fi
version="${tag#v}"
fi
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "tag=$tag" >> "$GITHUB_OUTPUT"
echo "Версия: $version, тег: ${tag:-нет}"
- id: release
name: Черновик релиза
if: steps.meta.outputs.tag != ''
env:
TOKEN: ${{ secrets.RELEASE_TOKEN }}
TAG: ${{ steps.meta.outputs.tag }}
run: |
# Описание релиза — раздел CHANGELOG.md для этой версии
base="${TAG#v}"; base="${base%%-*}"
notes=$(awk -v v="$base" '
/^## \[/ { if (on) exit; if (index($0, "[" v "]")) { on=1; next } }
on' CHANGELOG.md)
prerelease=false; case "$TAG" in *-*) prerelease=true;; esac
body=$(python3 -c 'import json,sys; print(json.dumps({"tag_name":sys.argv[1],"name":"BiLauncher "+sys.argv[1],"body":sys.argv[2],"draft":True,"prerelease":sys.argv[3]=="true"}))' \
"$TAG" "$notes" "$prerelease")
id=$(curl -fsS -X POST "$API/releases" \
-H "Authorization: token $TOKEN" -H "Content-Type: application/json" \
-d "$body" | python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')
echo "id=$id" >> "$GITHUB_OUTPUT"
echo "Создан черновик релиза $TAG (id $id)"
build-linux:
needs: create-release
runs-on: linux
env:
VERSION: ${{ needs.create-release.outputs.version }}
RELEASE_ID: ${{ needs.create-release.outputs.release_id }}
outputs:
sums: ${{ steps.pack.outputs.sums }}
steps:
- uses: actions/checkout@v4
- name: Сборка
run: |
export PATH="$QT_TOOLS/CMake/bin:$QT_TOOLS/Ninja:$PATH"
rm -rf build AppDir dist
# LIBDIR=lib: zlibreference.cpp ищет libz рядом, в ../lib/BiLauncher,
# а на Ubuntu по умолчанию был бы lib/x86_64-linux-gnu.
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH="$QT_ROOT" \
-DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=lib
# На ВМ 6 ГБ памяти: без ограничения 42 параллельных компилятора уходят в OOM.
cmake --build build -j 8
cmake --install build --prefix "$PWD/AppDir/usr"
- id: pack
name: AppImage и tar.gz
run: |
mkdir -p dist
cp AppDir/usr/share/applications/bilauncher.desktop AppDir/
cp AppDir/usr/share/icons/hicolor/256x256/apps/bilauncher.png AppDir/
ln -sf usr/bin/BiLauncher AppDir/AppRun
ARCH=x86_64 appimagetool --no-appstream AppDir "dist/BiLauncher-$VERSION-x86_64.AppImage"
cp -a AppDir/usr "BiLauncher-$VERSION"
tar -czf "dist/BiLauncher-$VERSION-linux-x86_64.tar.gz" "BiLauncher-$VERSION"
rm -rf "BiLauncher-$VERSION"
ls -lh dist
echo "sums=$(cd dist && sha256sum * | base64 -w0)" >> "$GITHUB_OUTPUT"
- name: Загрузка в релиз
if: env.RELEASE_ID != ''
env:
TOKEN: ${{ secrets.RELEASE_TOKEN }}
run: |
for f in dist/*; do
curl -fsS -X POST -H "Authorization: token $TOKEN" \
-F "attachment=@$f" "$API/releases/$RELEASE_ID/assets?name=$(basename "$f")" > /dev/null
echo "Загружен $(basename "$f")"
done
- name: Артефакты прогона
if: env.RELEASE_ID == ''
uses: actions/upload-artifact@v4
with:
name: linux
path: dist/
build-windows:
needs: create-release
runs-on: windows
env:
VERSION: ${{ needs.create-release.outputs.version }}
RELEASE_ID: ${{ needs.create-release.outputs.release_id }}
outputs:
sums: ${{ steps.build.outputs.sums }}
steps:
- uses: actions/checkout@v4
- id: build
name: Сборка, установщик и portable-архив
shell: powershell
run: |
$ErrorActionPreference = "Stop"
# Короткие пути: дерево WebEngine легко вылезает за MAX_PATH.
$build = "C:\r\bl-build"; $stage = "C:\r\bl-stage"; $dist = "$PWD\dist"
Remove-Item -Recurse -Force $build, $stage, $dist -ErrorAction SilentlyContinue
$vs = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * `
-requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath
Import-Module "$vs\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
Enter-VsDevShell -VsInstallPath $vs -SkipAutomaticLocation -DevCmdArguments "-arch=x64 -host_arch=x64"
$env:PATH = "$env:QT_TOOLS\CMake_64\bin;$env:QT_TOOLS\Ninja;$env:PATH"
cmake -S . -B $build -G Ninja -DCMAKE_BUILD_TYPE=Release "-DCMAKE_PREFIX_PATH=$env:QT_ROOT"
if ($LASTEXITCODE) { throw "cmake configure" }
cmake --build $build
if ($LASTEXITCODE) { throw "cmake build" }
cmake --install $build --prefix $stage
if ($LASTEXITCODE) { throw "cmake install" }
New-Item -ItemType Directory -Force $dist | Out-Null
& "$env:ISCC_DIR\ISCC.exe" /Q "/DAppVersion=$env:VERSION" "/DSourceDir=$stage" "/DOutputDir=$dist" packaging\windows\BiLauncher.iss
if ($LASTEXITCODE) { throw "iscc" }
# Portable: то же дерево, что ставит установщик, без vc_redist
# (в portable-варианте среда выполнения MSVC должна уже стоять в системе).
Remove-Item "$stage\bin\vc_redist.x64.exe" -ErrorAction SilentlyContinue
$portable = "C:\r\BiLauncher-$env:VERSION"
Remove-Item -Recurse -Force $portable -ErrorAction SilentlyContinue
Move-Item $stage $portable
tar.exe -a -c -f "$dist\BiLauncher-$env:VERSION-win64-portable.zip" -C C:\r "BiLauncher-$env:VERSION"
if ($LASTEXITCODE) { throw "zip" }
Remove-Item -Recurse -Force $portable
Get-ChildItem $dist | Format-Table Name, Length
$sums = Get-ChildItem $dist | ForEach-Object {
"{0} {1}" -f (Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLower(), $_.Name }
$b64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(($sums -join "`n") + "`n"))
# Не Out-File: PowerShell 5.1 пишет UTF-8 с BOM, и имя первой переменной ломается.
[IO.File]::AppendAllText($env:GITHUB_OUTPUT, "sums=$b64`n")
- name: Загрузка в релиз
if: env.RELEASE_ID != ''
shell: powershell
env:
TOKEN: ${{ secrets.RELEASE_TOKEN }}
run: |
foreach ($f in Get-ChildItem dist) {
curl.exe -fsS -X POST -H "Authorization: token $env:TOKEN" `
-F "attachment=@$($f.FullName)" "$env:API/releases/$env:RELEASE_ID/assets?name=$($f.Name)" | Out-Null
if ($LASTEXITCODE) { throw "Не удалось загрузить $($f.Name)" }
"Загружен $($f.Name)"
}
- name: Артефакты прогона
if: env.RELEASE_ID == ''
uses: actions/upload-artifact@v4
with:
name: windows
path: dist/
build-macos:
needs: create-release
runs-on: macos
env:
VERSION: ${{ needs.create-release.outputs.version }}
RELEASE_ID: ${{ needs.create-release.outputs.release_id }}
outputs:
sums: ${{ steps.pack.outputs.sums }}
steps:
- uses: actions/checkout@v4
- name: Сборка (universal, arm64 + x86_64)
run: |
export PATH="$QT_TOOLS/CMake/CMake.app/Contents/bin:$QT_TOOLS/Ninja:$PATH"
rm -rf build stage dist dmgroot
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH="$QT_ROOT" \
-DCMAKE_OSX_ARCHITECTURES="arm64;x86_64"
cmake --build build
cmake --install build --prefix "$PWD/stage"
- id: pack
name: Ad-hoc подпись и DMG
run: |
# Без Developer ID: ad-hoc подпись нужна, чтобы приложение вообще
# запускалось на Apple Silicon; Gatekeeper всё равно спросит подтверждение.
codesign --force --deep --sign - stage/BiLauncher.app
codesign --verify --deep --strict stage/BiLauncher.app
mkdir -p dmgroot dist
cp -R stage/BiLauncher.app dmgroot/
ln -s /Applications dmgroot/Applications
hdiutil create -volname "BiLauncher" -srcfolder dmgroot -ov -format UDZO \
"dist/BiLauncher-$VERSION-macOS-universal.dmg"
rm -rf dmgroot
ls -lh dist
echo "sums=$(cd dist && shasum -a 256 * | base64 | tr -d '\n')" >> "$GITHUB_OUTPUT"
- name: Загрузка в релиз
if: env.RELEASE_ID != ''
env:
TOKEN: ${{ secrets.RELEASE_TOKEN }}
run: |
for f in dist/*; do
curl -fsS -X POST -H "Authorization: token $TOKEN" \
-F "attachment=@$f" "$API/releases/$RELEASE_ID/assets?name=$(basename "$f")" > /dev/null
echo "Загружен $(basename "$f")"
done
- name: Артефакты прогона
if: env.RELEASE_ID == ''
uses: actions/upload-artifact@v4
with:
name: macos
path: dist/
publish:
needs: [create-release, build-linux, build-windows, build-macos]
if: needs.create-release.outputs.release_id != ''
runs-on: linux
env:
RELEASE_ID: ${{ needs.create-release.outputs.release_id }}
TOKEN: ${{ secrets.RELEASE_TOKEN }}
steps:
- name: SHA256SUMS.txt и публикация
run: |
{
echo "${{ needs.build-windows.outputs.sums }}" | base64 -d
echo "${{ needs.build-linux.outputs.sums }}" | base64 -d
echo "${{ needs.build-macos.outputs.sums }}" | base64 -d
} | tr -d '\r' | sed '/^$/d' > SHA256SUMS.txt
cat SHA256SUMS.txt
curl -fsS -X POST -H "Authorization: token $TOKEN" \
-F "attachment=@SHA256SUMS.txt" "$API/releases/$RELEASE_ID/assets?name=SHA256SUMS.txt" > /dev/null
curl -fsS -X PATCH -H "Authorization: token $TOKEN" -H "Content-Type: application/json" \
-d '{"draft": false}' "$API/releases/$RELEASE_ID" > /dev/null
echo "Релиз опубликован"
+4 -5
View File
@@ -70,12 +70,8 @@ qt_add_resources(BiLauncher "appicon"
icons/icon_512x512@2x.png
)
# OUTPUT_DIRECTORY: по умолчанию модуль с URI BiLauncher кладёт qmldir в
# ${CMAKE_BINARY_DIR}/BiLauncher — на Linux это имя занято самим исполняемым
# файлом (у него нет расширения), и линковка падает с «Is a directory».
qt_add_qml_module(BiLauncher
URI BiLauncher
OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/qml/BiLauncher"
SOURCES
localization.h
localization.cpp
@@ -131,9 +127,12 @@ qt_add_qml_module(BiLauncher
${LAUNCHER_MSA_QML_FILES}
RESOURCES images/Folder/Folder_Active.svg images/Folder/Folder_Idle.svg images/Folder/Folder_Pressed.svg images/Options/Options_active.svg images/Options/Options_Idle.svg images/Options/Options_Pressed.svg images/Play_Button/Play_Active.svg images/Play_Button/Play_Idle.svg images/Play_Button/Play_pressed.svg images/Profile_Box/Asset_23.jpg images/Profile_Box/Asset_23.svg images/Profile_Box/Asset_24.jpg images/Profile_Box/Asset_24.svg images/Profile_Box/Kishka_Profile_Active.svg images/Profile_Box/Kishka_Profile_Idle.svg images/Profile_Box/Kishka_Profile_open.svg images/Scroll/Scroll_Lever.svg images/Scroll/Scroll_palka.svg images/Version_box/Kishka_Profile_Open.svg images/Version_box/Kishka_Ver_Active.svg images/Version_box/Kishka_Ver_idle.svg images/Trash.svg images/Pencil.svg images/GovuztTW8AAHqBf.jpeg images/photo_2025-12-16_15-04-17.jpg images/photo_2025-12-21_02-30-09.jpg i18n/translations.json
RESOURCES images/launcherBackground.png
RESOURCES images/launcherBackground2static.jpg
RESOURCES images/launcherBackground2.mp4 images/launcherBackground2static.jpg
RESOURCES CHANGELOG.md
RESOURCES LICENSE
RESOURCES icons/icon.rc
RESOURCES icons/icon.rc.in
RESOURCES icons/icon.rc
RESOURCES README.md
)
-105
View File
@@ -1,105 +0,0 @@
#!/usr/bin/env bash
# Подготовка Linux-раннера Gitea Actions для сборки BiLauncher (Ubuntu 22.04).
#
# Qt (~/Qt/6.11.1/gcc_64 с WebEngine), CMake и Ninja (~/Qt/Tools) ставятся заранее
# через Qt Online Installer — скрипт их не трогает, а докачивает только то, чего Qt
# не даёт: компилятор, системные библиотеки для сборки и деплоя, Node.js (для
# actions/checkout), appimagetool и сам gitea-runner. Повторный запуск безопасен.
#
# Запуск от пользователя, которому принадлежит Qt (нужен sudo без пароля):
# ./setup-runner-linux.sh [токен регистрации]
set -euo pipefail
TOKEN="${1:-}"
INSTANCE="${INSTANCE:-https://projects-live.galeonworx.com}"
RUNNER_NAME="${RUNNER_NAME:-linux-vm}"
RUNNER_VERSION="${RUNNER_VERSION:-4.1.0}"
QT_ROOT="${QT_ROOT:-$HOME/Qt/6.11.1/gcc_64}"
QT_TOOLS="${QT_TOOLS:-$HOME/Qt/Tools}"
RDIR="$HOME/act_runner"
[ -d "$QT_ROOT/lib/cmake/Qt6WebEngineQuick" ] || { echo "Нет Qt с WebEngine в $QT_ROOT" >&2; exit 1; }
# --- Компилятор и библиотеки ---------------------------------------------------
# libgl1-mesa-dev — заголовки OpenGL для Qt6::Gui; xcb-* и прочие — то, что
# Linux-деплой Qt и плагин xcb ищут при упаковке и запуске; libfuse2 — для
# запуска самого appimagetool (он тоже AppImage).
sudo apt-get update -q
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -q \
build-essential patchelf file curl git xz-utils \
libgl1-mesa-dev libfuse2 libfontconfig1 libdbus-1-3 \
libxkbcommon-x11-0 libxcb-cursor0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 \
libxcb-render-util0 libxcb-shape0 libxcb-xinerama0 libxcb-xkb1 \
libnss3 libxcomposite1 libxdamage1 libxrandr2 libxtst6 libxkbfile1 libxshmfence1 libasound2
# --- Node.js LTS ---------------------------------------------------------------
if ! command -v node >/dev/null; then
NODE_VER=$(curl -fsSL https://nodejs.org/dist/index.json \
| python3 -c 'import json,sys; print(next(r["version"] for r in json.load(sys.stdin) if r["lts"]))')
curl -fsSL "https://nodejs.org/dist/$NODE_VER/node-$NODE_VER-linux-x64.tar.xz" -o /tmp/node.tar.xz
sudo rm -rf /opt/node && sudo mkdir -p /opt/node
sudo tar -xJf /tmp/node.tar.xz -C /opt/node --strip-components=1
sudo ln -sf /opt/node/bin/node /opt/node/bin/npm /opt/node/bin/npx /usr/local/bin/
fi
# --- appimagetool ----------------------------------------------------------------
if ! command -v appimagetool >/dev/null; then
sudo curl -fsSL -o /usr/local/bin/appimagetool \
https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
sudo chmod +x /usr/local/bin/appimagetool
fi
# --- gitea-runner ------------------------------------------------------------------
mkdir -p "$RDIR/work"
if [ ! -x "$RDIR/gitea-runner" ]; then
curl -fsSL -o "$RDIR/gitea-runner" \
"https://gitea.com/gitea/runner/releases/download/v$RUNNER_VERSION/gitea-runner-$RUNNER_VERSION-linux-amd64"
chmod +x "$RDIR/gitea-runner"
fi
cat > "$RDIR/config.yaml" <<EOF
log:
level: info
runner:
file: $RDIR/.runner
capacity: 1
timeout: 3h
fetch_timeout: 5s
fetch_interval: 2s
envs:
QT_ROOT: $QT_ROOT
QT_TOOLS: $QT_TOOLS
labels:
- "linux:host"
cache:
enabled: false
host:
workdir_parent: $RDIR/work
EOF
if [ -n "$TOKEN" ] && [ ! -f "$RDIR/.runner" ]; then
(cd "$RDIR" && ./gitea-runner register --no-interactive --instance "$INSTANCE" \
--token "$TOKEN" --name "$RUNNER_NAME" --labels "linux:host" --config config.yaml)
fi
# --- systemd: раннер работает от владельца Qt, а не от root ------------------------
sudo tee /etc/systemd/system/gitea-runner.service >/dev/null <<EOF
[Unit]
Description=Gitea Actions runner (BiLauncher)
After=network-online.target
Wants=network-online.target
[Service]
User=$USER
WorkingDirectory=$RDIR
Environment=PATH=/usr/local/bin:/usr/bin:/bin
ExecStart=$RDIR/gitea-runner daemon --config $RDIR/config.yaml
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now gitea-runner
echo "Готово: $(systemctl is-active gitea-runner)"
-143
View File
@@ -1,143 +0,0 @@
# Подготовка Windows-раннера Gitea Actions для сборки BiLauncher.
#
# Qt (C:\Qt\6.11.1\msvc2022_64 с WebEngine), CMake и Ninja (C:\Qt\Tools) ставятся
# заранее через Qt Online Installer — скрипт их не трогает, а докачивает только то,
# чего Qt не даёт: компилятор MSVC, git, Node.js (для actions/checkout), Inno Setup
# и сам gitea-runner. Повторный запуск безопасен: уже установленное пропускается.
#
# Запуск (PowerShell от администратора):
# powershell -ExecutionPolicy Bypass -File setup-runner-windows.ps1 [-Token <токен регистрации>]
param(
[string]$Token = "",
[string]$Instance = "https://projects-live.galeonworx.com",
[string]$RunnerName = "win-vm",
[string]$RunnerVersion = "4.1.0",
[string]$QtRoot = "C:\Qt\6.11.1\msvc2022_64",
[string]$QtTools = "C:\Qt\Tools"
)
$ErrorActionPreference = "Stop"
$ProgressPreference = "SilentlyContinue" # иначе Invoke-WebRequest падает без консоли (по SSH)
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$dl = "C:\ci-downloads"
New-Item -ItemType Directory -Force -Path $dl | Out-Null
function Fetch($url, $name) {
$out = Join-Path $dl $name
if (-not (Test-Path $out)) {
Write-Host "Скачиваю $url"
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $out
}
return $out
}
function Run($exe, $argList) {
$p = Start-Process -FilePath $exe -ArgumentList $argList -Wait -PassThru -NoNewWindow
# 3010 — «успешно, нужна перезагрузка» у установщиков MSI и VS
if ($p.ExitCode -ne 0 -and $p.ExitCode -ne 3010) { throw "$exe завершился с кодом $($p.ExitCode)" }
}
# --- Visual Studio 2022 Build Tools (MSVC x64 + Windows SDK) -----------------
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$haveMsvc = (Test-Path $vswhere) -and
(& $vswhere -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath)
if (-not $haveMsvc) {
$vs = Fetch "https://aka.ms/vs/17/release/vs_BuildTools.exe" "vs_BuildTools.exe"
Write-Host "Ставлю VS 2022 Build Tools (20–40 минут)…"
Run $vs @("--quiet", "--wait", "--norestart", "--nocache",
"--add", "Microsoft.VisualStudio.Workload.VCTools", "--includeRecommended")
} else { Write-Host "MSVC уже установлен" }
# --- Git for Windows -----------------------------------------------------------
if (-not (Test-Path "C:\Program Files\Git\cmd\git.exe")) {
$rel = Invoke-RestMethod "https://api.github.com/repos/git-for-windows/git/releases/latest"
$asset = $rel.assets | Where-Object { $_.name -match '^Git-.*-64-bit\.exe$' } | Select-Object -First 1
$git = Fetch $asset.browser_download_url $asset.name
Run $git @("/VERYSILENT", "/NORESTART", "/NOCANCEL", "/SP-", "/COMPONENTS=gitlfs")
} else { Write-Host "Git уже установлен" }
# --- Node.js LTS (нужен JS-экшенам вроде actions/checkout) ---------------------
if (-not (Test-Path "C:\Program Files\nodejs\node.exe")) {
# Скобки вокруг Invoke-RestMethod обязательны: PowerShell 5.1 иначе отдаёт
# JSON-массив в конвейер одним объектом, и фильтр видит все версии сразу.
$lts = ((Invoke-RestMethod "https://nodejs.org/dist/index.json") | Where-Object { $_.lts } | Select-Object -First 1).version
$msi = Fetch "https://nodejs.org/dist/$lts/node-$lts-x64.msi" "node-$lts-x64.msi"
Run "msiexec.exe" @("/i", "`"$msi`"", "/qn", "/norestart")
} else { Write-Host "Node.js уже установлен" }
# --- Inno Setup ----------------------------------------------------------------
$iscc = Get-ChildItem "C:\Program Files*\Inno Setup*\ISCC.exe" -ErrorAction SilentlyContinue | Select-Object -First 1
if (-not $iscc) {
# jrsoftware.org/download.php без браузера отдаёт HTML — берём файл из релизов на GitHub
$rel = Invoke-RestMethod "https://api.github.com/repos/jrsoftware/issrc/releases/latest"
$asset = $rel.assets | Where-Object { $_.name -match '^innosetup-[\d.]+(-x64)?\.exe$' } |
Sort-Object { $_.name -notmatch '-x64' } | Select-Object -First 1
$is = Fetch $asset.browser_download_url $asset.name
Run $is @("/VERYSILENT", "/SUPPRESSMSGBOXES", "/NORESTART", "/ALLUSERS")
$iscc = Get-ChildItem "C:\Program Files*\Inno Setup*\ISCC.exe" | Select-Object -First 1
} else { Write-Host "Inno Setup уже установлен" }
# --- Длинные пути: дерево WebEngine легко вылезает за 260 символов --------------
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem -Name LongPathsEnabled -Value 1
& "C:\Program Files\Git\cmd\git.exe" config --system core.longpaths true
# --- gitea-runner ----------------------------------------------------------------
$rdir = "C:\act_runner"
New-Item -ItemType Directory -Force -Path $rdir, "C:\r" | Out-Null
$exe = Join-Path $rdir "gitea-runner.exe"
if (-not (Test-Path $exe)) {
$src = Fetch "https://gitea.com/gitea/runner/releases/download/v$RunnerVersion/gitea-runner-$RunnerVersion-windows-amd64.exe" "gitea-runner-$RunnerVersion.exe"
Copy-Item $src $exe
}
# Конфиг: host-режим, рабочая папка с коротким путём, пути к Qt через env.
$isccDir = Split-Path $iscc.FullName
$cfg = @"
log:
level: info
runner:
file: $($rdir -replace '\\','/')/.runner
capacity: 1
timeout: 3h
fetch_timeout: 5s
fetch_interval: 2s
envs:
QT_ROOT: '$QtRoot'
QT_TOOLS: '$QtTools'
ISCC_DIR: '$isccDir'
labels:
- "windows:host"
cache:
enabled: false
host:
workdir_parent: C:/r
"@
Set-Content -Path (Join-Path $rdir "config.yaml") -Value $cfg -Encoding UTF8
if ($Token -and -not (Test-Path (Join-Path $rdir ".runner"))) {
Push-Location $rdir
& $exe register --no-interactive --instance $Instance --token $Token `
--name $RunnerName --labels "windows:host" --config config.yaml
if ($LASTEXITCODE -ne 0) { throw "Регистрация раннера не удалась" }
Pop-Location
}
# Обёртка запуска: PATH дополняется git и node — задача планировщика может
# стартовать раньше, чем сессия получит обновлённый системный PATH.
$cmd = @"
@echo off
set PATH=C:\Program Files\Git\cmd;C:\Program Files\Git\usr\bin;C:\Program Files\nodejs;%PATH%
cd /d $rdir
gitea-runner.exe daemon --config config.yaml >> runner.log 2>&1
"@
Set-Content -Path (Join-Path $rdir "run-runner.cmd") -Value $cmd -Encoding ASCII
# Автозапуск при входе galeon: так задаче не нужен пароль учётной записи.
# Чтобы раннер поднимался и без входа, пересоздайте задачу с /sc onstart /rp *.
schtasks /create /f /tn "Gitea Runner" /sc onlogon /ru $env:USERNAME /it /rl highest `
/tr "powershell.exe -WindowStyle Hidden -NoProfile -Command $rdir\run-runner.cmd" | Out-Null
if (-not (Get-Process gitea-runner -ErrorAction SilentlyContinue)) { schtasks /run /tn "Gitea Runner" | Out-Null }
Write-Host "Готово. MSVC, git, node, Inno Setup и gitea-runner на месте."
BIN
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
IDI_ICON1 ICON "icon.ico"
-61
View File
@@ -1,61 +0,0 @@
BiLauncher — сторонние компоненты и их лицензии
================================================
Сам BiLauncher распространяется по Apache License 2.0 (см. файл LICENSE).
В дистрибутив входят следующие сторонние компоненты.
1. Qt 6.11 (The Qt Company Ltd.)
--------------------------------
Модули: Qt Core, Gui, Network, Qml, Quick, Quick Controls 2, Svg, WebEngine,
WebChannel, Positioning и их плагины.
Используются по лицензии GNU Lesser General Public License v3 (LGPLv3).
Библиотеки Qt подключены динамически и лежат в дистрибутиве отдельными файлами:
пользователь вправе заменить их своей сборкой Qt той же версии.
Текст LGPLv3: https://www.gnu.org/licenses/lgpl-3.0.html
Исходный код Qt: https://download.qt.io/official_releases/qt/6.11/
https://code.qt.io/cgit/qt/
Сведения о лицензиях: https://doc.qt.io/qt-6/licensing.html
2. Qt WebEngine / Chromium
--------------------------
Qt WebEngine основан на проекте Chromium и включает множество сторонних
библиотек под лицензиями BSD, MIT, LGPL, MPL и другими. Полный перечень:
https://doc.qt.io/qt-6/qtwebengine-licensing.html
Исходный код Qt WebEngine: https://code.qt.io/cgit/qt/qtwebengine.git/
3. zlib 1.3.1 (только сборка для Linux)
---------------------------------------
Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Jean-loup Gailly Mark Adler
jloup@gzip.org madler@alumni.caltech.edu
4. Inno Setup (только установщик для Windows)
---------------------------------------------
Установщик для Windows собран с помощью Inno Setup.
Copyright (C) 1997-2026 Jordan Russell, Martijn Laan. https://jrsoftware.org/
Лицензия: https://jrsoftware.org/files/is/license.txt
-65
View File
@@ -1,65 +0,0 @@
; Установщик BiLauncher для Windows (Inno Setup 6).
;
; Собирается в CI после `cmake --install`:
; iscc /DAppVersion=1.0.0 /DSourceDir=C:\...\stage /DOutputDir=C:\...\dist packaging\windows\BiLauncher.iss
; SourceDir — префикс установки: bin\ с BiLauncher.exe и развёрнутым windeployqt Qt,
; share\doc\BiLauncher\ с лицензиями.
#ifndef AppVersion
#error Передайте версию: /DAppVersion=X.Y.Z
#endif
#ifndef SourceDir
#error Передайте префикс установки: /DSourceDir=...
#endif
#ifndef OutputDir
#define OutputDir "."
#endif
[Setup]
; AppId не менять между версиями — по нему обновление находит прежнюю установку.
AppId={{6E0B5C1D-8F2A-4C7E-9B3D-2A1F4E5C7B90}
AppName=BiLauncher
AppVersion={#AppVersion}
AppVerName=BiLauncher {#AppVersion}
AppPublisher=GaleonDev
AppPublisherURL=https://projects-live.galeonworx.com/galeon/BiLauncher
AppSupportURL=https://projects-live.galeonworx.com/galeon/BiLauncher/issues
VersionInfoVersion={#AppVersion}
DefaultDirName={autopf}\BiLauncher
DefaultGroupName=BiLauncher
DisableProgramGroupPage=yes
LicenseFile={#SourceDir}\share\doc\BiLauncher\LICENSE
OutputDir={#OutputDir}
OutputBaseFilename=BiLauncher-{#AppVersion}-win64-setup
SetupIconFile=..\..\icons\icon.ico
UninstallDisplayIcon={app}\bin\BiLauncher.exe
Compression=lzma2/ultra64
SolidCompression=yes
LZMANumBlockThreads=4
ArchitecturesAllowed=x64compatible
ArchitecturesInstallIn64BitMode=x64compatible
PrivilegesRequiredOverridesAllowed=dialog
WizardStyle=modern
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
[Files]
Source: "{#SourceDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Excludes: "vc_redist.x64.exe"
#ifexist SourceDir + "\bin\vc_redist.x64.exe"
Source: "{#SourceDir}\bin\vc_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall
#endif
[Icons]
Name: "{autoprograms}\BiLauncher"; Filename: "{app}\bin\BiLauncher.exe"
Name: "{autodesktop}\BiLauncher"; Filename: "{app}\bin\BiLauncher.exe"; Tasks: desktopicon
[Run]
#ifexist SourceDir + "\bin\vc_redist.x64.exe"
Filename: "{tmp}\vc_redist.x64.exe"; Parameters: "/install /quiet /norestart"; StatusMsg: "Установка Microsoft Visual C++ Runtime..."; Flags: waituntilterminated
#endif
Filename: "{app}\bin\BiLauncher.exe"; Description: "{cm:LaunchProgram,BiLauncher}"; Flags: nowait postinstall skipifsilent
-1
View File
@@ -1,7 +1,6 @@
#include "zlibreference.h"
#include "localization.h"
#include <QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QProcessEnvironment>