Skip to content

Build

Build #109

Workflow file for this run

name: Build
on:
workflow_dispatch:
inputs:
host-os:
required: true
type: choice
options:
- ubuntu-22.04
- ubuntu-20.04
ack:
required: true
type: choice
options:
- "0"
- "1"
arch:
required: true
type: choice
options:
- x86_64
- arm64
version:
required: true
type: string
use-cached:
required: false
type: boolean
default: false
workflow_call:
inputs:
host-os:
required: false
type: string
default: ubuntu-22.04
ack:
required: true
type: string
arch:
required: true
type: string
version:
required: true
type: string
use-cached:
required: false
type: boolean
default: false
outputs:
artifact-dir:
value: ${{ jobs.build.outputs.artifact-dir }}
kernel-image-name:
value: ${{ jobs.build.outputs.kernel-image-name }}
suffix:
value: ${{ jobs.build.outputs.suffix }}
version:
value: ${{ jobs.build.outputs.version }}
jobs:
build:
name: Build (ack=${{ inputs.ack }}, ${{ inputs.version }}, ${{ inputs.arch }}, ${{ inputs.host-os }})
runs-on: ${{ inputs.host-os }}
timeout-minutes: 100
env:
ACK: ${{ inputs.ack }}
ARCH: ${{ inputs.arch }}
outputs:
artifact-dir: ${{ steps.vars.outputs.ARTIFACT_DIR }}
kernel-image-name: ${{ steps.vars.outputs.KERNEL_IMAGE_NAME }}
suffix: ${{ steps.vars.outputs.SUFFIX }}
version: ${{ steps.version.outputs.VERSION }}
steps:
- uses: actions/checkout@v4
- name: Get real kernel version
id: version
shell: bash
run: |
LINUX_URL=https://cdn.kernel.org/pub/linux/kernel
VERSION="${{ inputs.version }}"
first_char=${VERSION:0:1}
last_char=${VERSION: -1:1}
if [ $last_char == y ]; then
major_minor=${VERSION: 0:-1}
# We do this in multiple steps instead of a chain of pipes to make debugging easier
TMP=$(curl -s $LINUX_URL/v${first_char}.x/)
TMP=$(echo "$TMP" | sed -e 's/<[^>]*>//g')
TMP=$(echo "$TMP" | grep -oP "linux-${major_minor}[0-9]+")
TMP=$(echo "$TMP" | sort -r -V)
TMP=$(echo "$TMP" | head -n1)
TMP=$(echo "$TMP" | cut -d '-' -f2)
VERSION=$TMP
fi
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
- name: Set output variables
id: vars
shell: bash
run: |
set -x
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 }}-${{ inputs.arch }}
echo "SUFFIX=$SUFFIX" >> $GITHUB_OUTPUT
echo "OUT_DIR=$OUT_DIR" >> $GITHUB_OUTPUT
echo "KERNEL_TYPE=$KERNEL_TYPE" >> $GITHUB_OUTPUT
echo "KERNEL_IMAGE=$KERNEL_IMAGE" >> $GITHUB_OUTPUT
echo "KERNEL_IMAGE_NAME=$(basename $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
if: ${{ inputs.use-cached == true }}
id: cache-kernel
uses: actions/cache@v4
with:
key: ${{ inputs.host-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: ${{ inputs.host-os }}
arch: ${{ inputs.arch }}
ack: ${{ inputs.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: ${{ inputs.host-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 }}