comodore-iec-emu/.gitea/workflows/build-kernel.yml
Christian Werner 914c92bdea
Some checks failed
Build kernel module / build (1:6.12.93-1+rpt1, bookworm) (pull_request) Successful in 8m4s
Build kernel module / build (1:6.18.34-1+rpt1, trixie) (pull_request) Failing after 2m31s
Build kernel module / release (pull_request) Has been skipped
feat(kernel): Add support for Debian suite configuration
Introduce `DEBIAN_SUITE` as a configurable argument in the Dockerfile, build
script, and CI workflow to align kernel builds with the target Raspberry Pi
OS release. Updated documentation to clarify the relationship between
suite versions and kernel compatibility.
2026-06-19 20:45:15 +02:00

125 lines
5.1 KiB
YAML

name: Build kernel module
on:
# Release flow: triggered when a version tag is pushed (tag a commit on master).
# Builds every target and publishes the modules to a Gitea release.
push:
tags:
- 'v*'
# Compile-check flow: every PR that targets master. Builds only, no release.
pull_request:
branches:
- master
jobs:
# Build (and thereby compile-check) the module for each pinned kernel version.
# Runs on both triggers — on a PR this is the whole story; on a tag the
# `release` job below consumes the artifacts.
#
# HEADERS_PKG is fixed to linux-headers-rpi-v8 (64-bit, Pi Zero 2 W): the -v6/-v7
# headers are 32-bit (armhf) and aren't carried by the arm64 raspberrypi archive
# this arm64 builder uses.
build:
runs-on: ubuntu-latest
env:
HEADERS_PKG: linux-headers-rpi-v8
strategy:
# Don't cancel the other versions if one fails to build.
fail-fast: false
matrix:
# Each raspberrypi archive suite only carries its own latest kernel, so
# the Debian base suite is paired with the kernel version it can install:
# bookworm -> 6.12.x, trixie -> 6.18.x.
include:
- kernel_version: "1:6.12.93-1+rpt1"
suite: bookworm
- kernel_version: "1:6.18.34-1+rpt1"
suite: trixie
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build module (${{ matrix.kernel_version }})
working-directory: kernel
env:
HEADERS_PKG: ${{ env.HEADERS_PKG }}
KERNEL_VERSION: ${{ matrix.kernel_version }}
DEBIAN_SUITE: ${{ matrix.suite }}
run: |
set -eux
# arm64 emulation for the builder image (no-op if already registered).
if [ ! -e /proc/sys/fs/binfmt_misc/qemu-aarch64 ]; then
docker run --privileged --rm tonistiigi/binfmt --install arm64
fi
# Builder image: toolchain + matching raspberrypi kernel headers.
docker build --platform linux/arm64 \
--build-arg DEBIAN_SUITE="$DEBIAN_SUITE" \
--build-arg HEADERS_PKG="$HEADERS_PKG" \
--build-arg KERNEL_VERSION="$KERNEL_VERSION" \
-t iec-kbuild .
# Compile inside the container. We use `docker cp` instead of the bind
# mount that build-in-docker.sh uses for local builds: under the runner's
# docker-in-docker, /workspace is a volume the host daemon can't see, so
# `-v "$PWD:/build"` mounts an empty dir and make finds no Makefile.
cid=$(docker create --platform linux/arm64 --entrypoint sleep iec-kbuild infinity)
docker start "$cid"
docker cp ./. "$cid:/build"
docker exec "$cid" /usr/local/bin/docker-entrypoint.sh clean
docker exec "$cid" /usr/local/bin/docker-entrypoint.sh
docker cp "$cid:/build/iec_listener.ko" ./iec_listener.ko
docker rm -f "$cid"
- name: Stage build output (modules/iec_listener_<kernel_version>.ko)
working-directory: kernel
run: |
ver="${{ matrix.kernel_version }}"
safe="${ver//[:\/]/-}" # path-friendly: 1:6.12.93-1+rpt1 -> 1-6.12.93-1+rpt1
echo "kernel version $ver -> file modules/iec_listener_${safe}.ko"
mkdir -p out/modules
mv iec_listener.ko "out/modules/iec_listener_${safe}.ko"
# Expose the path-friendly name for the (colon-rejecting) artifact name.
echo "SAFE_VER=$safe" >> "$GITHUB_ENV"
- name: Upload build output
uses: https://github.com/christopherHX/gitea-upload-artifact@v4
with:
# Name by the path-friendly version so artifact names stay unique; all
# of them merge back into the single modules/ folder at download time.
name: ${{ env.SAFE_VER }}
path: kernel/out
if-no-files-found: error
# Release flow only: merges all built modules into one modules/ folder, wraps it
# in a single repo-named top folder alongside selftest.sh, zips it and attaches
# it to the Gitea release for the pushed tag. Skipped entirely on pull requests.
release:
needs: build
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download all build output
uses: https://github.com/christopherHX/gitea-download-artifact@v4
with:
path: dist
# Merge every artifact back into the shared modules/ folder.
merge-multiple: true
- name: Assemble release package
run: |
repo="${{ github.event.repository.name }}"
root="package/$repo"
mkdir -p "$root"
cp -r dist/modules "$root"/ # modules/iec_listener_<kernel_version>.ko
cp kernel/selftest.sh "$root"/ # selftest.sh only at the package root
(cd package && zip -r "../${repo}-${{ github.ref_name }}.zip" "$repo")
- name: Publish to Gitea release
uses: https://gitea.com/actions/gitea-release-action@v1.3.6
with:
api_key: ${{ secrets.GITEA_TOKEN }}
files: |-
*.zip