Skip to content

Build

Build #106

Workflow file for this run

name: Build
on: [workflow_dispatch]
jobs:
build:
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, ubuntu-20.04]
kernel: [{ack: 0, version: 5.10.y}, {ack: 0, version: 5.15.y}, {ack: 0, version: 6.1.y}, {ack: 0, version: 6.6.y}, {ack: 1, version: android13-5.10-lts}, {ack: 1, version: android14-5.15-lts}]
arch: [arm64, x86_64]
runs-on: ${{ matrix.os }}
timeout-minutes: 100
env:
ACK: ${{ matrix.kernel.ack }}
ARCH: ${{ matrix.arch }}
outputs:
ARTIFACT_DIR: ${{ steps.vars.outputs.ARTIFACT_DIR }}
KERNEL_TYPE: ${{ steps.vars.outputs.KERNEL_TYPE }}
SHORT_HASH: ${{ steps.vars.outputs.SHORT_HASH }}
SUFFIX: ${{ steps.vars.outputs.SUFFIX }}
VERSION: ${{ steps.version.outputs.VERSION }}
steps:
- uses: actions/checkout@v4
- name: Get real kernel version
id: version
run: |
LINUX_URL=https://cdn.kernel.org/pub/linux/kernel
VERSION="${{ matrix.kernel.version }}"
first_char=${VERSION:0:1}
last_char=${VERSION: -1:1}
if [ $last_char == y ]; then
major_minor=${VERSION: 0:-1}
VERSION=$(curl -s $LINUX_URL/v${first_char}.x/ \
| sed -e 's/<[^>]*>//g' \
| grep -oP "linux-${major_minor}[0-9]+" \
| sort -r -V \
| head -n1 \
| cut -d '-' -f2)
fi
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
- name: Set output variables
id: vars
shell: bash
run: |
set -x
SHORT_HASH=$(git rev-parse --short HEAD)
if [ $ACK -eq 0 ]; then
KERNEL_TYPE=linux
OUT_DIR=out/linux/${ARCH}
else
KERNEL_TYPE=ack
OUT_DIR=out/ack/common/${ARCH}
fi
if [ $ARCH == x86_64 ]; then
# We need to use the real image in the x86 folder because caching
# doesn't work with symlinks
KERNEL_IMAGE="arch/x86/boot/bzImage"
elif [ $ARCH == arm64 ]; then
KERNEL_IMAGE="arch/arm64/boot/Image"
fi
SUFFIX=${KERNEL_TYPE}-${{ steps.version.outputs.VERSION }}-${{ matrix.arch }}
echo "SUFFIX=$SUFFIX" >> $GITHUB_OUTPUT
echo "SHORT_HASH=$SHORT_HASH" >> $GITHUB_OUTPUT
echo "OUT_DIR=$OUT_DIR" >> $GITHUB_OUTPUT
echo "KERNEL_TYPE=$KERNEL_TYPE" >> $GITHUB_OUTPUT
echo "KERNEL_IMAGE=$KERNEL_IMAGE" >> $GITHUB_OUTPUT
echo "FINAL_KERNEL_IMAGE_PATH=${OUT_DIR}/$(basename ${KERNEL_IMAGE})-${SUFFIX}" >> $GITHUB_OUTPUT
echo "FINAL_VMLINUX_PATH=${OUT_DIR}/vmlinux-${SUFFIX}" >> $GITHUB_OUTPUT
echo "FINAL_LINUX_HEADERS_PATH=${OUT_DIR}/linux-headers-${SUFFIX}.deb" >> $GITHUB_OUTPUT
echo "ARTIFACT_DIR=kernel-artifacts-${SUFFIX}" >> $GITHUB_OUTPUT
- name: Cache kernel image
id: cache-kernel
uses: actions/cache@v4
with:
key: ${{ matrix.os }}-${{ steps.vars.outputs.SUFFIX }}
path: |
${{ steps.vars.outputs.FINAL_KERNEL_IMAGE_PATH }}
${{ steps.vars.outputs.FINAL_VMLINUX_PATH }}
${{ steps.vars.outputs.FINAL_LINUX_HEADERS_PATH }}
- run: ls -lR
if: ${{ steps.cache-kernel.outputs.cache-hit == 'true' }}
- name: Build kernel
if: ${{ steps.cache-kernel.outputs.cache-hit != 'true' }}
uses: ./.github/actions/build-kernel
with:
os: ${{ matrix.os }}
arch: ${{ matrix.arch }}
ack: ${{ matrix.kernel.ack }}
kernel-version: ${{ steps.version.outputs.VERSION }}
- name: Rename kernel images
if: ${{ steps.cache-kernel.outputs.cache-hit != 'true' }}
run: |
mv ${{ steps.vars.outputs.OUT_DIR }}/${{ steps.vars.outputs.KERNEL_IMAGE }} ${{ steps.vars.outputs.FINAL_KERNEL_IMAGE_PATH }}
mv ${{ steps.vars.outputs.OUT_DIR }}/vmlinux ${{ steps.vars.outputs.FINAL_VMLINUX_PATH }}
mv ${{ steps.vars.outputs.OUT_DIR }}/../linux-headers-*.deb ${{ steps.vars.outputs.FINAL_LINUX_HEADERS_PATH }}
- name: Upload kernel image artifact
if: ${{ matrix.os == 'ubuntu-22.04' }}
uses: actions/upload-artifact@v4
with:
name: ${{ steps.vars.outputs.ARTIFACT_DIR }}
path: |
${{ steps.vars.outputs.FINAL_KERNEL_IMAGE_PATH }}
${{ steps.vars.outputs.FINAL_VMLINUX_PATH }}
${{ steps.vars.outputs.FINAL_LINUX_HEADERS_PATH }}
run:
needs: build
strategy:
fail-fast: false
matrix:
kernel: [{ack: 0, version: 5.10.y}, {ack: 0, version: 5.15.y}, {ack: 0, version: 6.1.y}, {ack: 1, version: android13-5.10-lts}]
arch: [arm64, x86_64]
timeout-minutes: 20
runs-on: ubuntu-22.04
env:
ACK: ${{ matrix.kernel.ack }}
ARCH: ${{ matrix.arch }}
steps:
- uses: actions/checkout@v4
- name: Download kernel artifacts
uses: actions/download-artifact@v4
with:
name: ${{ steps.vars.outputs.ARTIFACT_DIR }}
- run: ls -lR
- name: Install common dependencies
run: sudo apt update && sudo apt install -y debootstrap
- name: Install x86_64 dependencies
if: ${{ matrix.arch == 'x86_64' }}
run: sudo apt install -y qemu-system-x86
- name: Install arm64 dependencies
if: ${{ matrix.arch == 'arm64' }}
run: sudo apt install -y qemu-system-arm qemu-user-static binfmt-support
- name: Set output variables
id: vars
shell: bash
run: |
if [ $ARCH == x86_64 ]; then
IMAGE_NAME=bzImage-${{ needs.build.outputs.SUFFIX }}
else
IMAGE_NAME=Image-${{ needs.build.outputs.SUFFIX }}
fi
echo "IMAGE_NAME=$IMAGE_NAME" >> $GITHUB_OUTPUT
- name: Initialize rootfs and initramfs
run: |
set -x
make rootfs-init
ROOTFS=./alpine-${{ matrix.arch }}.img make rootfs-init
scripts/ubuntu_debootstrap.sh jammy ${{ matrix.arch }}
SUDO=1 ROOTFS_DIR=./rootfs/ubuntu-jammy-${{ matrix.arch }} CPIO_FILE=ubuntu-jammy-${{ matrix.arch }}.cpio.gz make rootfs-overlay
- name: Setup shared/init.sh
run: |
mkdir shared
echo poweroff > shared/init.sh
chmod +x shared/init.sh
- name: Run kernel
run: |
export QEMU_KERNEL_IMAGE=${{ needs.build.outputs.ARTIFACT_DIR }}/${{ steps.vars.outputs.IMAGE_NAME }}
make run
ROOTFS=./rootfs/ubuntu-jammy-${{ matrix.arch }}.img make run
INITRD=1 make run
INITRD=./ubuntu-jammy-${{ matrix.arch }}.cpio.gz make run
CPU=2 MEM=2048M QEMU_EXTRA_ARGS="" QEMU_EXTRA_KERNEL_CMDLINE="nokaslr" ROOTFS=./alpine-${{ matrix.arch }}.img make run
- name: Upload rootfs artifact
uses: actions/upload-artifact@v4
with:
name: rootfs-${{ needs.build.outputs.SUFFIX }}
path: rootfs/alpine-${{ matrix.arch }}.img
release:
runs-on: ubuntu-22.04
needs: [run, build]
permissions:
contents: write
steps:
- name: Download kernel artifacts
uses: actions/download-artifact@v4
with:
name: kernel-artifacts
pattern: kernel-artifacts-*
merge-multiple: true
- name: Download rootfs artifacts
uses: actions/download-artifact@v4
with:
name: rootfs
pattern: rootfs-*
merge-multiple: true
- run: ls -lR
- name: Compute hashsums and create hashsums.txt
shell: bash
run: |
shopt -s extglob
(cd kernel-artifacts && sha256sum !(*.deb)) > hashsums.txt
(cd rootfs && sha256sum *) >> hashsums.txt
- name: Set output variables
id: vars
run: |
set -x
echo "DATE=$(date +'%Y.%m.%d')" >> $GITHUB_OUTPUT
- name: Publish release
uses: softprops/action-gh-release@v2
with:
prerelease: true
tag_name: ${{ steps.vars.outputs.DATE }}-${{ needs.build.outputs.SHORT_HASH }}
files: |
kernel-artifacts/vmlinux*
kernel-artifacts/Image*
kernel-artifacts/bzImage*
rootfs/*
hashsums.txt
- name: Publish header release
uses: softprops/action-gh-release@v2
with:
prerelease: true
tag_name: linux-headers-${{ steps.vars.outputs.DATE }}-${{ needs.build.outputs.SHORT_HASH }}
files: kernel-artifacts/linux-headers-*.deb