Commit Graph

90 Commits

Author SHA1 Message Date
mia
b17ce46319 watcher: use releases api (chronological), not tags 2026-06-28 11:04:45 -04:00
mia
af8c7d472f watcher: use github-script (no gh, no checkout) 2026-06-28 11:03:29 -04:00
mia
bfdb43f1a1 watcher: no checkout — read+write build_image.sh via api 2026-06-28 11:00:39 -04:00
mia
33c6bc2660 watcher: skip workspace clean (root-owned build leftovers) 2026-06-28 10:56:19 -04:00
mia
7f4b0009d0 watcher: use gh api tag order, not sort -V on hex sha 2026-06-28 10:51:55 -04:00
mia
9f9fd3fd7f release: add steamos to ALL_DISTROS table 2026-06-28 01:36:49 -04:00
mia
eafb7fbd56 steamos: tar --zstd instead of bsdtar 2026-06-27 20:51:47 -04:00
mia
21f86f562e ship bluez + enable bluetooth.service across distros 2026-06-27 19:05:04 -04:00
mia
de5d60da56 steamos: drop curl dep — image-builder doesn't ship it
Build #28301886085 failed with 'curl: command not found' on the URL
resolution step. Upstream Dockerfile only installs wget + python3,
not curl. Use urllib.request.urlopen().geturl() to follow Valve's
redirect and pull the versioned IMG name (e.g. steamdeck-recovery-
4-20250603.5-3.7.10.img.bz2) for the cache key.
2026-06-27 18:44:59 -04:00
mia
9fa102e098 Add SteamOS distro
Adds `--distro steamos` as a first-class build target. Pattern is the
same as bazzite-deck/batocera: distros/steamos/build-rootfs.sh fetches
the upstream rootfs (Valve's Steam Deck recovery .img.bz2 from
steamdeck-images.steamos.cloud), extracts the rootfs-A + var-A btrfs
slots into $CHROOT, swaps in our linux-ps5 kernel pkg.tar.zst, and
rebuilds the initramfs with the modules amdgpu needs for the PS5
Oberon GPU.

PS5-specific fixes applied to the SteamOS rootfs:

- Replace /usr/bin/steamos-session-select with a shim that writes
  /etc/sddm.conf.d/zzz-session-override.conf directly + restarts sddm.
  The vendored helper goes through steamosctl / steamos-manager whose
  Deck-hardware code paths silently no-op on PS5, leaving the UI stuck
  at "Switching to Desktop..." with no actual session swap.

- Install a small Python dbus monitor (steam-session-switch-listener)
  that catches org.freedesktop.DisplayManager.Seat.SwitchToUser from
  Big Picture's "Switch to Desktop" button and writes the same
  override file. No -steamos3 / -steampal needed (those trigger Steam's
  A/B update reboot loop on a non-Deck box).

- Drop a Return-to-Gaming-Mode.desktop into /home/deck/Desktop pointing
  at steamos-session-select gamescope.

- chown /home/deck to deck:deck (the recovery image leaves it root:root,
  which breaks ~/.config writability on first Plasma launch).

- Enable sshd + set deck:deck so the box is reachable for further
  iteration without dragging a USB keyboard around.

- Patch /etc/fstab: comment out the by-partsets atomic mount entries
  (those paths don't exist on a flat-rootfs flash), append a LABEL-based
  /efi mount so the FAT boot partition comes up cleanly. Required for
  ps5-iw620-firmware.service to find the WLAN blob.

- Append amdgpu.dpm=0 + amdgpu.gpu_recovery=0 to the kernel cmdline.
  modprobe.d alone isn't enough — amdgpu loads before the rootfs conf
  is read, so the cmdline is the only reliable path. Without these
  Switch-to-Desktop produces a black screen on the PS5 HDMI output.

- Polkit-deny the deck user reboot/poweroff to break Steam's update
  reboot loop on first boot.

- Patch steam-jupiter to skip its OOBE rm -rf path. The OOBE assumes
  Deck factory layout and wipes /home/deck/.local if it runs.

Verified end-to-end on real PS5 (HW-rev EA-1102): autologin lands in
gamescope, Switch-to-Desktop and Return-to-Gaming both work, sshd is
reachable, ps5-iw620 brings up internal WiFi after firmware staging.

Files:
- distros/steamos/build-rootfs.sh  (646 lines)
- distros/steamos/README.md
- distros/steamos/return-to-gaming-mode.desktop
- distros/steamos/steam-session-switch-listener.{py,service}
- build_image.sh: steamos → FORMAT=arch (uses linux-ps5 pkg.tar.zst)
- .github/workflows/build-image.yml: steamos in matrix options + distros list
2026-06-27 17:10:07 -04:00
mia26MAjFm
096675b60a release: include bazzite + bazzite-deck in the table 2026-06-24 09:45:33 -04:00
mia26MAjFm
00d89868c8 build-image: clean step now umounts + detaches loops before rm
Cachyos build on minipc-gh-2 failed with "Directory not empty"
because a previous run left a loop device backed by a (deleted) file
in image/work/, and rm -rf can't cross the live mountpoint. Lazy-
umount everything under the workspace + detach matching loops before
the rm so stale mounts don't fail subsequent runs.
2026-06-24 06:59:55 -04:00
mia26MAjFm
b1aa5e5b50 build-image: drop batocera from matrix
5h cold-cache download from o2switch (only mirror, rate-limited to
~250 KB/s), and no persistent cache plumbing yet means every run pays
the full cost. Ship bazzite/bazzite-deck for emulation use cases.
2026-06-24 06:49:50 -04:00
mia26MAjFm
b2c77d5cb2 image-builder: add python3 (needed by batocera build-rootfs.sh)
distros/batocera/build-rootfs.sh:211 calls python3 inline to patch
libretroControllers.py with the PS5 HOTKEY-on-gamepad fix. Without it
the batocera build exits 127 at the very end of an otherwise-clean
run.
2026-06-24 02:01:13 -04:00
mia26MAjFm
f8d0b65b36 batocera: auto-discover the current build instead of hardcoding
The mirror rotates older builds out — the pinned 43-20260430 went 404
on its own within ~4 weeks. Scrape the `last/` index for whatever
batocera-x86_64-*.img.gz is there now (currently 43.1-20260529). VER
and BUILD are then derived from the discovered filename so the cache
key + log lines remain informative.

BATOCERA_URL still wins if set (override path unchanged).
2026-06-23 19:27:48 -04:00
mia26MAjFm
875bb35fef image-builder: --no-cache instead of CACHEBUST arg
CACHEBUST only invalidates the umoci layer; the broken cached layer on
the Oracle runner is upstream (apt-install), so step 10 still tried to
exec /bin/sh from a corrupt parent FS. --no-cache rebuilds every layer
fresh — slower (~5 min apt re-run per build) but reliable on every
runner regardless of buildkit storage state.
2026-06-23 18:13:15 -04:00
mia26MAjFm
7e42201d88 image-builder: CACHEBUST arg to force-rebuild umoci layer
One org runner has a broken cached layer for the umoci install (runc:
"/bin/sh: no such file"). Pass a unique build-arg each invocation so
that layer + downstream get rebuilt fresh, while the heavy apt install
above stays cached.
2026-06-23 18:03:17 -04:00
mia26MAjFm
0367dcb89c image-builder: pass --pull on docker build
One of the runners has a corrupted buildkit cache for the umoci layer
("/bin/sh: no such file or directory" mid-RUN). --pull refreshes the
ubuntu:24.04 base, which invalidates all downstream cached layers and
forces the umoci step to actually re-execute.
2026-06-23 17:33:55 -04:00
mia26MAjFm
98892eec6b fedora: drop duplicate in-image mwifiex build, use rpm-shipped modules
The kernel rpm built by kernel-builder/build.sh now ships mlan.ko / moal.ko
plus modprobe options for the PS5 IW620, so the image side no longer needs
its own out-of-tree build (which was pinned to an old ps5-linux-mwifiex
ref and only applied 1 of 3 patches, breaking against kernel 7.1.x).

Suppress the rpm's modules-load.d autoload so firmware-copy still runs
first via ps5-iw620.service.
2026-06-23 16:07:45 -04:00
rmux
9350227d7b apply cmd-timeout-recover and kernel71-compat mwifiex patches (#22) 2026-06-23 19:47:13 +02:00
mia26MAjFm
b10c0b2855 kernel-builder: install ca-certificates
git clone https://github.com/... fails with 'server certificate verification
failed. CAfile: none' because ubuntu:24.04 with just 'git' doesn't pull in
ca-certificates. Hit in 'Building NXP IW620 mwifiex driver' stage.
2026-06-21 09:37:42 -04:00
mia26MAjFm
bf96770651 build-image: max-parallel 1 -> 5 (we have 5 self-hosted runners) 2026-06-21 09:29:35 -04:00
mia26MAjFm
7f5dc8df0c build-image: wire bazzite, bazzite-deck, batocera into matrix + dispatch
#20 added the distro directories but missed updating the dispatch choice
enum and the 'all' matrix expansion, so the three new distros couldn't
be triggered through CI.
2026-06-21 09:23:04 -04:00
ps5-linux-bot
7fbb7df59d kernel: auto-bump kernel-7.1.1-2ee6846 -> kernel-7.1.1-76db3a4 (upstream watch) 2026-06-21 11:13:29 +00:00
mia26MAjFm
247e4ea01b kernel-builder: build + bundle NXP IW620 mwifiex driver
linux-ps5 currently ships no wifi driver — the PS5 onboard wifi is NXP
IW620 (not the upstream mwifiex), which lives at ps5-linux/ps5-linux-
mwifiex as an out-of-tree patch against nxp-imx/mwifiex. Users have to
clone that repo + run install.sh on the target, which needs gcc + kernel
headers and is a manual step every kernel bump.

Build it in the kernel-builder container right after the kernel: clone
both repos, apply ps5-iw620.patch, make against the kernel src tree,
install mlan.ko+moal.ko into /out/staging/lib/modules/$KVER/extra/
ps5-iw620/ with the NXP modprobe options + autoload conf. depmod -b
refreshes the index. All package formats (.deb/.rpm/.pkg.tar.zst) then
include the driver automatically.

MWIFIEX_REPO / MWIFIEX_REF overridable via env in case downstream wants
to test a fork or specific commit.
2026-06-20 17:07:11 -04:00
mia26MAjFm
71bce4c5cb cachyos: drop -steamos3 from gamescope-session-ps5
Steam in -steamos3 mode polls for SteamOS atomic OS updates via
steamos-update, steamos-update-rauc, steamos-atomupd-client. CachyOS
ships none of these (pacman handles rolling updates), so every poll
fires "YieldingApplyUpdateOS: OS update result: 2" and the GamepadUI
shows "Updater apply error: 2: null".

That alone is just a banner, but the first-run OOBE blocks on the
"Software updates" step waiting for a successful update result, so
users can't get past initial setup. Field-reported.

Dropping -steamos3 keeps -gamepadui (controller-friendly UI) without
the SteamOS-mode update polling. OS updates: sudo pacman -Syu.
2026-06-20 16:02:56 -04:00
mia26MAjFm
a32505e94d ci: daily upstream patches watch — auto-bump PATCHES_REF
Polls ps5-linux/ps5-linux-patches for new kernel-X.Y.Z-<sha> tags at
04:00 UTC. If newer than build_image.sh's PATCHES_REF, bumps + pushes
to main; the push fires trigger-builds.yml which rebuilds all images
against the new kernel. Safe-skips if PATCHES_REPO has been forked.
2026-06-20 15:29:30 -04:00
mia26MAjFm
fe4e686d62 bump PATCHES_REF v1.3 -> kernel-7.1.1-2ee6846
7.1.1 series. Includes SVM implementation + running
transmitter_control in guest mode.
2026-06-20 15:26:50 -04:00
mia26MAjFm
e1f17f7e38 fix: export CHROOT/DISTRO/KVER to build-rootfs.sh + sanity guard (#21)
The dispatch in #20 ran build-rootfs.sh without exporting $CHROOT, so
inside the script it was empty — meaning '/' expansions like
`mv "$UNPACK/rootfs"/* "$CHROOT/"` resolved to '/' and the bazzite
rootfs went into the build container's root. Container-contained, but
the build failed with a confusing 'Device or resource busy' on
/etc/resolv.conf.

Two fixes:
- entrypoint exports DISTRO/CHROOT/KVER/ROOT_LABEL/EFI_LABEL when
  calling the per-distro script, and asserts $CHROOT non-empty.
- bazzite + batocera scripts have a top-of-file guard that bails if
  $CHROOT is unset, missing, or '/'.

Co-authored-by: mia26MAjFm <mia26MAjFm@users.noreply.github.com>
2026-06-20 12:43:53 -04:00
Andy Nguyen
f090f170a0 Remove kali from github workflows. 2026-06-20 17:53:28 +02:00
mia26MAjFm
9682cada8d Add bazzite, bazzite-deck, batocera distro support (#20)
Each distro ships with a self-contained build-rootfs.sh that the entrypoint
calls in place of distrobuilder.  This keeps upstream's distrobuilder flow
untouched for the existing distros (ubuntu/arch/cachyos/fedora/etc.) and
isolates the new distros' build logic in their own dirs.

distros/bazzite/
  build-rootfs.sh — skopeo+umoci on ghcr.io/ublue-os/bazzite:stable,
                    promote ostree /usr/etc -> /etc, install linux-ps5 RPM,
                    mask rpm-ostree services, set up grow-rootfs + DTM-TA
                    amdgpu reprobe.
  image.yaml, grow-rootfs, grow-rootfs.service

distros/bazzite-deck/
  Symlinks into distros/bazzite/ — bazzite-deck shares all build logic;
  the case branch in build-rootfs.sh dispatches via $DISTRO.

distros/batocera/
  build-rootfs.sh — download upstream batocera-x86_64-*.img.gz, mount,
                    extract /boot/batocera squashfs, swap in linux-ps5
                    kernel, patch libretroControllers.py, install first-boot
                    SHARE-partition creator (ps5-share-init).

docker/image-builder/entrypoint.sh
  - detect_kver() helper from /kernel-debs/ package filenames
  - dispatch to distros/$DISTRO/build-rootfs.sh when present (skips
    distrobuilder for that distro)
  - EFI assembly detects /boot/efi/ vs /boot/bzImage layouts so batocera
    (which mounts FAT at /boot, not /boot/efi, for batocera-part SHARE
    detection) works alongside the standard layout

build_image.sh
  - IMG_SIZE defaults: bazzite* -> 24 GB, batocera* -> 16 GB
  - FORMAT: bazzite* -> rpm (linux-ps5 RPM); batocera* stays deb

CI workflows are NOT modified — the upstream build-image.yml /
trigger-builds.yml continue to apply and will skip these distros unless
explicitly dispatched (they're not in MULTI_DISTROS).  Local builds:
  ./build_image.sh --distro bazzite
  ./build_image.sh --distro bazzite-deck
  ./build_image.sh --distro batocera

Co-authored-by: mia26MAjFm <mia26MAjFm@users.noreply.github.com>
2026-06-20 11:51:53 -04:00
Andy Nguyen
ccc30f19b4 Remove kali since it's too big. 2026-06-20 17:40:50 +02:00
Andy Nguyen
34df7b0b64 Undo changes to zz-update-boot. 2026-06-19 20:14:58 +02:00
Hasanuddin Abu Bakar
76824ba725 fix(kernel): merge UAPI headers into existing usr/ directory (#17)
Both packagers copied the staged UAPI headers with:

    cp -a /out/staging/headers/usr "$DEST/usr"

Because $DEST/usr already exists (modules live under $STAGING/usr/lib/modules,
and other files may be staged under $PKG/usr), cp placed the source directory
inside the destination, producing a nested usr/usr/include/ path. The headers
were therefore installed at the wrong location and not found by builds.

Merge the contents with cp -a .../usr/. "$DEST/usr/" so the headers land at
the expected /usr/include/linux/... path in both .deb and .pkg.tar.zst
packages.
2026-06-16 20:13:44 +02:00
Bug Bounty Zip
7d5efa0583 Add Debian 12 (XFCE) image support
Plain Debian 12 Bookworm with XFCE desktop, LightDM autologin, Firefox
ESR, and standard desktop utilities. Fills the gap between the heavier
Kali (Debian + security tools) and the headless Proxmox (Debian +
hypervisor) — a clean, lightweight Debian desktop for PS5.

Tested on PS5 hardware: XFCE displays over HDMI, boots to desktop.

[skip ci]
2026-06-14 00:39:13 +08:00
Bug Bounty Zip
76d3ba281e ci: merge release table instead of overwriting on single-distro builds
The release step now fetches the existing release body and merges the
new distro rows into it, instead of rebuilding the table from scratch.
This means a single-distro build (e.g. --distro fedora) only updates
that distro's row and checksum — all other distros stay in the table.

Previously, every single-distro CI run wiped the other distros from
the release page, requiring a manual API patch each time.

[skip ci]
2026-06-14 00:30:19 +08:00
Bug Bounty Zip
177cc5cfbf Add Proxmox VE 8 image support
Debian 12 Bookworm base with Proxmox VE 8.4 (pve-manager, pve-qemu-kvm,
qemu-server). Headless hypervisor managed via web UI at https://<ip>:8006.
Login: root/proxmox.

The PS5 kernel can't satisfy proxmox-ve's hard dependency on a Proxmox
kernel, so the recipe installs an equivs stub (ps5-proxmox-kernel-stub)
that Provides: proxmox-default-kernel before installing proxmox-ve. First
boot auto-bridges the PS5 ethernet into vmbr0 with DHCP. WiFi is not
included (Proxmox VM networking requires wired bridging).

Also wires proxmox into the CI matrix, entrypoint staging, and release
table.

[skip ci]
2026-06-13 23:02:59 +08:00
Bug Bounty Zip
ddfda4de88 image-builder: build umoci from source to fix arm64 CI runner crash
Ubuntu's apt umoci (0.4.7) crashes on the self-hosted arm64 runner with
"fatal error: lfstack.push invalid packing" while unpacking Fedora's OCI
base image. The image-builder is an amd64 image, so it runs under qemu on
the arm64 runner, and the emulated process inherits the host's 52-bit-VA
high addresses that the old Go in apt's umoci mis-packs in lfstack. Build
umoci v0.5.0 from source with the Go 1.25 toolchain already installed
(Go >=1.21 handles high virtual addresses correctly). Only Fedora uses
umoci (OCI base); the other distros use debootstrap/pacstrap.

[skip ci]
2026-06-13 07:57:12 +08:00
Bug Bounty Zip
ed54e99482 Add Fedora 44 (GNOME) image support
New fedora distro: distrobuilder fedora-http recipe with full GNOME
desktop (GDM autologin), the PS5 IW620 internal WiFi modules built from
nxp-imx/mwifiex + ps5-linux-mwifiex, and an RPM packaging path for the
shared PS5 kernel (docker/kernel-builder-rpm).

Notable PS5-specific fix: the kernel patches write into the
request_firmware() buffer to skip the firmware signature header
(gfx_v10_0_early_init, amdgpu_sdma_init_microcode). Fedora ships
firmware xz-compressed, and the kernel maps xz-decompressed firmware
read-only (fw_decompress_xz_pages -> fw_map_paged_buf -> vmap
PAGE_KERNEL_RO), so the write oopses amdgpu before /dev/dri exists and
the display never comes up. Distros with zstd or uncompressed firmware
decompress into writable buffers, which is why only Fedora was
affected. The recipe therefore ships the cyan_skillfish GPU firmware
uncompressed, materializing linux-firmware's dedup symlinks first
(unxz refuses symlinks).

Also installs umoci/skopeo in the image builder (Fedora 41+ bases ship
as OCI archives) and wires fedora into build_image.sh (FORMAT=rpm) and
the image-builder entrypoint.

Tested on PS5 hardware: GNOME displays over HDMI, internal WiFi scans
and connects.

[skip ci]

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-13 07:00:06 +08:00
Dan Kluser
50d8ec0b03 ci: reduce compression level 2026-06-03 07:43:58 +02:00
Dan Kluser
5f7cfddd3f ci: update actions version; move release date 2026-06-02 22:00:25 +02:00
Dan Kluser
47b35f48dc ci: move release commit tag 2026-06-02 21:53:31 +02:00
Dan Kluser
2ea14c3e0c ci: remove obsolete upload; using r2 going forward 2026-06-02 21:43:03 +02:00
Andy Nguyen
f624aef764 Update to v1.3 patches. 2026-05-30 22:03:16 +02:00
Bug Bounty Zip
1c629a881e Merge pull request #13 from BugBountyzip/feature/kali-iw620-default-wifi
Add Kali internal IW620 WiFi support
2026-05-29 16:13:08 +03:00
Bug Bounty Zip
90f06ee77b Add Kali internal IW620 WiFi support 2026-05-29 15:53:36 +03:00
Bug Bounty Zip
b68aa667d1 Extend image build timeout 2026-05-27 15:22:44 +03:00
Bug Bounty Zip
a1e2bc92e5 Reduce Kali release image scope 2026-05-27 15:19:17 +03:00
Bug Bounty Zip
0adaf1c6d6 Use Kali snapshot for release builds 2026-05-27 10:38:58 +03:00
Bug Bounty Zip
d0efec98fe Harden self-hosted image builds 2026-05-27 09:17:16 +03:00