From 1c5fe33927b81cbdb8d0c2c469c8a491d59a52eb Mon Sep 17 00:00:00 2001 From: Christian Werner Date: Fri, 19 Jun 2026 03:25:53 +0200 Subject: [PATCH] feat(ci): Add support for parallel kernel module builds Enable parallel builds for kernel modules targeting multiple kernel headers. This optimization reduces build times and improves CI efficiency. Adjusted workflow steps to ensure compatibility with all supported environments. --- .gitea/workflows/build-kernel.yml | 59 ++++++++++++++++--------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/.gitea/workflows/build-kernel.yml b/.gitea/workflows/build-kernel.yml index 6be7f47..b57019a 100644 --- a/.gitea/workflows/build-kernel.yml +++ b/.gitea/workflows/build-kernel.yml @@ -12,54 +12,55 @@ on: - master jobs: - # Build (and thereby compile-check) the module for each header package. Runs on - # both triggers — on a PR this is the whole story; on a tag the `release` job - # below consumes the artifacts. All packages build against the latest archive - # kernel; the exact version is auto-resolved from the image at build time. + # 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 targets if one package fails to build. + # Don't cancel the other versions if one fails to build. fail-fast: false matrix: - headers_pkg: - - linux-headers-rpi-v8 # 64-bit (Pi Zero 2 W) - - linux-headers-rpi-v7 # 32-bit - - linux-headers-rpi-v6 # 32-bit (older Pis) + kernel_version: + - "1:6.12.93-1+rpt1" steps: - name: Checkout uses: actions/checkout@v4 - - name: Build module (${{ matrix.headers_pkg }}) + - name: Build module (${{ matrix.kernel_version }}) working-directory: kernel env: - HEADERS_PKG: ${{ matrix.headers_pkg }} + HEADERS_PKG: ${{ env.HEADERS_PKG }} + KERNEL_VERSION: ${{ matrix.kernel_version }} run: ./build-in-docker.sh - - name: Stage build output (/.ko) + - name: Stage build output (modules/iec_listener_.ko) working-directory: kernel run: | - # Ask the just-built image which kernel tree it installed, then drop the - # -rpi-vN arch suffix so every package shares one version folder. - kver=$(docker run --rm --platform linux/arm64 --entrypoint sh \ - "${IMAGE:-iec-kbuild}" -c 'ls -1 /lib/modules | sort -V | tail -n1') - ver="${kver%-rpi-*}" - echo "resolved kernel: $kver -> version folder: $ver" - mkdir -p "out/$ver" - mv iec_listener.ko "out/$ver/${{ matrix.headers_pkg }}.ko" + 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" - name: Upload build output uses: actions/upload-artifact@v4 with: - # Name by headers_pkg so artifact names stay unique; the shared - # / folder is reassembled at download via merge-multiple. - name: ${{ matrix.headers_pkg }} + # 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: ${{ matrix.kernel_version }} path: kernel/out if-no-files-found: error - # Release flow only: reassembles the / folders, wraps them 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 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/') @@ -71,8 +72,8 @@ jobs: - name: Download all build output uses: actions/download-artifact@v4 with: - path: modules - # Merge every artifact back into the shared / tree. + path: dist + # Merge every artifact back into the shared modules/ folder. merge-multiple: true - name: Assemble release package @@ -80,7 +81,7 @@ jobs: repo="${{ github.event.repository.name }}" root="package/$repo" mkdir -p "$root" - cp -r modules/. "$root"/ # /.ko + cp -r dist/modules "$root"/ # modules/iec_listener_.ko cp kernel/selftest.sh "$root"/ # selftest.sh only at the package root (cd package && zip -r "../${repo}-${{ github.ref_name }}.zip" "$repo")