From 8a3d0596ef835d335620cdd18a203c9b5b6c1f0d Mon Sep 17 00:00:00 2001 From: galeon Date: Thu, 8 Oct 2026 19:44:41 +0300 Subject: [PATCH] ci\cd --- .gitea/workflows/release.yml | 278 +++++++++++++++++++++++++++++ CMakeLists.txt | 9 +- ci/setup-runner-linux.sh | 105 +++++++++++ ci/setup-runner-windows.ps1 | 143 +++++++++++++++ doc/.DS_Store | Bin 8196 -> 0 bytes icons/icon.rc | 1 - packaging/THIRD_PARTY_LICENSES.txt | 61 +++++++ packaging/windows/BiLauncher.iss | 65 +++++++ zlibreference.cpp | 1 + 9 files changed, 658 insertions(+), 5 deletions(-) create mode 100644 .gitea/workflows/release.yml create mode 100755 ci/setup-runner-linux.sh create mode 100644 ci/setup-runner-windows.ps1 delete mode 100644 doc/.DS_Store delete mode 100644 icons/icon.rc create mode 100644 packaging/THIRD_PARTY_LICENSES.txt create mode 100644 packaging/windows/BiLauncher.iss diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..3325c16 --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,278 @@ +# Сборка 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 "Релиз опубликован" diff --git a/CMakeLists.txt b/CMakeLists.txt index bc3eee2..d0fdea7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,8 +70,12 @@ 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 @@ -127,12 +131,9 @@ 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/launcherBackground2.mp4 images/launcherBackground2static.jpg + RESOURCES images/launcherBackground2static.jpg RESOURCES CHANGELOG.md RESOURCES LICENSE - RESOURCES icons/icon.rc - RESOURCES icons/icon.rc.in - RESOURCES icons/icon.rc RESOURCES README.md ) diff --git a/ci/setup-runner-linux.sh b/ci/setup-runner-linux.sh new file mode 100755 index 0000000..43c2133 --- /dev/null +++ b/ci/setup-runner-linux.sh @@ -0,0 +1,105 @@ +#!/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" </dev/null <] + +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 на месте." diff --git a/doc/.DS_Store b/doc/.DS_Store deleted file mode 100644 index f61d26f9cb3b4a6a892e1672099d3486c9e94cca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMTWl0n7(U-@p)+=%(^{a*#V#xt#Rgg~S`@H15DHkr_6}NhcZPQC?98&Wy9FAO z5@Qs+JQy{;0a0I!Azn}(42nJ&5@U#_A)!WN6b(7dR#0uU@B zve#&=@d3ez59@t6EFf{HL8uZGs_>5(5b8va_;U3=92QWhGx&!O_-}@PLV@>ovLErp z8R`WL`XB;91a6D~Kf8xmlBHQXF*yGGZkcYjrsh1PP|=jB#l=c-N%51herGV2jc0Ri zV?48yV{MLOB?{wsqQf)>d$o!t$Iix0+sJqdrf!hPu1?d|oxw&YXX~z~8xssgk(FL; z*3i(371fc4YYtXNhH7hS>#8Glt5+U8sK_&-%OBm*J7A@3=dhSR{5610o8-@t>&{qx zwXvj=64wx+H)_Ul+XNUU z3EiGC^5kP@(y?+W+wIlLl5s1Uv*KB!!Lqn8(MsK9#<8sJj%#L3$L{XR8vC*ZLlanC zJ+70;b4}gjgzpP4l;xeA-jp$@7i4uw z_yI+W%WWMySWQZG^cJ(Z_sr^m&t=Ntvnpw+#<``w>@ru zJY%#DQc4!+Psp`!);T|)>eW?&{N z5yk>Uu?UN?5^J#z>(PQ3+R%Yc?1F(k=!Xd#gV=`y7{VbO!3%f^FXMF_#W5VmJNOVM z@i9)}OPs?6jN&_7#4q?2m+(9O!c|<8G$}02mgY#yq~%hb)F8D;tYcLJxL&Io(GY{WJ!UMV_*HKjrl^coxs$ zc^t+oconaCxqTdO;w`+56L=5r;{$wx)A$T$@HxJ~R~W(f_z6Ex%HeGja~PMe=Wxnt zZuW1j`A^7mMGMb1jOXhAz)km$+hmG%lUkuN^0ACjjSaTyy zzp&*`_Jl7g5qfsh!yA_y7SL0n&Rcf~ddG2sV}BUZI6|Uar{0Id0uqJVe|`~g)1T78 O{vYiBUe4Y%`~Tmg6R?H= diff --git a/icons/icon.rc b/icons/icon.rc deleted file mode 100644 index 14d43bd..0000000 --- a/icons/icon.rc +++ /dev/null @@ -1 +0,0 @@ -IDI_ICON1 ICON "icon.ico" \ No newline at end of file diff --git a/packaging/THIRD_PARTY_LICENSES.txt b/packaging/THIRD_PARTY_LICENSES.txt new file mode 100644 index 0000000..095b223 --- /dev/null +++ b/packaging/THIRD_PARTY_LICENSES.txt @@ -0,0 +1,61 @@ +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 diff --git a/packaging/windows/BiLauncher.iss b/packaging/windows/BiLauncher.iss new file mode 100644 index 0000000..6a1f83f --- /dev/null +++ b/packaging/windows/BiLauncher.iss @@ -0,0 +1,65 @@ +; Установщик 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 diff --git a/zlibreference.cpp b/zlibreference.cpp index 3ed15f2..aec7415 100644 --- a/zlibreference.cpp +++ b/zlibreference.cpp @@ -1,6 +1,7 @@ #include "zlibreference.h" #include "localization.h" +#include #include #include #include