Files
jstrdev--ps5directo/.github/workflows/release.yml
T

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