Build #102
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
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}/${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.output.FINAL_KERNEL_IMAGE_PATH }} | |
${{ steps.vars.output.FINAL_VMLINUX_PATH }} | |
${{ steps.vars.output.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.output.FINAL_KERNEL_IMAGE_PATH }} | |
mv ${{ steps.vars.outputs.OUT_DIR }}/vmlinux ${{ steps.vars.output.FINAL_VMLINUX_PATH }} | |
mv ${{ steps.vars.outputs.OUT_DIR }}/../linux-headers-*.deb ${{ steps.vars.output.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.output.FINAL_KERNEL_IMAGE_PATH }} | |
${{ steps.vars.output.FINAL_VMLINUX_PATH }} | |
${{ steps.vars.output.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 all workflow run artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: ${{ steps.vars.output.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 | |
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.output.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 | |
path: rootfs/alpine-${{ matrix.arch }}.img | |
release: | |
runs-on: ubuntu-22.04 | |
needs: [run, build] | |
permissions: | |
contents: write | |
steps: | |
- name: Download all workflow run artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: kernel-artifacts | |
pattern: kernel-artifacts-* | |
merge-multiple: true | |
- run: ls -lR | |
- name: Compute hashsums and create hashsums.txt | |
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 |