Replaced the versioned action reference with a direct link to the Gitea release action repository. This ensures the workflow uses the latest source and improves maintainability by directly linking to the action author's repository.
117 lines
4.6 KiB
YAML
117 lines
4.6 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:
|
|
kernel_version:
|
|
- "1:6.12.93-1+rpt1"
|
|
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 }}
|
|
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 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: actions/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
|