From 71ec4fa220817f0b5a91ece85e6b792c7b06cabc Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 1 Feb 2026 08:35:31 +0100 Subject: [PATCH 1/6] .github: add arm_defconfig and arm_minimal_defconfig builds Catch ARM 32-bit build regressions early by adding arm targets to the familty of Infix image and release builds. Signed-off-by: Joachim Wiberg --- .github/workflows/build-release.yml | 2 +- .github/workflows/trigger.yml | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 85b729c1e..a3005b923 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -20,7 +20,7 @@ jobs: runs-on: [self-hosted, release] strategy: matrix: - target: [aarch64, x86_64] + target: [aarch64, arm, x86_64] fail-fast: false steps: - name: Cleanup podman state diff --git a/.github/workflows/trigger.yml b/.github/workflows/trigger.yml index b01c308d7..5a7a9f803 100644 --- a/.github/workflows/trigger.yml +++ b/.github/workflows/trigger.yml @@ -28,6 +28,7 @@ jobs: outputs: x86_64_target: ${{ steps.set-targets.outputs.x86_64_target }} aarch64_target: ${{ steps.set-targets.outputs.aarch64_target }} + arm_target: ${{ steps.set-targets.outputs.arm_target }} steps: - run: | echo "Triggering build, logging meta data ..." @@ -43,9 +44,11 @@ jobs: | grep -q "ci:main"; then echo "x86_64_target=x86_64_minimal" >> $GITHUB_OUTPUT echo "aarch64_target=aarch64_minimal" >> $GITHUB_OUTPUT + echo "arm_target=arm_minimal" >> $GITHUB_OUTPUT else echo "x86_64_target=x86_64" >> $GITHUB_OUTPUT echo "aarch64_target=aarch64" >> $GITHUB_OUTPUT + echo "arm_target=arm" >> $GITHUB_OUTPUT fi build-x86_64: @@ -62,6 +65,13 @@ jobs: name: "infix" target: ${{ needs.check-trigger.outputs.aarch64_target }} + build-arm: + needs: check-trigger + uses: ./.github/workflows/build.yml + with: + name: "infix" + target: ${{ needs.check-trigger.outputs.arm_target }} + test-run-x86_64: needs: [check-trigger, build-x86_64] uses: ./.github/workflows/test.yml From 65b674855af93fc8fd6ea45759e1a58a1273ca9e Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 1 Feb 2026 08:36:34 +0100 Subject: [PATCH 2/6] .github: add rpi2 bootloader and SD card image builds Add Raspberry Pi 2B to the bootloader build matrix and raspberrypi-rpi2 to the SD card image builder, enabling full RPi 2B image creation. Signed-off-by: Joachim Wiberg --- .github/workflows/build-boot.yml | 1 + .github/workflows/build-image.yml | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/.github/workflows/build-boot.yml b/.github/workflows/build-boot.yml index 9ae6f0671..1a8a849f1 100644 --- a/.github/workflows/build-boot.yml +++ b/.github/workflows/build-boot.yml @@ -22,6 +22,7 @@ jobs: - cn9130_crb_boot - fireant_boot - nanopi_r2s_boot + - rpi2_boot - rpi64_boot env: MAKEFLAGS: -j5 diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml index b9e8a8a4c..d73f91540 100644 --- a/.github/workflows/build-image.yml +++ b/.github/workflows/build-image.yml @@ -8,6 +8,7 @@ on: type: choice required: true options: + - raspberrypi-rpi2 - raspberrypi-rpi64 - bananapi-bpi-r3 - friendlyarm-nanopi-r2s @@ -49,6 +50,11 @@ jobs: - name: Set bootloader and target based on board run: | case "${{ inputs.board }}" in + raspberrypi-rpi2) + echo "BOOTLOADER=rpi2-boot" >> $GITHUB_ENV + echo "ARCH=arm" >> $GITHUB_ENV + echo "BUILD_EMMC=false" >> $GITHUB_ENV + ;; raspberrypi-rpi64) echo "BOOTLOADER=rpi64-boot" >> $GITHUB_ENV echo "ARCH=aarch64" >> $GITHUB_ENV From 0c11cea07b512977b9c4cd8c47e72d8946fba3ce Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Thu, 5 Feb 2026 08:34:47 +0100 Subject: [PATCH 3/6] .github: refactor, simplify, and reduce duplication in actions Signed-off-by: Joachim Wiberg --- .github/actions/cache-restore/action.yml | 41 +++++++++++++++++++++++ .github/actions/podman-cleanup/action.yml | 15 +++++++++ .github/workflows/build-boot.yml | 21 +++--------- .github/workflows/build-release.yml | 32 +++--------------- .github/workflows/build.yml | 28 +++------------- .github/workflows/inventory.yml | 18 ++-------- .github/workflows/release.yml | 12 ++----- .github/workflows/test.yml | 12 ++----- .github/workflows/trigger.yml | 2 +- 9 files changed, 77 insertions(+), 104 deletions(-) create mode 100644 .github/actions/cache-restore/action.yml create mode 100644 .github/actions/podman-cleanup/action.yml diff --git a/.github/actions/cache-restore/action.yml b/.github/actions/cache-restore/action.yml new file mode 100644 index 000000000..02a8e1a6f --- /dev/null +++ b/.github/actions/cache-restore/action.yml @@ -0,0 +1,41 @@ +name: 'Restore Build Caches' +description: 'Restore dl/ and .ccache/ caches for Buildroot builds' +inputs: + target: + description: 'Build target for cache key differentiation' + required: true + dl-prefix: + description: 'Prefix for dl/ cache key (e.g., "dl", "dl-boot")' + required: false + default: 'dl' + ccache-prefix: + description: 'Prefix for .ccache/ cache key (e.g., "ccache", "ccache-boot")' + required: false + default: 'ccache' + enabled: + description: 'Set to false to skip cache restoration' + required: false + default: 'true' +runs: + using: 'composite' + steps: + - name: Restore Cache of dl/ + if: ${{ inputs.enabled == 'true' }} + uses: actions/cache@v4 + with: + path: dl/ + key: ${{ inputs.dl-prefix }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }} + restore-keys: | + ${{ inputs.dl-prefix }}- + dl- + + - name: Restore Cache of .ccache/ + if: ${{ inputs.enabled == 'true' }} + uses: actions/cache@v4 + with: + path: .ccache/ + key: ${{ inputs.ccache-prefix }}-${{ inputs.target }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }} + restore-keys: | + ${{ inputs.ccache-prefix }}-${{ inputs.target }}- + ${{ inputs.ccache-prefix }}- + ccache- diff --git a/.github/actions/podman-cleanup/action.yml b/.github/actions/podman-cleanup/action.yml new file mode 100644 index 000000000..fc9a64877 --- /dev/null +++ b/.github/actions/podman-cleanup/action.yml @@ -0,0 +1,15 @@ +name: 'Podman Cleanup' +description: 'Clean up stale podman state from previous runs' +runs: + using: 'composite' + steps: + - name: Cleanup podman state + shell: bash + run: | + set -x + podman ps -a || true + podman stop -a || true + podman rm -a -f || true + podman volume prune -f || true + podman system prune -a -f || true + podman system migrate || true diff --git a/.github/workflows/build-boot.yml b/.github/workflows/build-boot.yml index 1a8a849f1..f138fd9e1 100644 --- a/.github/workflows/build-boot.yml +++ b/.github/workflows/build-boot.yml @@ -64,24 +64,11 @@ jobs: echo "Building ${defconfig}_defconfig, version ${version}-${rev}, artifact ${archive} ..." - - name: Restore Cache of dl/ - uses: actions/cache@v4 + - uses: ./.github/actions/cache-restore with: - path: dl/ - key: dl-boot-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }} - restore-keys: | - dl-boot- - dl- - - - name: Restore Cache of .ccache/ - uses: actions/cache@v4 - with: - path: .ccache/ - key: ccache-boot-${{ matrix.defconfig }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }} - restore-keys: | - ccache-boot-${{ matrix.defconfig }}- - ccache-boot- - ccache- + target: ${{ matrix.defconfig }} + dl-prefix: dl-boot + ccache-prefix: ccache-boot - name: Configure ${{ matrix.defconfig }}_defconfig run: | diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index a3005b923..1c8139478 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -23,21 +23,13 @@ jobs: target: [aarch64, arm, x86_64] fail-fast: false steps: - - name: Cleanup podman state - run: | - set -x - podman ps -a || true - podman stop -a || true - podman rm -a -f || true - podman volume prune -f || true - podman system prune -a -f || true - podman system migrate || true - - uses: actions/checkout@v4 with: clean: true submodules: recursive + - uses: ./.github/actions/podman-cleanup + - name: Set Release Variables id: vars run: | @@ -48,24 +40,10 @@ jobs: echo "dir=infix-$target" >> $GITHUB_OUTPUT echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT - - name: Restore Cache of dl/ - if: ${{ inputs.use_cache }} - uses: actions/cache@v4 - with: - path: dl/ - key: dl-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }} - restore-keys: | - dl- - - - name: Restore Cache of .ccache/ - if: ${{ inputs.use_cache }} - uses: actions/cache@v4 + - uses: ./.github/actions/cache-restore with: - path: .ccache/ - key: ccache-${{ matrix.target }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }} - restore-keys: | - ccache-${{ matrix.target }}- - ccache- + target: ${{ matrix.target }} + enabled: ${{ inputs.use_cache }} - name: Configure & Build env: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ef78e0594..538961f4b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -78,15 +78,6 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - name: Cleanup podman state - run: | - set -x - podman ps -a || true - podman stop -a || true - podman rm -a -f || true - podman volume prune -f || true - podman system prune -a -f || true - podman system migrate || true - name: Checkout infix repo uses: actions/checkout@v4 @@ -98,6 +89,8 @@ jobs: submodules: recursive token: ${{ secrets.CHECKOUT_TOKEN || github.token }} + - uses: ./.github/actions/podman-cleanup + - name: Run pre-build script if: ${{ inputs.pre_build_script != '' }} run: | @@ -127,22 +120,9 @@ jobs: echo "tgz=${name}-${target}.tar.gz" >> $GITHUB_OUTPUT echo "Building target ${target}_defconfig" - - name: Restore Cache of dl/ - uses: actions/cache@v4 - with: - path: dl/ - key: dl-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }} - restore-keys: | - dl- - - - name: Restore Cache of .ccache/ - uses: actions/cache@v4 + - uses: ./.github/actions/cache-restore with: - path: .ccache/ - key: ccache-${{ env.TARGET }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }} - restore-keys: | - ccache-${{ env.TARGET }}- - ccache- + target: ${{ env.TARGET }} - name: Configure ${{ env.TARGET }} run: | diff --git a/.github/workflows/inventory.yml b/.github/workflows/inventory.yml index f0a6c68a2..e99afda82 100644 --- a/.github/workflows/inventory.yml +++ b/.github/workflows/inventory.yml @@ -45,22 +45,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Restore Cache of dl/ - uses: actions/cache@v4 + - uses: ./.github/actions/cache-restore with: - path: dl/ - key: dl-netconf-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }} - restore-keys: | - dl-netconf- - dl- - - name: Restore Cache of .ccache/ - uses: actions/cache@v4 - with: - path: .ccache/ - key: ccache-x86_64-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }} - restore-keys: | - ccache-x86_64- - ccache- + target: x86_64 + dl-prefix: dl-netconf - name: Disk inventory (2/2) ... run: | echo "df -h =========================================================================" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4975cdc9d..238f37afe 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -48,20 +48,12 @@ jobs: contents: write discussions: write steps: - - name: Cleanup podman state - run: | - set -x - podman ps -a || true - podman stop -a || true - podman rm -a -f || true - podman volume prune -f || true - podman system prune -a -f || true - podman system migrate || true - - uses: actions/checkout@v4 with: submodules: 'true' + - uses: ./.github/actions/podman-cleanup + - name: Set Release Variables id: rel run: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4f4b8c427..757d7e2a4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -60,16 +60,6 @@ jobs: name: Regression Test ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }} ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }} runs-on: [self-hosted, regression] steps: - - name: Cleanup podman state - run: | - set -x - podman ps -a || true - podman stop -a || true - podman rm -a -f || true - podman volume prune -f || true - podman system prune -a -f || true - podman system migrate || true - - name: Checkout infix repo uses: actions/checkout@v4 with: @@ -80,6 +70,8 @@ jobs: submodules: recursive token: ${{ secrets.CHECKOUT_TOKEN || github.token }} + - uses: ./.github/actions/podman-cleanup + - name: Run pre-test script if: ${{ inputs.pre_test_script != '' }} run: | diff --git a/.github/workflows/trigger.yml b/.github/workflows/trigger.yml index 5a7a9f803..4e68ae69c 100644 --- a/.github/workflows/trigger.yml +++ b/.github/workflows/trigger.yml @@ -1,4 +1,4 @@ -name: Kernelkit Trigger +name: CI on: pull_request: From f71bb73375eeed9b1ddf4d823da44dd9bf1b1aa9 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 1 Feb 2026 09:15:36 +0100 Subject: [PATCH 4/6] board/arm: add missing rootfs (empty) overlay Signed-off-by: Joachim Wiberg --- board/arm/rootfs/.empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 board/arm/rootfs/.empty diff --git a/board/arm/rootfs/.empty b/board/arm/rootfs/.empty new file mode 100644 index 000000000..e69de29bb From 8973dc488b06ed2d388e1e1885af04bc593e98a1 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 4 Feb 2026 10:47:15 +0100 Subject: [PATCH 5/6] test: ensure result of tests is the exit code of the rule Signed-off-by: Joachim Wiberg --- test/test.mk | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/test.mk b/test/test.mk index 0e8c528fe..fe440d8c3 100644 --- a/test/test.mk +++ b/test/test.mk @@ -30,10 +30,11 @@ endif test: $(test-dir)/env -r $(base) $(mode) $(binaries) $(pkg-$(ARCH)) \ - sh -c '$(ninepm) -v $(TESTS); \ - $(ninepm_report) github $(test-dir)/.log/last/result.json; \ + sh -c '$(ninepm) -v $(TESTS); rc=$?; \ + $(ninepm_report) github $(test-dir)/.log/last/result.json; \ $(ninepm_report) asciidoc $(test-dir)/.log/last/result.json; \ - chmod -R 777 $(test-dir)/.log' + chmod -R 777 $(test-dir)/.log; \ + exit $$rc' test-sh: $(test-dir)/env $(base) $(mode) $(binaries) $(pkg-$(ARCH)) -i /bin/sh From d1659dbbc136f059d9c12ca618578e84628fd31b Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 4 Feb 2026 15:43:38 +0100 Subject: [PATCH 6/6] test: fix missing IPv6 forwarding on tunnel in tunnel_basic Enable IPv6 forwarding on the left DUT's tunnel interface, matching the IPv4 tunnel config. Without it, IPv6 packets are not forwarded through the tunnel, causing all tunnel_basic IPv6 tests to fail. Regression introduced when fixing issue #515 in 717c1c0. Signed-off-by: Joachim Wiberg --- test/case/interfaces/tunnel_basic/test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/case/interfaces/tunnel_basic/test.py b/test/case/interfaces/tunnel_basic/test.py index 07506ea9a..12a00bf81 100755 --- a/test/case/interfaces/tunnel_basic/test.py +++ b/test/case/interfaces/tunnel_basic/test.py @@ -115,7 +115,8 @@ def __init__(self): "address": [{ "ip": "2001:db8:3c4d:30::1", "prefix-length": 64 - }] + }], + "forwarding": True }, CONTAINER_TYPE: container_left6 }]