25 Commits
Author SHA1 Message Date
theupriser ceadf20a1b Merge pull request #14 from theupriser/feat/steamify
Sync git.upriser.nl mirror / sync (push) Skipped
Feat/steamify
2026-09-30 10:43:25 +02:00
theupriser 11e2ba62e9 ci: the Gitea flow only builds and releases; the VM tests run on GitHub
Sync git.upriser.nl mirror / sync (push) Skipped
2026-09-30 10:27:07 +02:00
theupriser 504f066a3f ci: the ISO's install test runs on Steam Machine hardware and on a plain PC (3 VMs at a time each, the plain PC after)
Sync git.upriser.nl mirror / sync (push) Skipped
2026-09-30 10:12:52 +02:00
theupriser a7f84cd5a0 ci: the test jobs use no actions (the runner's shared action clone broke parallel jobs); logs go into the job log
Sync git.upriser.nl mirror / sync (push) Skipped
2026-09-30 10:03:17 +02:00
theupriser 21e52ec81c ci: keep the install and serial logs of the boot loader VMs
Sync git.upriser.nl mirror / sync (push) Skipped
2026-09-30 09:43:12 +02:00
theupriser f37dcf6aa6 ci: the ISO's install test is a plain matrix again (one job per loader, 5 GB to install)
Sync git.upriser.nl mirror / sync (push) Skipped
2026-09-30 09:40:59 +02:00
theupriser 5dea6ac7d9 ci: the ISO flow only tests that the ISO installs correctly (vmbootloadertest.sh --quick)
Sync git.upriser.nl mirror / sync (push) Skipped
2026-09-30 09:38:42 +02:00
theupriser ea7cbfd179 ci: drop the suites stage from the ISO flow (steamify-cachyos tests steamify.sh in its own vmtest.yml)
Sync git.upriser.nl mirror / sync (push) Skipped
2026-09-30 09:33:09 +02:00
theupriser 02c207c9e5 ci: two fixed boot loader lanes (the runner ignores max-parallel)
Sync git.upriser.nl mirror / sync (push) Skipped
2026-09-30 09:02:23 +02:00
theupriser 13e4bbd0d6 ci: sync the git.upriser.nl mirror on every branch and tag
Sync git.upriser.nl mirror / sync (push) Skipped
2026-09-30 08:54:43 +02:00
theupriser 55a1c6ab61 ci: sync the git.upriser.nl mirror on pushes to master, feat/steamify and release branches (the mirror has no interval of its own)
Sync git.upriser.nl mirror / sync (push) Skipped
2026-09-30 08:54:06 +02:00
theupriser 85205dd614 ci: the suites' base VM is installed from the ISO this run built (Steamify step skipped); no CachyOS ISO download or cache 2026-09-30 08:46:11 +02:00
theupriser 34e3d2ae4a ci: the CachyOS ISO cache per CachyOS release again (the Steamify ISO of the run goes to the jobs as an artifact) 2026-09-30 08:43:23 +02:00
theupriser 448e2a5d79 ci: the CachyOS ISO cache gets an entry per workflow run 2026-09-30 08:43:07 +02:00
theupriser 2b72d90d30 ci: cache keys per ISO week instead of per run (no new multi-GB entry on every run) 2026-09-30 08:38:04 +02:00
theupriser af30018bd9 ci: cache pacman packages (build, test, suites), the VMs' packages and the CachyOS ISO 2026-09-30 08:29:41 +02:00
theupriser a74500b692 ci: a new run of the ISO workflow cancels the running one (one concurrency group, not per tag) 2026-09-30 08:28:27 +02:00
theupriser 779ee972cf ci: a suites stage after the boot loader tests (vmtest.sh: cli, menu, hw, installer, toggles on a plain CachyOS VM) 2026-09-30 08:27:34 +02:00
theupriser cfacfb2493 ci: 6 GB to install, 4 GB to test, 2 vCPUs: lean with headroom 2026-09-30 08:25:53 +02:00
theupriser d002c7d332 ci: lean test VMs: 2 vCPUs and 4 GB each, also to install 2026-09-30 08:25:28 +02:00
theupriser 028416b760 ci: 6 GB for the installer VM (VM_INSTALL_MEM) 2026-09-30 08:25:14 +02:00
theupriser 29ec7d2cde ci: boot loader test VMs keep their own RAM defaults (8 GB to install, 4 GB to test) 2026-09-30 08:24:27 +02:00
theupriser 8a98315bd5 ci: boot loader test VMs with 3 vCPUs each (the runner has 8 threads) 2026-09-30 08:24:06 +02:00
theupriser edb58b5ba9 ci: boot loader tests two at a time (8 GB VMs, ~20 GB of RAM) 2026-09-30 08:21:08 +02:00
theupriser e165202075 feat(ci): Gitea flow is build -> test (boot loader test per loader, parallel) -> release; drop upstream build.yml
iso-2-gitea-build.yml now has three jobs. The ISO goes between them as an artifact; the test job runs steamify-cachyos-dev's vmbootloadertest.sh --install for limine, systemd-boot and grub (needs /dev/kvm on the runner, fails at once with a reason without it); the release is only made when every test passed.
2026-09-30 08:20:51 +02:00
4 changed files with 116 additions and 154 deletions

No files matched your search

-141
View File
@@ -1,141 +0,0 @@
name: Desktop ISO
on:
push:
branches:
- master
pull_request:
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
jobs:
build:
# CachyOS's plain ISO and its quicktest matrix: only in CachyOS's own repo, not in this fork
# (the Steamify ISO is iso-2-gitea-build.yml).
if: github.repository == 'CachyOS/CachyOS-Live-ISO'
runs-on: ubuntu-latest
container:
image: archlinux:base-devel
options: --privileged
name: Build
outputs:
builddate: ${{ steps.date.outputs.builddate }}
steps:
- name: Get build date
id: date
run: |
echo "builddate=$(date +'%y%m%d')" >> $GITHUB_OUTPUT
- name: Clone CachyOS-Live-ISO
id: clone
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Add CachyOS keyring
id: keyring
run: |
pacman-key --init
pacman-key --recv-keys F3B607488DB35A47 --keyserver keyserver.ubuntu.com
pacman-key --lsign-key F3B607488DB35A47
sed -i '/^\[core\]$/i[cachyos]\nServer = https://mirror.cachyos.org/repo/$arch/$repo\n' /etc/pacman.conf
- name: Install dependencies
id: dependencies
run: |
sudo pacman -Syu --noconfirm archiso cachyos-keyring mkinitcpio-archiso squashfs-tools grub
- name: Create build user
id: user-archiso
run: |
useradd builder -m
echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
chmod -R a+rw .
- name: Build ISO (${{ steps.date.outputs.builddate }})
id: build
run: |
sudo -H -E -u builder ./buildiso.sh
- name: Upload ISO to artifacts
id: upload
uses: actions/upload-artifact@v4
with:
name: cachyos-desktop-linux-${{ steps.date.outputs.builddate }}
path: out/desktop/*
quicktest:
name: Testing (${{ matrix.bootloader }} / ${{ matrix.filesystem }})
runs-on: ubuntu-latest
needs: build
container:
image: archlinux:base-devel
options: --privileged
strategy:
fail-fast: false
max-parallel: 4
matrix:
bootloader: [grub, systemd-boot, refind, limine]
filesystem: [btrfs, xfs, ext4, f2fs, zfs]
steps:
- name: Clone CachyOS-Live-ISO
id: clone
uses: actions/checkout@v6
- name: Install dependencies
id: dependencies
run: |
pacman -Syu --noconfirm git ffmpeg imagemagick tesseract-data-eng qemu-desktop
- name: Create build user
id: user
run: |
useradd builder -m
echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
chmod -R a+rw .
- name: Build quickemu
id: quickemu
run: |
sudo -u builder git clone https://aur.archlinux.org/quickemu.git
cd quickemu
sudo -H -E -u builder makepkg --syncdeps --noconfirm
pacman -U --noconfirm quickemu*.pkg.tar.zst
cd ..
- name: Clone quicktest
id: clone-quicktest
uses: actions/checkout@v6
with:
repository: 'quickemu-project/quicktest'
path: 'quicktest'
- name: Download ISO
id: download
uses: actions/download-artifact@v4
with:
path: machines/cachyos-dailylive
merge-multiple: true
- name: Run quicktest
id: quicktest
run: |
./quicktest/quicktest test_install_calamares cachyos dailylive
env:
QT_NOTIFY: "false"
QT_OPEN_RESULTS: "false"
QT_QUICKGET_SKIP: "true"
QT_TESTCASES_DIR: "./testcases"
QUICKEMU_DISPLAY: "none"
QUICKEMU_VM_DIR: "./machines"
TEST_BOOTLOADER: "${{ matrix.bootloader }}"
TEST_FILESYSTEM: "${{ matrix.filesystem }}"
- name: Upload results to artifacts
id: upload-results
if: always()
uses: actions/upload-artifact@v4
with:
name: cachyos-desktop-linux-results-${{needs.build.outputs.builddate}}-${{ matrix.bootloader }}-${{ matrix.filesystem }}
path: results/*
+26
View File
@@ -0,0 +1,26 @@
name: Sync git.upriser.nl mirror
# Trigger the Gitea pull-mirror immediately instead of waiting for its interval,
# so Gitea builds/tests right after any branch or tag lands on GitHub (the mirror has no sync interval of its own).
on:
push:
branches: ['**']
tags: ['*']
workflow_dispatch:
jobs:
sync:
# Gitea also reads .github/workflows on the mirror; only run on GitHub
if: github.server_url == 'https://github.com'
runs-on: ubuntu-latest
steps:
- name: Trigger mirror-sync
env:
GITEA_URL: ${{ secrets.GIT_UPRISER_URL }}
GIT_UPRISER_TOKEN: ${{ secrets.GIT_UPRISER_TOKEN }}
# Gitea "owner/repo"; defaults to the same path as on GitHub
GITEA_REPO: ${{ vars.GITEA_REPO || github.repository }}
run: |
curl --fail-with-body -sS --retry 5 --retry-delay 10 --retry-all-errors -X POST \
-H "Authorization: token ${GIT_UPRISER_TOKEN}" \
"${GITEA_URL%/}/api/v1/repos/${GITEA_REPO}/mirror-sync"
+85 -10
View File
@@ -4,6 +4,8 @@
# checksums and package list to the mirror's release for that tag. The tag names the Steamify version and # checksums and package list to the mirror's release for that tag. The tag names the Steamify version and
# the time: v<steamify>-<YYYY.MM.DD>-<HHMM> (master) or v<steamify>-dev.<...> (feat/steamify, a pre-release); # the time: v<steamify>-<YYYY.MM.DD>-<HHMM> (master) or v<steamify>-dev.<...> (feat/steamify, a pre-release);
# the ISO gets exactly that Steamify release, and its label the same moment. GitHub skips it. # the ISO gets exactly that Steamify release, and its label the same moment. GitHub skips it.
# Two jobs: build the ISO -> release it. The VM tests run on GitHub (steamify-cachyos vmtest.yml, the newest ISO release of
# this mirror), where the runners are bigger.
# The runner needs privileged containers (archiso mounts loop devices) and ~20 GB of disk; Gitea's # The runner needs privileged containers (archiso mounts loop devices) and ~20 GB of disk; Gitea's
# [repository.release] FILE_MAX_SIZE must allow the ISO (default 2 GB). # [repository.release] FILE_MAX_SIZE must allow the ISO (default 2 GB).
name: ISO 2/2 · Build and publish (Gitea) name: ISO 2/2 · Build and publish (Gitea)
@@ -13,12 +15,14 @@ on:
tags: ['v*'] tags: ['v*']
workflow_dispatch: workflow_dispatch:
# One run at a time for the whole workflow (not per tag): a new run stops the running one and takes over.
concurrency: concurrency:
group: steamify-iso-${{ github.ref }} group: steamify-iso
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
iso: build:
name: Build the ISO
if: github.server_url != 'https://github.com' if: github.server_url != 'https://github.com'
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: container:
@@ -27,12 +31,86 @@ jobs:
defaults: defaults:
run: run:
shell: bash shell: bash
outputs:
steamify: ${{ steps.tag.outputs.steamify }}
steps:
# First only what the cache action needs (node, git), then the caches, then the rest from the restored cache.
- name: Node and git
id: node
run: |
pacman-key --init && pacman-key --populate
pacman -Syu --noconfirm --needed nodejs git
# The caches' keys: one entry per ISO week (an exact hit saves nothing, a new week restores the old one and saves once).
echo "week=$(date -u +%G-%V)" >> "$GITHUB_OUTPUT"
- name: Cache - pacman packages
uses: actions/cache@v4
with:
path: /var/cache/pacman/pkg
key: pacman-build-${{ steps.node.outputs.week }}
restore-keys: pacman-build-
- name: Tools
run: pacman -S --noconfirm --needed archiso mkinitcpio-archiso squashfs-tools grub sudo curl jq
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Version and time from the tag
id: tag
run: |
tag="${{ github.ref_name }}"
[[ "$tag" =~ ^v([0-9]+\.[0-9]+\.[0-9]+)-(dev\.)?([0-9]{4})\.([0-9]{2})\.([0-9]{2})-([0-9]{4})$ ]] ||
{ echo "::error::$tag is not a Steamify ISO release tag (v<steamify>-[dev.]<YYYY.MM.DD>-<HHMM>)"; exit 1; }
m=("${BASH_REMATCH[@]}")
{
echo "STEAMIFY_VERSION=${m[1]}"
# One moment for the ISO's label (profiledef.sh) and the release's name: the tag's (UTC).
echo "STEAMIFY_BUILD_STAMP=${m[3]}${m[4]}${m[5]}_${m[6]}"
echo "ISO_PRERELEASE=$([ -n "${m[2]}" ] && echo true || echo false)"
# The ISO's file name: the tag without its v (profiledef.sh).
echo "STEAMIFY_ISO_VERSION=${tag#v}"
} >> "$GITHUB_ENV"
echo "steamify=${m[1]}" >> "$GITHUB_OUTPUT"
- name: Steamify on the ISO (the version the tag names)
run: ./steamify-prepare.sh
- name: Build
run: |
./build-live-modules.sh
./build-calamares-modules.sh
./buildiso.sh -p desktop -w || ./buildiso.sh -p desktop -c -w
- name: Keep the ISO for the tests and the release
uses: christopherhx/gitea-upload-artifact@v4
with:
name: iso
path: |
out/desktop/*.iso
out/desktop/*.iso.sha256
out/desktop/*.iso.sha1
out/desktop/*.pkgs.txt
retention-days: 3
release:
name: Release
needs: build
runs-on: ubuntu-latest
container:
image: docker.io/cachyos/cachyos:latest
defaults:
run:
shell: bash
steps: steps:
- name: Tools - name: Tools
run: | run: |
pacman-key --init && pacman-key --populate pacman-key --init && pacman-key --populate
# nodejs: the actions below run in this container # nodejs: the actions below run in this container
pacman -Syu --noconfirm --needed archiso mkinitcpio-archiso git squashfs-tools grub sudo nodejs curl jq pacman -Syu --noconfirm --needed git nodejs curl jq
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
@@ -53,14 +131,11 @@ jobs:
echo "STEAMIFY_ISO_VERSION=${tag#v}" echo "STEAMIFY_ISO_VERSION=${tag#v}"
} >> "$GITHUB_ENV" } >> "$GITHUB_ENV"
- name: Steamify on the ISO (the version the tag names)
run: ./steamify-prepare.sh
- name: Build - uses: christopherhx/gitea-download-artifact@v4
run: | with:
./build-live-modules.sh name: iso
./build-calamares-modules.sh path: out/desktop
./buildiso.sh -p desktop -w || ./buildiso.sh -p desktop -c -w
- name: Release name and notes - name: Release name and notes
id: rel id: rel
+5 -3
View File
@@ -118,8 +118,9 @@ Full write-up, with every trap: `steamify-iso-release` in steamify-cachyos-dev.
release, whose `bundle.yml` needs the secret `ISO_DISPATCH_TOKEN`) names the release: the Steamify version plus release, whose `bundle.yml` needs the secret `ISO_DISPATCH_TOKEN`) names the release: the Steamify version plus
GitHub's UTC time, `vX.Y.Z-[dev.]YYYY.MM.DD-HHMM`, an **annotated** tag and a release with notes and the direct GitHub's UTC time, `vX.Y.Z-[dev.]YYYY.MM.DD-HHMM`, an **annotated** tag and a release with notes and the direct
download link. `feat/steamify` makes a `dev.` pre-release, `master` a real one. download link. `feat/steamify` makes a `dev.` pre-release, `master` a real one.
- `.github/workflows/iso-2-gitea-build.yml` (Gitea, `on: push: tags: v*`, skipped on GitHub) builds the ISO for that - `.github/workflows/iso-2-gitea-build.yml` (Gitea, `on: push: tags: v*`, skipped on GitHub) runs two jobs for that
tag and attaches it to the mirror's release. The tag decides everything: Steamify version (`steamify-prepare.sh` tag: build the ISO, then attach it to the mirror's release. It is not tested there (the runner is small): the VM tests
run on GitHub, in steamify-cachyos `vmtest.yml`, on the newest ISO release of the mirror. The tag decides everything: Steamify version (`steamify-prepare.sh`
takes `STEAMIFY_VERSION`), file name (`STEAMIFY_ISO_VERSION` -> `iso_version` in `profiledef.sh`), label takes `STEAMIFY_VERSION`), file name (`STEAMIFY_ISO_VERSION` -> `iso_version` in `profiledef.sh`), label
(`STEAMIFY_BUILD_STAMP`), boot menu and `/etc/steammachine-iso-build`. The build reads no clock; without a (`STEAMIFY_BUILD_STAMP`), boot menu and `/etc/steammachine-iso-build`. The build reads no clock; without a
tag everything says `local`. tag everything says `local`.
@@ -129,4 +130,5 @@ Full write-up, with every trap: `steamify-iso-release` in steamify-cachyos-dev.
GitHub doesn't have, and the release with them. GitHub releases can't hold the ISO (2 GB per file). GitHub doesn't have, and the release with them. GitHub releases can't hold the ISO (2 GB per file).
- Gitea needs `[repository.release] FILE_MAX_SIZE` above the ISO (413 otherwise) and the runner - Gitea needs `[repository.release] FILE_MAX_SIZE` above the ISO (413 otherwise) and the runner
`container: privileged: true` (archiso mounts `/proc`); the workflow's `--privileged` option is ignored. `container: privileged: true` (archiso mounts `/proc`); the workflow's `--privileged` option is ignored.
- CachyOS's own `Desktop ISO` workflow (`build.yml`) only runs in `CachyOS/CachyOS-Live-ISO`. - Caches (`actions/cache`, the runner's cache server): pacman's package cache per job kind (build, test) and the VMs' packages (`VM_CACHE`, `~/vms/pkg-cache`), keys per ISO week. Each job first installs only node and git, restores the caches, then installs the rest.
- CachyOS's own `Desktop ISO` workflow (`build.yml`) is removed here; the VM tests live in steamify-cachyos (GitHub).