Files
Quer3qandClaude Opus 5.5 14caf861d3 Release v0.3.1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 15:45:45 +03:00

230 lines
10 KiB
YAML

name: Release
# A `v*` tag builds the macOS, Windows, Linux and PS5 releases and creates a *draft* GitHub Release
# with the macOS universal (arm64 + Intel) zip, the two Windows x86-64 zips (with and without a
# bundled WebView2 runtime), the Windows arm64 zip, the Linux x86-64 and arm64 tarballs, the PS5
# payload (one plain .elf) and SHA256SUMS (the source is GitHub's own archive of the tag); publishing the draft is a manual step on GitHub, after checking its assets.
# `workflow_dispatch` is a dry run, even on a tag: same build, artifact kept on the run,
# nothing published.
on:
push:
tags: ["v*"]
workflow_dispatch:
permissions:
contents: read
env:
CARGO_TERM_COLOR: always
jobs:
macos:
# PS5 Dump Forge.app + the CLI, ad-hoc signed, as one universal (arm64 + Intel) zip.
runs-on: macos-15
timeout-minutes: 60
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false
- name: Check the versions agree (and match the tag)
run: scripts/check-versions.sh
- name: Latest stable Rust (rust-toolchain.toml adds aarch64-apple-darwin and x86_64-apple-darwin)
run: |
rustup update --no-self-update stable
rustup toolchain install --no-self-update
rustc -Vv
- uses: actions/setup-node@v7
with:
node-version: lts/*
# Builds PS5 Dump Forge.app (tauri build, universal) and the CLI (both targets,
# lipo-joined), assembles and verifies the zip, writes SHA256SUMS into dist/.
- run: scripts/release-macos.sh
- uses: actions/upload-artifact@v7
with:
name: release-macos
path: dist/*
if-no-files-found: error
retention-days: 3
windows:
# PS5 Dump Forge.exe + the CLI (MSVC, built natively on each runner), unsigned. x86-64: one zip
# for the installed WebView2 Runtime, one that carries Microsoft's Fixed Version runtime next to
# the exe. arm64: one zip for the installed runtime (Windows 11 ships it).
name: windows (${{ matrix.arch }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
arch: x86-64
- os: windows-11-arm
arch: arm64
timeout-minutes: 60
defaults:
run:
shell: bash
steps:
# LF checkout: the runner's Git converts to CRLF, which breaks the bash scripts (and the zips
# would carry CRLF docs).
- run: git config --global core.autocrlf false
- uses: actions/checkout@v7
with:
persist-credentials: false
- name: Check the versions agree (and match the tag)
run: scripts/check-versions.sh
- name: Latest stable Rust (the host, x86_64 or aarch64 pc-windows-msvc, is the release target)
run: |
rustup update --no-self-update stable
rustup toolchain install --no-self-update
rustc -Vv
- uses: actions/setup-node@v7
with:
node-version: lts/*
# Builds PS5 Dump Forge.exe (tauri build --no-bundle) and the CLI, (x86-64 only) downloads and
# checks the pinned WebView2 Fixed Version .cab, assembles and verifies the zips into dist/.
- run: scripts/release-windows.sh
- uses: actions/upload-artifact@v7
with:
name: release-windows-${{ matrix.arch }}
path: dist/*
if-no-files-found: error
retention-days: 3
linux:
# The extracted AppImage (an AppDir) + forge.sh + the CLI, unsigned, as one tarball per arch,
# built natively on each runner.
# ubuntu-22.04, not -latest: the binaries need the build host's glibc (2.35) or newer.
name: linux (${{ matrix.arch }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-22.04
arch: x86-64
- os: ubuntu-22.04-arm
arch: arm64
timeout-minutes: 60
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false
- name: Check the versions agree (and match the tag)
run: scripts/check-versions.sh
# Tauri v2's Linux build deps; xvfb for the script's GUI launch check.
- name: WebKitGTK and the AppImage tools
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends libwebkit2gtk-4.1-dev libgtk-3-dev \
librsvg2-dev libayatana-appindicator3-dev patchelf file xvfb
- name: Latest stable Rust (the host, x86_64 or aarch64 unknown-linux-gnu, is the release target)
run: |
rustup update --no-self-update stable
rustup toolchain install --no-self-update
rustc -Vv
- uses: actions/setup-node@v7
with:
node-version: lts/*
# Builds the AppImage (tauri build) and the CLI, extracts the AppImage into the AppDir,
# assembles the tarball into dist/ and verifies it after a round trip (CLI run, GUI launch).
- run: scripts/release-linux.sh
- uses: actions/upload-artifact@v7
with:
name: release-linux-${{ matrix.arch }}
path: dist/*
if-no-files-found: error
retention-days: 3
ps5:
# The CLI as a PS5 payload with the web UI embedded, one plain .elf, unsigned. Cross-built in
# the ps5/ Docker image (Rust build-std + the ps5-payload-dev SDK); the web UI on the runner.
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false
- name: Check the versions agree (and match the tag)
run: scripts/check-versions.sh
- uses: actions/setup-node@v7
with:
node-version: lts/*
# Builds the web UI and the ELF (ps5/build.sh), copies it into dist/ and checks the copy
# (llvm-readelf: a PIE with the SDK's NEEDED modules; the web UI and version embedded).
- run: scripts/release-ps5.sh
- uses: actions/upload-artifact@v7
with:
name: release-ps5
path: dist/*.elf
if-no-files-found: error
retention-days: 3
publish:
# One array entry per platform job (the windows and linux matrix legs all upload release-* artifacts).
needs: [macos, windows, linux, ps5]
# Only a real tag push creates the draft; a workflow_dispatch run stays a dry run.
if: github.event_name == 'push' && github.ref_type == 'tag'
runs-on: ubuntu-latest
timeout-minutes: 60
permissions:
contents: write
steps:
# Every platform job uploads a `release-*` artifact; merge them all into dist/.
- uses: actions/download-artifact@v8
with:
pattern: release-*
path: dist
merge-multiple: true
- name: Recompute SHA256SUMS over every platform's archives
run: |
cd dist
rm -f SHA256SUMS
# merge-multiple lets a mislabelled leg overwrite another's archive, or a leg go missing:
# require exactly the seven archives of this tag before checksumming.
ver=${GITHUB_REF_NAME#v}
printf '%s\n' \
"ps5-dump-forge-$ver-linux-arm64.tar.gz" \
"ps5-dump-forge-$ver-linux-x86-64.tar.gz" \
"ps5-dump-forge-$ver-macos-universal.zip" \
"ps5-dump-forge-$ver-ps5.elf" \
"ps5-dump-forge-$ver-windows-arm64.zip" \
"ps5-dump-forge-$ver-windows-x86-64-webview2.zip" \
"ps5-dump-forge-$ver-windows-x86-64.zip" | LC_ALL=C sort > ../expected.txt
printf '%s\n' * | LC_ALL=C sort | diff ../expected.txt - || { echo "::error::dist/ does not hold exactly the expected archives"; exit 1; }
sha256sum -- * > SHA256SUMS
cat SHA256SUMS
# gh is preinstalled on the runner; no third-party release action needed.
- name: Create the GitHub Release
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
run: |
ver=${GITHUB_REF_NAME#v}
{
echo "macOS 11 or later (Intel and Apple Silicon): unzip the universal zip, then see \"macOS\" in README.md."
echo "The app is ad-hoc signed only (no Developer ID, not notarized), so macOS asks you to allow it once."
echo
echo "Windows 10 or 11 (x86-64): the windows-x86-64 zip uses the Microsoft Edge WebView2 Runtime, which Windows 11 and most Windows 10 PCs already have."
echo "No WebView2 Runtime (or not allowed to install it)? The windows-x86-64-webview2 zip is larger but carries its own copy in its WebView2 folder."
echo "Windows 11 (arm64): the windows-arm64 zip uses the installed WebView2 Runtime, which Windows 11 ships."
echo "Unzip to a folder you can write to (the app keeps its WebView data beside it), then run PS5 Dump Forge.exe."
echo "The app is not signed, so SmartScreen may stop the first launch: choose \"More info\", then \"Run anyway\"."
echo
echo "Linux (x86-64 or arm64, glibc 2.35 or later, e.g. Ubuntu 22.04 or newer): extract the linux-x86-64 or linux-arm64 tarball (tar -xzf) to a folder you can write to (the app keeps its WebView data beside it), then run ./forge.sh."
echo "It needs no FUSE and no install; keep the PS5 Dump Forge.AppDir folder next to forge.sh."
echo
echo "PS5 (jailbroken, with an ELF loader): load ps5-dump-forge-$ver-ps5.elf, e.g. send it to elfldr's port 9021 or list it in the webkit autoloader's autoload.txt, then open http://<ps5-ip>:8095 in a browser."
echo "The web UI has no access control: use it on a trusted network."
echo
echo "Each desktop archive (macOS, Windows, Linux) holds the app (PS5 Dump Forge.app, PS5 Dump Forge.exe or PS5 Dump Forge.AppDir with forge.sh) and the ps5-dump-forge command-line tool. README, LICENSE (GPL-3.0), the UnRAR license and THIRD-PARTY-NOTICES.md are in the source archives below, the complete corresponding source of this release. SHA256SUMS lists every archive's SHA-256."
case "$GITHUB_REF_NAME" in *-*)
echo
echo "Test release: not every format has been tested on a console yet. Keep the original dump." ;;
esac
} > notes.md
# A tag with a suffix (v0.0.1-pre) becomes a pre-release.
pre=; case "$GITHUB_REF_NAME" in *-*) pre=--prerelease ;; esac
gh release create "$GITHUB_REF_NAME" dist/* --draft $pre \
--verify-tag --title "PS5 Dump Forge $GITHUB_REF_NAME" --notes-file notes.md