Commit Graph
42 Commits
Author SHA1 Message Date
alvinlollo bb6f64e977 feat(installer): build-stamp motd, LUKS mode A/B, TPM2, unl0kr, login managers
Tests / tests (push) Failing after 2m33s
- profiledef.sh stages airootfs/root/.iso-build-stamp (git/CI gated, falls
  back to 'commit unknown'); customize_airootfs.sh installs it as
  /etc/alvin-build-stamp; install_motd appends it to the target /etc/motd
- alvin-install: skippable git/GitHub screens with ssh-import-id import
  (yay build + python-distro, curl .keys fallback), LUKS Mode A (systemd
  sd-encrypt + rd.luks.name) vs Mode B (unl0kr + cryptdevice), TPM2
  enrollment via $PASSWORD with rd.luks.options activation, unl0kr
  build/verify with Mode-A fallback, login manager none/greetd/sddm/gdm
  (enable DM before disabling getty@tty1), autologin per DM (forced off
  when TPM enrolled), build-stamp motd; includes the existing
  GRUB_DISABLE_BOOTNEXT grub tweak
- review fixes: greetd autologin TOML quoting, .ssh chowned before
  ssh-import-id, builtin-aware initramfs module verification across all
  installed kernels, curl exit-code split (fetch failure vs no keys),
  plain Hyprland on every login path
- add curl to packages.x86_64; document stamp flow and installer in
  AGENTS.md/README.md
2026-10-05 16:26:12 +11:00
alvinlollo 3b3764573e fix(installer): resolve owner in one chroot call, log ydotool link errors
Tests / tests (push) Failing after 2m28s
Two low-severity review findings on 8501a60:

- owner="$(id -u):$(id -g)" as two substitutions only propagates the
  last status, so a lone id -u failure would build ':1000' and abort at
  the chown with "invalid owner" under the wrong line. Run both ids in
  a single arch-chroot sh -c chained with && and join with paste -sd:;
  pipefail makes any failure abort at the owner= line. Verified both
  paths: existing user yields 1000:1000, missing user trips the ERR
  trap before owner is used.
- the ydotool symlink mkdir/ln wrote stderr to the terminal while the
  failure warn pointed at $LOG, which never recorded it; redirect both
  into the log, matching the bluetooth block.
2026-10-02 17:18:40 +10:00
alvinlollo 8501a60165 fix(installer): chown target files by numeric id, not live-medium name
The end-4 step's chowns ran on the live medium, whose /etc/passwd has
no $USERNAME (the user exists only inside /mnt), so 'chown -R
alvin:alvin' failed with "invalid user" and the ERR trap aborted the
install at line 543. Resolve uid/gid once via arch-chroot id and chown
by number; the three remaining name-based chowns (fork/fish/hypr
restores) would have hit the same wall later.

Replace those three mid-function chowns with one catch-all over the
target home after the last root-side write: sed -i on the presets
rewrites through a temp file, which leaves them root-owned with no
chown after it.

systemctl --user enable ydotool.service could never work inside the
chroot (no /run/user/UID/bus exists before boot; it only ever warned
with "Failed to connect to user scope bus", so ydotool never
autostarted). Write the symlink enable would write:
~/.config/systemd/user/default.target.wants/ydotool.service ->
/usr/lib/systemd/user/ydotool.service.
2026-10-02 17:05:19 +10:00
alvinlollo 7c601ca53d ci: log HTTP status and response body on ISO upload failure
Tests / tests (push) Failing after 2m30s
`curl -f` swallowed Gitea's error response, so the 3-attempt upload
failure on the 6330 MiB ISO reported nothing diagnosable. Capture the
status code via -w, print up to 2 KB of the response body for both
HTTP-level and transport-level failures, and clear upload.json at the
start of each attempt so a stale body cannot be misreported.
2026-09-27 18:33:04 +10:00
alvinlollo f3bd10cf0f fix(iso): sweep ii-builder leftovers via NSpid before userdel
Tests / tests (push) Successful in 2m19s
end-4's ./setup sudo keepalive orphans a `sleep 60` child as ii-builder;
userdel then exits 8 and aborts the ISO build (CI exit 8).

Sweep uid-matching processes inside the build chroot before userdel,
mirroring shadow's user_busy_processes() checks (real/effective/saved
uid + root device/inode). Because arch-chroot mounts proc before
`unshare --fork --pid`, /proc entry numbers are outer-namespace pids:
signal the last NSpid field instead, require matching NSpid depth, and
surface kill errors instead of swallowing them. userdel keeps its stderr
and, on final failure, dumps the leftover process list before aborting.
2026-09-27 14:03:47 +10:00
alvinlollo 83ed87f6a9 feat(iso): build end-4 deps in-image, ship end4-pC as default shell
Tests / tests (push) Successful in 2m35s
- customize_airootfs.sh stages dots-hyprland at /opt, runs ./setup
  install-deps as a throwaway builder, harvests the built packages into
  /opt/localrepo so pacstrap resolves them offline
- image ships its own [local-aur] (file:///opt/localrepo); CI and
  localrepo/update.sh keep that copy in sync; .gitignore covers work/,
  out/ and airootfs/opt/localrepo/
- alvin-install runs ./setup install --skip-alldeps on the target
- clone pctrade/end4-pC into /etc/skel/.config/quickshell, patch qsConfig
  ii -> end4-pC in the staged variables.lua (guarded + idempotent), and
  restore the fork after setup rsync --delete's ~/.config/quickshell
- ship user presets in skel, point fish `q` alias at end4-pC
- AGENTS.md: document the fourth package source and new gotchas
2026-09-27 10:31:49 +10:00
alvinlollo 5ffd5d0d82 ci: pin SOURCE_DATE_EPOCH, assert ISO uuid metadata, verify uploads
Tests / tests (push) Canceled after 1m42s
- Export SOURCE_DATE_EPOCH before mkarchiso so label, volume UUID,
  file mtimes and ext4 hash seed trace to one timestamp.
- Post-build step: assert blkid UUID of the ISO matches every
  /boot/<uuid>.uuid stem and archisosearchuuid= reference inside
  shipped boot configs, and that no %ARCHISO% placeholder remains.
- After upload: re-hash local ISOs, size-check API assets, download
  each back from the internal origin (bypasses traefik/Anubis) with
  percent-encoded filenames (iso_name contains a space), compare
  SHA-256. Definitive corruption (missing/size/sha mismatch) deletes
  the release; transport/API errors fail without deleting.
2026-09-23 22:32:08 +10:00
alvinlollo 8484bddcf2 fix(installer): parse pkglist name field, skip unresolvable pkgs, keymap confirm
pacstrap failed at line 382 because pkglist lines from pacman -Q are
'name version' and were passed whole as pacman targets (~400 'target
not found'). Parse only the first field, pre-filter against pacman -Slq
so packages missing from the live repos (local-aur) are skipped with a
warning, and fall back to an unfiltered list if pacman -Syy fails.
Keymap screen now offers a US-layout confirm before the gum filter.
2026-09-23 22:32:01 +10:00
alvinlollo 0755091721 ci: add 3-try retry loop and timeouts for ISO release upload
Tests / tests (push) Successful in 2m17s
2026-09-22 22:06:33 +10:00
alvinlollo c71168371d fix(ci): upload plain ISO directly, skip zstd compression
Tests / tests (push) Successful in 2m22s
Compression was 5.3 GiB -> 5.2 GiB (98.6%) — negligible savings for
the extra build time. Upload the .iso directly as a release asset.
2026-09-21 19:56:07 +10:00
alvinlollo 117b5e97aa Add alvin-install TUI installer, fix NetworkManager boot
Tests / tests (push) Successful in 2m23s
- New gum-based installer script (alvin-install) with LUKS encryption,
  nmtui networking, disk selector, user/git config, and CachyOS repo setup
- Replace NetworkManager full unit file with symlink for consistency
- Add alvin-install reference to MOTD
- Add file_permissions entry in profiledef.sh
- Fix localrepo path case in pacman.conf
2026-09-20 22:22:20 +10:00
alvinlollo 8a88921913 fix: use linux-cachyos kernel in all boot entries
Tests / tests (push) Successful in 2m16s
Boot configs referenced stock vmlinuz-linux/initramfs-linux.img but
only linux-cachyos is installed. This caused boot to fall through
to memtest86+ since the kernel file was not found.
2026-09-20 17:02:20 +10:00
alvinlollo 9614192416 fix(ci): replace git LFS with release asset uploads
Tests / tests (push) Successful in 2m34s
The GITEA_TOKEN lacks 'lfs' scope, causing the LFS batch API to reject
uploads. Upload .zst files directly as release assets via the Gitea API
instead. This eliminates git-lfs, the separate releases repo, and all
LFS-related plumbing.
2026-09-20 13:24:37 +10:00
alvinlollo 2f1ac8d052 fix(ci): remove stderr suppression on push to diagnose LFS upload failure
Tests / tests (push) Successful in 2m21s
2026-09-20 10:24:51 +10:00
alvinlollo fa7eff8517 fix(ci): skip LFS smudge on releases repo clone
Tests / tests (push) Successful in 2m17s
2026-09-19 21:47:53 +10:00
alvinlollo 24f3f0f399 fix(ci): keep latest 2 releases instead of 3, clean up .releases-repo in always step
Tests / tests (push) Successful in 2m13s
2026-09-19 21:39:53 +10:00
alvinlollo ac59de33c8 fix(ci): move releases clone out of /tmp and free disk after LFS push
Tests / tests (push) Successful in 2m18s
2026-09-19 21:34:21 +10:00
alvinlollo 48b760d54e Update cleanup step name to match always() behavior
Tests / tests (push) Successful in 2m15s
2026-09-17 07:30:20 +10:00
alvinlollo 7f91c189db Mirror releases and seed README in AlvinArch-releases for discovery
Tests / tests (push) Successful in 2m22s
Create a matching git tag + release in alvinlollo/AlvinArch-releases next to
the main repo release, seed a short README there pointing back to
AlvinArch (workflow status badges on top), and extend release pruning to
the releases repo so both stay capped at 3.
2026-09-16 22:44:05 +10:00
alvinlollo 3816877b12 Fix ISO release uploads >3GB: zstd-compress and store via Git LFS in AlvinArch-releases
Release assets can no longer be attached directly (Gitea 500 on multi-GB
uploads). Compress each ISO with zstd, push the .zst into
alvinlollo/AlvinArch-releases (releases/<tag>/ on main) via Git LFS, verify
the LFS object server-side by OID, and create the release with a download
link plus SHA-256 checksums instead of a binary attachment.
2026-09-16 22:41:35 +10:00
alvinlollo c9cf5ead97 Remove conflicting os-release, move branding to profiledef.sh
Tests / tests (push) Successful in 2m30s
2026-09-16 17:13:07 +10:00
alvinlollo 01c7c4e1fa Harden ISO build workflow: verifiable upload, cleanup on cancel/exit
Tests / tests (push) Successful in 2m21s
2026-09-16 16:37:25 +10:00
alvinlollo d5356b772e Fix custom branding
Tests / tests (push) Successful in 4m18s
2026-09-16 15:44:38 +10:00
alvinlollo 1c4e28c0c4 Fix formatting 2026-09-15 15:37:40 +10:00
alvinlollo 0794001d68 Rename Workflow from "Checks" to "Tests" 2026-09-15 15:37:39 +10:00
alvinlollo 04fcfb2dc6 Rename "Checks" to "Tests" 2026-09-15 15:37:39 +10:00
alvinlollo ffa528744e Update status test badge 2026-09-15 15:37:38 +10:00
alvinlollo b696731132 Combine check-packages and syntax-check into one workflow 2026-09-15 15:37:38 +10:00
alvinlollo 12238a9d36 Add markdown statuses 2026-09-15 15:37:36 +10:00
alvinlollo 17987e3764 Fix script syntax 2026-09-15 15:37:36 +10:00
alvinlollo e00b4e00bf Make gitea actions run on push 2026-09-15 15:37:36 +10:00
alvinlollo df679c4377 Fix gitea workflows 2026-09-15 15:37:35 +10:00
alvinlollo 589da72194 Change Runner os to archlinux 2026-09-15 15:37:33 +10:00
alvinlollo 0aa143fe75 Add CachyOS keyrings and AUR packages 2026-09-15 15:37:24 +10:00
alvinlollo 9afaf4f18a Add Australian Locales 2026-09-15 15:37:22 +10:00
alvinlollo a2eebba9a5 Add soft custom branding 2026-09-15 15:37:21 +10:00
alvinlollo ffee0ed8bc Add Packages and Clamav config 2026-09-15 15:37:21 +10:00
alvinlollo 05c5a33b0c Add to packages.x86_64 use sort -u -o packages.x86_64 packages.x86_64 2026-09-15 15:37:20 +10:00
alvinlollo 4a8b2b1b1d Add packages.x86_64 use sort -u -o packages.x86_64 packages.x86_64 2026-09-15 15:37:20 +10:00
alvinlollo c6df3c0a42 Add README.md guide to make a Arch Linux ISO 2026-09-15 15:37:20 +10:00
alvinlollo 437c7cefa7 Copied default archiso releng configuration 2026-09-15 15:37:19 +10:00
alvinlollo 771a26c9ce first commit 2026-09-15 15:37:19 +10:00