Compare commits

..
3 Commits
Author SHA1 Message Date
mrleo1nidandCursor d3116aba96 perf(desktop): stop packing GStreamer into the AppImage
ci / ts / ts (packages + web) (push) Successful in 2m54s
release / release (версия и заметки) (push) Successful in 9s
release / android (APK в релиз) (push) Successful in 7m28s
ci / desktop / rust (desktop proxy) (push) Successful in 7m20s
release / desktop (Linux и Windows в релиз) (push) Successful in 12m56s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 01:30:01 +03:00
mrleo1nidandCursor b7518aa450 fix(web): keep the track title readable in the 320px player
ci / ts / ts (packages + web) (push) Successful in 3m20s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 00:50:34 +03:00
mrleo1nidandCursor eb8031b126 ci(release): cross-compile Windows NSIS on the Linux runner
ci / ts / ts (packages + web) (push) Failing after 1m41s
release / release (версия и заметки) (push) Successful in 7s
release / android (APK в релиз) (push) Successful in 6m0s
ci / desktop / rust (desktop proxy) (push) Successful in 10m12s
release / desktop (Linux и Windows в релиз) (push) Successful in 20m8s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 00:43:16 +03:00
7 changed files with 72 additions and 74 deletions

No files matched your search

+1 -1
View File
@@ -1,5 +1,5 @@
# Rust-часть десктопа: прокси и проверки URL. Установщики — в release.yml # Rust-часть десктопа: прокси и проверки URL. Установщики — в release.yml
# (Linux на ubuntu-latest, Windows NSIS на windows-latest). # (Linux AppImage/deb и Windows NSIS через cargo-xwin на ubuntu-latest).
name: ci / desktop name: ci / desktop
on: on:
+62 -69
View File
@@ -1,6 +1,7 @@
# Релиз по тегу vMAJOR.MINOR.PATCH[-rc.N]: Gitea Release с заметками → APK, Linux и Windows. # Релиз по тегу vMAJOR.MINOR.PATCH[-rc.N]: Gitea Release с заметками → APK, Linux и Windows.
# Релиз создаётся сразу (статусы Android/десктоп — «собирается»); сборки докладывают файлы # Релиз создаётся сразу (статусы Android/десктоп — «собирается»); сборки докладывают файлы
# и переписывают статус: собран / не удалась (scripts/release.mjs). # и переписывают статус: собран / не удалась (scripts/release.mjs).
# Один Ubuntu-раннер: сначала APK, потом десктоп (Linux native + Windows через cargo-xwin).
# Docker-образы не публикуются: сервер собирает их сам из клонированного репозитория (deploy/update.sh). # Docker-образы не публикуются: сервер собирает их сам из клонированного репозитория (deploy/update.sh).
# #
# Секреты (Settings → Actions → Secrets): # Секреты (Settings → Actions → Secrets):
@@ -198,10 +199,13 @@ jobs:
if: cancelled() if: cancelled()
run: node scripts/release.mjs android cancelled run: node scripts/release.mjs android cancelled
desktop-linux: # После Android: на одном хосте параллельный Tauri + Gradle валит раннер.
name: desktop (Linux в релиз) # Windows NSIS — cargo-xwin + makensis на этом же Ubuntu (виндового раннера нет).
needs: release desktop:
timeout-minutes: 60 name: desktop (Linux и Windows в релиз)
needs: [release, android]
if: always() && needs.release.result == 'success'
timeout-minutes: 90
runs-on: ubuntu-latest runs-on: ubuntu-latest
defaults: defaults:
run: run:
@@ -215,10 +219,14 @@ jobs:
VERSION: ${{ needs.release.outputs.version }} VERSION: ${{ needs.release.outputs.version }}
APPIMAGE_EXTRACT_AND_RUN: "1" APPIMAGE_EXTRACT_AND_RUN: "1"
CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
CARGO_BUILD_JOBS: "2"
XWIN_CACHE_DIR: /opt/ci-cache/xwin
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Статус в релизе — собирается - name: Статус в релизе — собирается
run: node scripts/release.mjs desktop linux building run: |
node scripts/release.mjs desktop linux building
node scripts/release.mjs desktop windows building
- name: Rust - name: Rust
run: | run: |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --profile minimal curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --profile minimal
@@ -227,7 +235,8 @@ jobs:
sudo apt-get update sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev build-essential curl wget file \ sudo apt-get install -y libwebkit2gtk-4.1-dev build-essential curl wget file \
libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev \ libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev \
libdbus-1-dev libsecret-1-dev patchelf libfuse2 libdbus-1-dev libsecret-1-dev patchelf libfuse2 \
nsis lld llvm clang
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: { node-version: "${{ env.NODE_VERSION }}", cache: pnpm } with: { node-version: "${{ env.NODE_VERSION }}", cache: pnpm }
@@ -237,10 +246,12 @@ jobs:
~/.cargo/registry/index ~/.cargo/registry/index
~/.cargo/registry/cache ~/.cargo/registry/cache
~/.cargo/git/db ~/.cargo/git/db
~/.cargo/bin/cargo-xwin
key: cargo-desktop-${{ hashFiles('apps/desktop/src-tauri/Cargo.toml') }} key: cargo-desktop-${{ hashFiles('apps/desktop/src-tauri/Cargo.toml') }}
restore-keys: cargo-desktop- restore-keys: cargo-desktop-
- run: pnpm install --frozen-lockfile - run: pnpm install --frozen-lockfile
- name: Сборка AppImage и deb - name: Сборка AppImage и deb
id: linux
working-directory: apps/desktop working-directory: apps/desktop
run: | run: |
set -euo pipefail set -euo pipefail
@@ -254,7 +265,9 @@ jobs:
cp "$f" "$GITHUB_WORKSPACE/pipu-music-${PIPU_VERSION}-linux.deb" cp "$f" "$GITHUB_WORKSPACE/pipu-music-${PIPU_VERSION}-linux.deb"
done done
ls -lh "$GITHUB_WORKSPACE"/pipu-music-${PIPU_VERSION}-linux.* ls -lh "$GITHUB_WORKSPACE"/pipu-music-${PIPU_VERSION}-linux.*
- name: Файлы в релиз rm -rf src-tauri/target/release
- name: Linux в релиз
id: linux-upload
run: | run: |
set -euo pipefail set -euo pipefail
files=() files=()
@@ -266,72 +279,52 @@ jobs:
exit 1 exit 1
fi fi
node scripts/release.mjs desktop linux success "${files[@]}" node scripts/release.mjs desktop linux success "${files[@]}"
- name: Статус в релизе — сборка не удалась - name: Windows toolchain
if: failure() if: ${{ !cancelled() }}
run: node scripts/release.mjs desktop linux failure
- name: Статус в релизе — сборка отменена
if: cancelled()
run: node scripts/release.mjs desktop linux cancelled
# Нужен act_runner с меткой windows-latest (Windows + MSVC Build Tools + WebView2).
# Без такого раннера job останется в очереди; Tauri не кросс-компилирует NSIS с Linux.
desktop-windows:
name: desktop (Windows в релиз)
needs: release
timeout-minutes: 60
runs-on: windows-latest
defaults:
run:
shell: pwsh
env:
PIPU_VERSION: ${{ needs.release.outputs.version }}
GITEA_API: ${{ github.server_url }}/api/v1/repos/${{ github.repository }}
GITEA_TOKEN: ${{ secrets.RELEASE_TOKEN || secrets.GITHUB_TOKEN }}
PUBLIC_URL: ${{ vars.PUBLIC_URL || 'https://gitea.hsrv.site' }}
TAG: ${{ github.ref_name }}
VERSION: ${{ needs.release.outputs.version }}
CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with: { node-version: "${{ env.NODE_VERSION }}", cache: pnpm }
- name: Статус в релизе — собирается
run: node scripts/release.mjs desktop windows building
- uses: ilammy/msvc-dev-cmd@v1
- name: Rust
run: | run: |
$init = Join-Path $env:TEMP 'rustup-init.exe' set -euo pipefail
Invoke-WebRequest -Uri 'https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe' -OutFile $init rustup target add x86_64-pc-windows-msvc
& $init -y --default-toolchain stable --profile minimal --default-host x86_64-pc-windows-msvc --no-modify-path if ! command -v cargo-xwin >/dev/null; then
Add-Content -Path $env:GITHUB_PATH -Value "$env:USERPROFILE\.cargo\bin" cargo install --locked cargo-xwin
- uses: actions/cache@v4 fi
with: if [ ! -d /opt/ci-cache ]; then
path: | echo "XWIN_CACHE_DIR=$HOME/.cache/xwin" >> "$GITHUB_ENV"
~/.cargo/registry/index mkdir -p "$HOME/.cache/xwin"
~/.cargo/registry/cache else
~/.cargo/git/db mkdir -p /opt/ci-cache/xwin
key: cargo-desktop-windows-${{ hashFiles('apps/desktop/src-tauri/Cargo.toml') }} fi
restore-keys: cargo-desktop-windows-
- run: pnpm install --frozen-lockfile
- name: Сборка NSIS - name: Сборка NSIS
id: win
if: ${{ !cancelled() }}
working-directory: apps/desktop working-directory: apps/desktop
run: | run: |
pnpm bundle:windows set -euo pipefail
$bundle = Join-Path (Get-Location) 'src-tauri/target/release/bundle/nsis' pnpm bundle:windows:cross
$src = Get-ChildItem -Path $bundle -Filter '*-setup.exe' | Select-Object -First 1 bundle=src-tauri/target/x86_64-pc-windows-msvc/release/bundle/nsis
if (-not $src) { throw "нет NSIS setup.exe после сборки в $bundle" } shopt -s nullglob
$dest = Join-Path $env:GITHUB_WORKSPACE "pipu-music-$env:PIPU_VERSION-windows-setup.exe" copied=
Copy-Item $src.FullName $dest for f in "$bundle"/*-setup.exe; do
Get-Item $dest | Format-List Name, Length cp "$f" "$GITHUB_WORKSPACE/pipu-music-${PIPU_VERSION}-windows-setup.exe"
- name: Файл в релиз copied=1
run: | done
$file = "pipu-music-$env:PIPU_VERSION-windows-setup.exe" if [ -z "$copied" ]; then
if (-not (Test-Path $file)) { throw "нет $file после сборки" } echo "::error::нет NSIS setup.exe после сборки в $bundle"
node scripts/release.mjs desktop windows success $file ls -la "$bundle" || true
- name: Статус в релизе — сборка не удалась exit 1
if: failure() fi
ls -lh "$GITHUB_WORKSPACE/pipu-music-${PIPU_VERSION}-windows-setup.exe"
- name: Windows в релиз
id: win-upload
if: ${{ !cancelled() && steps.win.outcome == 'success' }}
run: node scripts/release.mjs desktop windows success "pipu-music-${PIPU_VERSION}-windows-setup.exe"
- name: Статус Linux — сборка не удалась
if: failure() && steps.linux-upload.outcome != 'success'
run: node scripts/release.mjs desktop linux failure
- name: Статус Windows — сборка не удалась
if: failure() && steps.win-upload.outcome != 'success'
run: node scripts/release.mjs desktop windows failure run: node scripts/release.mjs desktop windows failure
- name: Статус в релизе — сборка отменена - name: Статус в релизе — сборка отменена
if: cancelled() if: cancelled()
run: node scripts/release.mjs desktop windows cancelled run: |
node scripts/release.mjs desktop linux cancelled
node scripts/release.mjs desktop windows cancelled
+1
View File
@@ -8,6 +8,7 @@
"bundle": "node inject-version.mjs && tauri build --config src-tauri/tauri.release.json", "bundle": "node inject-version.mjs && tauri build --config src-tauri/tauri.release.json",
"bundle:linux": "node inject-version.mjs && tauri build --config src-tauri/tauri.release.json --bundles appimage,deb", "bundle:linux": "node inject-version.mjs && tauri build --config src-tauri/tauri.release.json --bundles appimage,deb",
"bundle:windows": "node inject-version.mjs && tauri build --config src-tauri/tauri.release.json --bundles nsis", "bundle:windows": "node inject-version.mjs && tauri build --config src-tauri/tauri.release.json --bundles nsis",
"bundle:windows:cross": "node inject-version.mjs && tauri build --config src-tauri/tauri.release.json --runner cargo-xwin --target x86_64-pc-windows-msvc --bundles nsis",
"tauri": "tauri", "tauri": "tauri",
"icons": "tauri icon ../web/public/favicon.svg" "icons": "tauri icon ../web/public/favicon.svg"
}, },
+3 -1
View File
@@ -38,5 +38,7 @@ keyring = { version = "3.6.3", features = ["apple-native"] }
[profile.release] [profile.release]
strip = true strip = true
lto = "thin" lto = true
codegen-units = 1 codegen-units = 1
opt-level = "s"
panic = "abort"
+1 -1
View File
@@ -24,7 +24,7 @@
"icon": ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.ico", "icons/icon.icns"], "icon": ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.ico", "icons/icon.icns"],
"linux": { "linux": {
"deb": { "depends": ["libwebkit2gtk-4.1-0", "libayatana-appindicator3-1", "libsecret-1-0", "gstreamer1.0-plugins-good", "gstreamer1.0-plugins-bad", "gstreamer1.0-libav"] }, "deb": { "depends": ["libwebkit2gtk-4.1-0", "libayatana-appindicator3-1", "libsecret-1-0", "gstreamer1.0-plugins-good", "gstreamer1.0-plugins-bad", "gstreamer1.0-libav"] },
"appimage": { "bundleMediaFramework": true } "appimage": { "bundleMediaFramework": false }
}, },
"windows": { "nsis": { "installMode": "currentUser", "languages": ["English", "Russian"], "displayLanguageSelector": true } } "windows": { "nsis": { "installMode": "currentUser", "languages": ["English", "Russian"], "displayLanguageSelector": true } }
} }
@@ -318,6 +318,8 @@ a.source:hover {
@media (max-width: 359px) { @media (max-width: 359px) {
.now > :first-child { display: none; } .now > :first-child { display: none; }
/* share + очередь + три кнопки управления не оставляют месту название трека (e2e 320px). */
.shareButton { display: none; }
} }
.shareStatus { .shareStatus {
+2 -2
View File
@@ -12,6 +12,6 @@ pnpm --filter @pipu/desktop dev
pnpm --filter @pipu/desktop bundle pnpm --filter @pipu/desktop bundle
``` ```
На Windows получается NSIS-установщик, на Linux — AppImage, deb и rpm. Зависимости Linux: WebKitGTK 4.1, AppIndicator, libsecret, GStreamer. На Windows получается NSIS-установщик, на Linux — AppImage, deb и rpm. Зависимости Linux: WebKitGTK 4.1, AppIndicator, libsecret, GStreamer (плеер идёт через WebKit, в AppImage GStreamer не упаковываем — иначе файл раздувается на десятки мегабайт).
Релиз по тегу прикладывает Linux AppImage/`.deb` (`pipu-music-<версия>-linux.*`) и Windows NSIS (`pipu-music-<версия>-windows-setup.exe`). Windows-job в `release.yml` ждёт act_runner с меткой `windows-latest` (MSVC + WebView2). Страница `/download` на сервере отдаёт те файлы, что есть в последнем релизе Gitea. Релиз по тегу собирает всё на Linux-раннере: AppImage/`.deb` и Windows NSIS через `cargo-xwin` (`pipu-music-<версия>-windows-setup.exe`). Подпись Windows-установщика на Linux нет. Страница `/download` на сервере отдаёт те файлы, что есть в последнем релизе Gitea.