mirror of
https://github.com/jstrdev/ps5directo.git
synced 2026-10-28 20:01:22 +01:00
213 lines
8.8 KiB
YAML
213 lines
8.8 KiB
YAML
# Publica una version: al subir una etiqueta vX.Y.Z (o con "Run workflow" en Actions) crea o rehace
|
|
# la release de GitHub con:
|
|
# - PS5Directo-X.Y.Z-Setup.exe el instalador: doble clic, «Instalar» y listo. Es la descarga normal.
|
|
# - PS5Directo-X.Y.Z-Windows.zip lo mismo sin instalar (con Python incluido). Tambien lo usa
|
|
# «Actualizar» dentro del programa, que solo copia los archivos.
|
|
# - PS5Directo-X.Y.Z-Linux.tar.gz Linux x86-64, con Python y 7-Zip incluidos (se abre con ps5directo.sh).
|
|
# - PS5Directo-X.Y.Z-macOS.dmg Mac (Apple Silicon e Intel), en pruebas: la app con Python y 7-Zip.
|
|
name: Publicar version
|
|
|
|
on:
|
|
push:
|
|
tags: ["v*"]
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: write
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
ver: ${{ steps.v.outputs.ver }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Version de app.py
|
|
id: v
|
|
run: echo "ver=$(grep -m1 -oP '^VERSION = "\K[^"]+' app.py)" >> "$GITHUB_OUTPUT"
|
|
|
|
- name: La etiqueta tiene que coincidir con la version
|
|
if: startsWith(github.ref, 'refs/tags/')
|
|
run: test "${GITHUB_REF_NAME#v}" = "${{ steps.v.outputs.ver }}"
|
|
|
|
- name: Archivos del programa
|
|
run: |
|
|
mkdir -p dist/PS5Directo
|
|
git archive HEAD | tar -x -C dist/PS5Directo
|
|
rm -rf dist/PS5Directo/.github dist/PS5Directo/installer
|
|
|
|
- name: Python incluido
|
|
run: |
|
|
PY=3.12.10
|
|
curl -fsSL -o py.zip "https://www.python.org/ftp/python/$PY/python-$PY-embed-amd64.zip"
|
|
mkdir -p dist/PS5Directo/python
|
|
unzip -q py.zip -d dist/PS5Directo/python
|
|
# que el Python incluido vea la carpeta del programa
|
|
for f in dist/PS5Directo/python/python*._pth; do printf '..\n' >> "$f"; done
|
|
|
|
- name: Zip para Windows
|
|
run: (cd dist && zip -qr "PS5Directo-${{ steps.v.outputs.ver }}-Windows.zip" PS5Directo)
|
|
|
|
# Linux (x86-64): la app con Python y 7-Zip incluidos. Se abre con ps5directo.sh y la primera
|
|
# vez se añade sola al menu de aplicaciones.
|
|
- name: Paquete para Linux
|
|
env:
|
|
GH_TOKEN: ${{ github.token }}
|
|
run: |
|
|
set -e
|
|
L=build/linux/PS5Directo
|
|
mkdir -p "$L"
|
|
git archive HEAD | tar -x -C "$L"
|
|
rm -rf "$L/.github" "$L/installer" "$L"/*.bat "$L"/*.vbs
|
|
chmod +x "$L/ps5directo.sh"
|
|
PBS=20250604; PYV=3.12.11
|
|
curl -fsSL -o pyl.tgz "https://github.com/astral-sh/python-build-standalone/releases/download/$PBS/cpython-$PYV+$PBS-x86_64-unknown-linux-gnu-install_only_stripped.tar.gz"
|
|
tar -xzf pyl.tgz -C "$L"
|
|
P="$L/python/lib/python3.12"
|
|
rm -rf "$P/test" "$P/idlelib" "$P/ensurepip" "$P/lib2to3" "$P/pydoc_data" "$P/turtledemo" \
|
|
"$P"/site-packages/pip* "$P/tkinter/test" "$L/python/share" "$L/python/include"
|
|
find "$L/python" -name __pycache__ -prune -exec rm -rf {} +
|
|
"$L/python/bin/python3" -c "import ssl, sqlite3, ftplib, tkinter, lzma, bz2, ctypes; print('python ok')"
|
|
url=$(gh api repos/ip7z/7zip/releases/latest --jq '.assets[] | select(.name | test("linux-x64\\.tar\\.xz$")) | .browser_download_url' | head -1)
|
|
mkdir -p "$L/bin" sz
|
|
curl -fsSL -o sz.tar.xz "$url"
|
|
tar -xJf sz.tar.xz -C sz
|
|
cp sz/7zz "$L/bin/7zz"
|
|
chmod +x "$L/bin/7zz"
|
|
(cd build/linux && tar -czf "../../dist/PS5Directo-${{ steps.v.outputs.ver }}-Linux.tar.gz" PS5Directo)
|
|
ls -la dist
|
|
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: dist
|
|
path: dist/
|
|
retention-days: 3
|
|
|
|
setup:
|
|
needs: build
|
|
runs-on: windows-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
name: dist
|
|
path: dist
|
|
|
|
- name: Instalador (Inno Setup)
|
|
shell: pwsh
|
|
run: |
|
|
$iscc = Join-Path ${env:ProgramFiles(x86)} 'Inno Setup 6\ISCC.exe'
|
|
if (-not (Test-Path $iscc)) { choco install innosetup -y --no-progress | Out-Null }
|
|
& $iscc /Q "/DMyVer=${{ needs.build.outputs.ver }}" installer\PS5Directo.iss
|
|
if ($LASTEXITCODE -ne 0) { exit 1 }
|
|
Get-ChildItem dist\*.exe, dist\*.zip | Format-Table Name, Length
|
|
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: setup
|
|
path: dist/PS5Directo-*-Setup.exe
|
|
retention-days: 3
|
|
|
|
# Mac: "PS5 Directo.app" con Python para Apple Silicon e Intel y 7-Zip, dentro de un .dmg.
|
|
# El lanzador (installer/macos/launcher.sh) copia el programa a ~/Library/Application Support
|
|
# para que «Actualizar» funcione. Firmada solo "ad hoc" (sin cuenta de desarrollador de Apple).
|
|
mac:
|
|
needs: build
|
|
runs-on: macos-latest
|
|
env:
|
|
VER: ${{ needs.build.outputs.ver }}
|
|
GH_TOKEN: ${{ github.token }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Montar la app
|
|
run: |
|
|
set -e
|
|
A="build/PS5 Directo.app"; C="$A/Contents"; R="$C/Resources"
|
|
mkdir -p "$C/MacOS" "$R/app" "$R/bin"
|
|
git archive HEAD | tar -x -C "$R/app"
|
|
rm -rf "$R/app/.github" "$R/app/installer" "$R/app"/*.bat "$R/app"/*.vbs "$R/app/ps5directo.sh"
|
|
cp installer/macos/launcher.sh "$C/MacOS/PS5 Directo"
|
|
chmod +x "$C/MacOS/PS5 Directo"
|
|
sed "s/__VERSION__/$VER/g" installer/macos/Info.plist > "$C/Info.plist"
|
|
plutil -lint "$C/Info.plist"
|
|
# icono
|
|
mkdir -p ps5.iconset
|
|
for s in 16 32 128 256 512; do
|
|
sips -z $s $s web/icon-512.png --out "ps5.iconset/icon_${s}x${s}.png" >/dev/null
|
|
d=$((s*2)); sips -z $d $d web/icon-512.png --out "ps5.iconset/icon_${s}x${s}@2x.png" >/dev/null
|
|
done
|
|
iconutil -c icns ps5.iconset -o "$R/ps5directo.icns"
|
|
# Python para cada procesador
|
|
PBS=20250604; PYV=3.12.11
|
|
for pair in aarch64:arm64 x86_64:x86_64; do
|
|
src=${pair%%:*}; dst=${pair##*:}
|
|
curl -fsSL -o py.tgz "https://github.com/astral-sh/python-build-standalone/releases/download/$PBS/cpython-$PYV+$PBS-$src-apple-darwin-install_only_stripped.tar.gz"
|
|
rm -rf python && tar -xzf py.tgz
|
|
P=python/lib/python3.12
|
|
rm -rf "$P/test" "$P/idlelib" "$P/ensurepip" "$P/lib2to3" "$P/pydoc_data" "$P/turtledemo" \
|
|
"$P"/site-packages/pip* "$P/tkinter/test" python/share python/include
|
|
find python -name __pycache__ -prune -exec rm -rf {} +
|
|
mv python "$R/python-$dst"
|
|
done
|
|
"$R/python-$(uname -m)/bin/python3" -c "import ssl, sqlite3, ftplib, lzma, bz2, ctypes; print('python ok')"
|
|
# 7-Zip
|
|
url=$(gh api repos/ip7z/7zip/releases/latest --jq '.assets[] | select(.name | test("mac\\.tar\\.xz$")) | .browser_download_url' | head -1)
|
|
mkdir -p sz && curl -fsSL -o sz.tar.xz "$url" && tar -xJf sz.tar.xz -C sz
|
|
cp sz/7zz "$R/bin/7zz" && chmod +x "$R/bin/7zz"
|
|
"$R/bin/7zz" | head -2
|
|
codesign --force --deep --sign - "$A"
|
|
codesign --verify --deep --verbose=1 "$A"
|
|
|
|
- name: Prueba de arranque en un Mac
|
|
run: |
|
|
export HOME="$RUNNER_TEMP/casa"; mkdir -p "$HOME"
|
|
"build/PS5 Directo.app/Contents/MacOS/PS5 Directo" --no-browser &
|
|
ok=""
|
|
for i in $(seq 1 30); do
|
|
sleep 1
|
|
if grep -q "PS5 Directo $VER" "$HOME/.ps5directo/ps5directo.log" 2>/dev/null; then ok=1; break; fi
|
|
done
|
|
cat "$HOME/.ps5directo/ps5directo.log" || true
|
|
cat "$HOME/Library/Application Support/PS5 Directo/lanzador.log" || true
|
|
pkill -f "PS5 Directo/app/app.py" || true
|
|
test -n "$ok"
|
|
|
|
- name: Crear el .dmg
|
|
run: |
|
|
set -e
|
|
mkdir -p dmg dist
|
|
cp -R "build/PS5 Directo.app" dmg/
|
|
ln -s /Applications dmg/Applications
|
|
cp installer/macos/LEEME-Mac.txt "dmg/Si no abre - LEEME.txt"
|
|
hdiutil create -volname "PS5 Directo" -srcfolder dmg -ov -format UDZO "dist/PS5Directo-$VER-macOS.dmg"
|
|
ls -la dist
|
|
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: mac
|
|
path: dist/PS5Directo-*-macOS.dmg
|
|
retention-days: 3
|
|
|
|
release:
|
|
needs: [build, setup, mac]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
path: dist
|
|
merge-multiple: true
|
|
|
|
# Con una etiqueta crea la release. Pulsando "Run workflow" en Actions añade (o rehace) los archivos
|
|
# de la release de la version que pone app.py, aunque ya exista.
|
|
- uses: softprops/action-gh-release@v2
|
|
with:
|
|
tag_name: v${{ needs.build.outputs.ver }}
|
|
files: |
|
|
dist/PS5Directo-*-Setup.exe
|
|
dist/PS5Directo-*-Windows.zip
|
|
dist/PS5Directo-*-Linux.tar.gz
|
|
dist/PS5Directo-*-macOS.dmg
|