mirror of
https://github.com/JBuildr/nubix.git
synced 2026-10-23 06:00:58 +02:00
153 lines
7.2 KiB
YAML
153 lines
7.2 KiB
YAML
# Nubix — build the PS5 release on GitHub and publish it.
|
|
#
|
|
# Push a tag like v0.3.0 (it must match project(nubix VERSION ...) in CMakeLists.txt). The job
|
|
# builds the PS5 homebrew zip inside the ps5dev Docker image, packs the GPL "Corresponding Source"
|
|
# of everything linked into the binary, and attaches both to a GitHub release for that tag.
|
|
# Started by hand (Actions tab -> Release -> Run workflow) it only builds and keeps the files as a
|
|
# workflow artifact, without creating a release.
|
|
# Copyright (C) 2026 Nubix contributors
|
|
# SPDX-License-Identifier: GPL-3.0-only
|
|
name: Release
|
|
|
|
on:
|
|
push:
|
|
tags: ['v*']
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: write
|
|
|
|
jobs:
|
|
ps5:
|
|
name: PS5 build + corresponding source
|
|
runs-on: ubuntu-24.04 # Docker is only available on Linux runners
|
|
timeout-minutes: 120
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Read version
|
|
id: ver
|
|
run: |
|
|
ver="$(sed -n 's/^project(nubix VERSION \([0-9.]*\).*/\1/p' CMakeLists.txt)"
|
|
[ -n "$ver" ] || { echo "version not found in CMakeLists.txt"; exit 1; }
|
|
echo "version=$ver" >> "$GITHUB_OUTPUT"
|
|
if [ "${GITHUB_REF_TYPE}" = "tag" ] && [ "${GITHUB_REF_NAME}" != "v$ver" ]; then
|
|
echo "::error::tag ${GITHUB_REF_NAME} does not match CMakeLists.txt version v$ver"; exit 1
|
|
fi
|
|
|
|
- name: Point SOURCE.txt at this repository
|
|
run: sed -i "s#<owner>/nubix#${GITHUB_REPOSITORY}#g" SOURCE.txt
|
|
|
|
# First, while dist/ still belongs to the runner user (the Docker steps below write as root).
|
|
- name: Corresponding source bundle
|
|
run: bash scripts/make-source-bundle.sh
|
|
|
|
- name: Build libdatachannel for PS5
|
|
run: bash scripts/build-deps.sh ps5
|
|
|
|
- name: Build PS5 homebrew
|
|
run: bash scripts/build-ps5.sh
|
|
|
|
- name: Collect release files
|
|
run: |
|
|
sudo chown -R "$(id -u):$(id -g)" .
|
|
v="${{ steps.ver.outputs.version }}"
|
|
mkdir -p release
|
|
cp "build-ps5/nubix-v$v-websrv.zip" release/
|
|
cp "dist/nubix-v$v-corresponding-source.tar.xz" "dist/nubix-v$v-corresponding-source.MANIFEST" release/
|
|
# Protective DNS (tools/sony_dns.py) as its own small download
|
|
mkdir -p "dns/nubix-dns-blocker"
|
|
cp tools/sony_dns.py tools/allowlist.txt LICENSE "dns/nubix-dns-blocker/"
|
|
cat > "dns/nubix-dns-blocker/README.txt" <<'TXT'
|
|
Nubix protective DNS for a jailbroken PS5
|
|
=========================================
|
|
Blocks everything except what Nubix needs for Xbox Cloud Gaming. Sony / PlayStation
|
|
domains are always blocked (no PSN, no system updates, no telemetry).
|
|
|
|
1. Install Python 3.8+ (python.org).
|
|
2. Start it on a PC in the same network as the PS5:
|
|
Windows (terminal "Run as administrator"): python sony_dns.py
|
|
macOS / Linux: sudo python3 sony_dns.py
|
|
On Windows allow Python through the firewall for private networks.
|
|
3. On the PS5: Settings > Network > Settings > Set Up Internet Connection > your network >
|
|
Advanced Settings > DNS Settings: Manual > Primary DNS AND Secondary DNS = the IP the
|
|
script prints.
|
|
4. Keep the PC running while the PS5 is online.
|
|
|
|
More domains: add them to allowlist.txt (one per line). You are responsible for them.
|
|
See all queries: python sony_dns.py --log-all Help: python sony_dns.py --help
|
|
TXT
|
|
(cd dns && python3 -m zipfile -c "../release/nubix-dns-blocker-v$v.zip" nubix-dns-blocker)
|
|
(cd release && sha256sum * > SHA256SUMS.txt)
|
|
ls -la release
|
|
|
|
- name: Write release notes
|
|
run: |
|
|
v="${{ steps.ver.outputs.version }}"
|
|
base="https://github.com/${GITHUB_REPOSITORY}/releases/download/v$v"
|
|
tree="https://github.com/${GITHUB_REPOSITORY}/blob/v$v"
|
|
cat > notes.md <<EOF
|
|
**Play Xbox Cloud Gaming online on your jailbroken PS5.** Unofficial, open-source client
|
|
that runs from the websrv Homebrew Launcher.
|
|
|
|
> [!WARNING]
|
|
> **Before your jailbroken PS5 goes online, protect it with a DNS that blocks Sony's servers**
|
|
> (PSN, system updates, telemetry). Use the **Nubix DNS blocker** below, or see
|
|
> [Before you go online]($tree/README.md#before-you-go-online-protective-dns) in the README.
|
|
|
|
## Downloads
|
|
|
|
| | File | What it is |
|
|
|---|---|---|
|
|
| 🎮 | **[nubix-v$v-websrv.zip]($base/nubix-v$v-websrv.zip)** | The app. Copy the \`nubix\` folder to \`/data/homebrew/\` on the PS5. |
|
|
| 🛡️ | **[nubix-dns-blocker-v$v.zip]($base/nubix-dns-blocker-v$v.zip)** | Protective DNS for your PC (Python): allows only what Nubix needs, always blocks Sony. |
|
|
| 📦 | [nubix-v$v-corresponding-source.tar.xz]($base/nubix-v$v-corresponding-source.tar.xz) | Complete source of everything in the app (GPL-3.0). Not needed to play. |
|
|
| 🔒 | [SHA256SUMS.txt]($base/SHA256SUMS.txt) | Checksums of all files. |
|
|
|
|
## Quick start
|
|
|
|
1. **Protect the console:** unzip \`nubix-dns-blocker-v$v.zip\` on a PC, run \`python sony_dns.py\`
|
|
(Windows: as administrator) and set the PS5's **Primary and Secondary DNS** to the IP it prints.
|
|
2. **Install:** unzip \`nubix-v$v-websrv.zip\` and copy the \`nubix\` folder to \`/data/homebrew/\` on the PS5.
|
|
3. **Start** websrv, open the Homebrew Launcher and start **Nubix**.
|
|
4. **Sign in:** open https://www.microsoft.com/link on your phone and enter the code shown on the TV.
|
|
|
|
Requires a Microsoft account with a Game Pass plan that includes cloud gaming (or the free,
|
|
ad-supported offering). Full guide, controls and troubleshooting: [README]($tree/README.md).
|
|
|
|
---
|
|
> Unofficial, non-commercial project. Not affiliated with, endorsed by or sponsored by Microsoft
|
|
> or Sony. Using third-party clients may violate their terms of service; use at your own risk.
|
|
EOF
|
|
cat notes.md
|
|
|
|
- name: Upload as workflow artifact
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: nubix-v${{ steps.ver.outputs.version }}
|
|
path: release/
|
|
retention-days: 14
|
|
|
|
# Re-running a tag (or moving it) must not collide with a release or draft from an earlier
|
|
# run: delete every release that uses this tag first. The git tag itself is kept.
|
|
- name: Remove earlier releases for this tag
|
|
if: github.ref_type == 'tag'
|
|
env:
|
|
GH_TOKEN: ${{ github.token }}
|
|
run: |
|
|
gh api "repos/${GITHUB_REPOSITORY}/releases?per_page=100" \
|
|
--jq ".[] | select(.tag_name == \"${GITHUB_REF_NAME}\") | .id" |
|
|
while read -r id; do
|
|
echo "deleting earlier release ${id}"
|
|
gh api -X DELETE "repos/${GITHUB_REPOSITORY}/releases/${id}"
|
|
done
|
|
|
|
- name: Publish GitHub release
|
|
if: github.ref_type == 'tag'
|
|
uses: softprops/action-gh-release@v2
|
|
with:
|
|
name: Nubix ${{ github.ref_name }}
|
|
prerelease: ${{ startsWith(steps.ver.outputs.version, '0.') }}
|
|
files: release/*
|
|
body_path: notes.md
|