ci: split ISO into 1900M chunks for GH release upload

GH release asset size limit = 2 GiB. Veilor ISO ~2.8 GiB (KDE base +
hardening + grafted /veilor/ tree). zstd -19 only achieves 96.67%
compression (squashfs already xz-compressed). Splitting is the fix.

Workflow now:
- Splits ISO with `split -b 1900M -d --suffix-length=2`
- Drops original ISO before upload (would fail at >2 GiB)
- Includes per-part sha256 for reassembly verification
- Release notes include cat reassembly command

test/auto-install.sh will need follow-up commit to download + cat
the parts before booting.
This commit is contained in:
veilor-org 2026-05-02 22:49:19 +01:00
parent 73ac2cf96f
commit da08047172

View file

@ -169,14 +169,27 @@ jobs:
ls -lh "$ISO_NAME" ls -lh "$ISO_NAME"
# ── ISO publish ──────────────────────────────────────────────────── # ── ISO publish ────────────────────────────────────────────────────
# Use GitHub Releases (not Actions artifacts) for ISO storage. # GH Release asset size limit = 2 GiB. Our ISO ~2.8 GiB. Split into
# Reason: artifact quota maxed at 50GB on Pro tier with ~18 ISOs. # chunks before upload. Reassemble client-side via `cat *.part-* > x.iso`.
# Releases have effectively unlimited storage per public/private repo. # Squashfs is already near-incompressible (zstd -19 → 96%) so split,
# On every successful build of main, update the rolling `ci-latest` # not compress.
# prerelease draft. Tag releases (`v*.*.*`) get a separate proper - name: Split ISO into 2GiB chunks
# release. Build logs stay as artifacts (they're tiny + opt-in only if: success() && github.ref == 'refs/heads/main'
# on failure). run: |
- name: Publish ISO to ci-latest rolling prerelease cd build/out
ISO=$(ls *.iso | head -1)
[ -n "$ISO" ] || { echo "[ERR] no ISO"; exit 1; }
# Split with 1900M chunks (under 2 GiB safe). Suffix .part-aa, .part-ab, ...
split -b 1900M -d --suffix-length=2 "$ISO" "${ISO}.part-"
ls -lh
# Drop the original ISO so it doesn't try to upload (over limit)
rm -f "$ISO"
# Generate sha256 of all parts so reassembly is verifiable
sha256sum *.part-* > "${ISO}.parts.sha256"
echo "[OK] split into:"
ls "${ISO}".part-*
- name: Publish to ci-latest rolling prerelease
if: success() && github.ref == 'refs/heads/main' if: success() && github.ref == 'refs/heads/main'
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2
with: with:
@ -184,11 +197,20 @@ jobs:
name: "ci-latest (auto)" name: "ci-latest (auto)"
body: | body: |
Rolling auto-build from `main`. Latest commit: ${{ github.sha }}. Rolling auto-build from `main`. Latest commit: ${{ github.sha }}.
Replaces on every push. Not a stable release — for testing only.
**ISO is split into chunks (GH release 2 GiB asset limit).**
Reassemble:
```
cat veilor-os-*.iso.part-* > veilor-os.iso
sha256sum -c veilor-os-*.iso.parts.sha256
```
Or use `test/auto-install.sh` which handles reassembly automatically.
Not a stable release — for testing only.
prerelease: true prerelease: true
make_latest: false make_latest: false
files: | files: |
build/out/*.iso build/out/*.iso.part-*
build/out/*.sha256 build/out/*.sha256
# Build log on failure: print inline + skip artifact upload to avoid # Build log on failure: print inline + skip artifact upload to avoid