Skip to content

Commit 639bd02

Browse files
committed
Refactor kernel build job
1 parent cb5e650 commit 639bd02

File tree

5 files changed

+181
-53
lines changed

5 files changed

+181
-53
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
name: 'Build Kernel'
2+
description: 'Build the Linux kernel'
3+
inputs:
4+
kernel-version:
5+
description: 'Kernel branch or tag name to checkout'
6+
required: true
7+
os:
8+
description: 'Build machine OS'
9+
required: true
10+
arch:
11+
description: 'Architecture to build'
12+
required: true
13+
ack:
14+
description: 'Whether to build the Android Common Kernel'
15+
required: true
16+
runs:
17+
using: "composite"
18+
steps:
19+
- name: Checkout kernel version
20+
shell: bash
21+
env:
22+
ACK: ${{ inputs.ack }}
23+
ARCH: ${{ inputs.arch }}
24+
VERSION: ${{ inputs.kernel-version }}
25+
run: make linux_download
26+
27+
- name: Install common dependencies
28+
shell: bash
29+
run: |
30+
sudo apt update && sudo apt install -y \
31+
build-essential \
32+
bc \
33+
bison \
34+
flex \
35+
libelf-dev \
36+
libssl-dev \
37+
ncurses-dev \
38+
llvm \
39+
clang \
40+
clang-tools \
41+
lld \
42+
lz4 \
43+
pahole
44+
45+
- name: Install x86_64 dependencies
46+
if: ${{ inputs.arch == 'x86_64' }}
47+
shell: bash
48+
run: sudo apt update && sudo apt install -y qemu-system-x86
49+
50+
- name: Install arm64 dependencies
51+
if: ${{ inputs.arch == 'arm64' }}
52+
shell: bash
53+
run: |
54+
sudo apt update && sudo apt install -y \
55+
binutils-aarch64-linux-gnu \
56+
gcc-aarch64-linux-gnu
57+
58+
- name: Set Linux source directory
59+
if: ${{ inputs.ack == 0 }}
60+
shell: bash
61+
run: echo "LINUX_SRC=linux-${{ inputs.kernel-version }}" >> $GITHUB_ENV
62+
63+
- name: Set ACK source directory
64+
if: ${{ inputs.ack == 1 }}
65+
shell: bash
66+
run: echo "LINUX_SRC=${{ inputs.kernel-version }}" >> $GITHUB_ENV
67+
68+
- name: Build kernel
69+
shell: bash
70+
env:
71+
ACK: ${{ inputs.ack }}
72+
ARCH: ${{ inputs.arch }}
73+
run: |
74+
make -j$(nproc) linux

.github/workflows/build.yml

Lines changed: 104 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,19 @@ jobs:
77
fail-fast: false
88
matrix:
99
# TODO: Add 20.04
10-
# TODO: Build all LTS and latest kernels
1110
os: [ubuntu-22.04]
12-
ack: [0, 1]
11+
kernel: [{ack: 0, version: 5.10.164}, {ack: 0, version: 5.15.89}, {ack: 0, version: 6.1.7}, {ack: 1, version: android13-5.10-lts}]
1312
arch: [arm64, x86_64]
1413
runs-on: ${{ matrix.os }}
15-
timeout-minutes: 80
14+
timeout-minutes: 100
1615
env:
17-
ACK: ${{ matrix.ack }}
16+
ACK: ${{ matrix.kernel.ack }}
1817
ARCH: ${{ matrix.arch }}
1918
outputs:
2019
SHORT_HASH: ${{ steps.vars.outputs.SHORT_HASH }}
2120
steps:
2221

2322
- uses: actions/checkout@v3
24-
with:
25-
submodules: true
2623

2724
- name: Set output variables
2825
id: vars
@@ -39,74 +36,130 @@ jobs:
3936
OUT_DIR=out/ack/common/${ARCH}
4037
fi
4138
42-
KERNEL_IMAGE="${OUT_DIR}/arch/${ARCH}/boot"
43-
4439
if [ $ARCH == x86_64 ]; then
45-
KERNEL_IMAGE="$KERNEL_IMAGE/bzImage"
40+
# We need to use the real image in the x86 folder because caching
41+
# doesn't work with symlinks
42+
KERNEL_IMAGE="${OUT_DIR}/arch/x86/boot/bzImage"
4643
elif [ $ARCH == arm64 ]; then
47-
KERNEL_IMAGE="$KERNEL_IMAGE/Image"
44+
KERNEL_IMAGE="${OUT_DIR}/arch/${ARCH}/boot/Image"
4845
fi
4946
5047
echo "SHORT_HASH=$SHORT_HASH" >> $GITHUB_OUTPUT
5148
echo "OUT_DIR=$OUT_DIR" >> $GITHUB_OUTPUT
5249
echo "KERNEL_TYPE=$KERNEL_TYPE" >> $GITHUB_OUTPUT
5350
echo "KERNEL_IMAGE=$KERNEL_IMAGE" >> $GITHUB_OUTPUT
5451
55-
# TODO: We can make this step faster by splitting up ACK, arm64, and x86 dependencies
56-
- name: Install dependencies
57-
run: |
58-
sudo apt update && sudo apt install -y \
59-
qemu \
60-
qemu-system-x86 \
61-
qemu-system-arm \
62-
build-essential \
63-
bc \
64-
bison \
65-
flex \
66-
git \
67-
libelf-dev \
68-
libssl-dev \
69-
ncurses-dev \
70-
llvm \
71-
clang \
72-
clang-tools \
73-
lld \
74-
lz4 \
75-
pahole \
76-
binutils-aarch64-linux-gnu \
77-
gcc-aarch64-linux-gnu
78-
79-
- name: Initialize rootfs
80-
run: |
81-
make rootfs-init
52+
- name: Cache kernel image
53+
id: cache-kernel
54+
uses: actions/cache@v3
55+
with:
56+
key: ${{ matrix.kernel.version }}-${{ matrix.arch }}
57+
path: |
58+
${{ steps.vars.outputs.KERNEL_IMAGE }}
59+
${{ steps.vars.outputs.OUT_DIR }}/vmlinux
60+
61+
- run: ls -lR
62+
if: ${{ steps.cache-kernel.outputs.cache-hit == 'true' }}
8263

8364
- name: Build kernel
84-
run: |
85-
make -j$(nproc) linux
65+
if: ${{ steps.cache-kernel.outputs.cache-hit != 'true' }}
66+
uses: ./.github/actions/build-kernel
67+
with:
68+
os: ${{ matrix.os }}
69+
arch: ${{ matrix.arch }}
70+
ack: ${{ matrix.kernel.ack }}
71+
kernel-version: ${{ matrix.kernel.version }}
8672

87-
- name: Run kernel
73+
- name: Rename kernel images
8874
run: |
89-
mkdir shared
90-
echo poweroff > shared/init.sh
91-
chmod +x shared/init.sh
92-
make run
75+
SUFFIX=${{ steps.vars.outputs.KERNEL_TYPE }}-${{ matrix.kernel.version }}-${{ matrix.arch }}
76+
cp ${{ steps.vars.outputs.KERNEL_IMAGE }} ${{ steps.vars.outputs.KERNEL_IMAGE }}-$SUFFIX
77+
cp ${{ steps.vars.outputs.OUT_DIR }}/vmlinux ${{ steps.vars.outputs.OUT_DIR }}/vmlinux-$SUFFIX
9378
94-
- run: |
95-
cp ${{ steps.vars.outputs.KERNEL_IMAGE }} \
96-
${{ steps.vars.outputs.KERNEL_IMAGE }}-${{ steps.vars.outputs.KERNEL_TYPE }}-${{ matrix.arch }}
97-
cp ${{ steps.vars.outputs.OUT_DIR }}/vmlinux ${{ steps.vars.outputs.OUT_DIR }}/vmlinux-${{ steps.vars.outputs.KERNEL_TYPE }}-${{ matrix.arch }}
79+
echo "SUFFIX=$SUFFIX" >> $GITHUB_ENV
9880
9981
- name: Upload kernel image artifact
10082
uses: actions/upload-artifact@v3
10183
with:
10284
name: kernel-image
103-
path: ${{ steps.vars.outputs.KERNEL_IMAGE }}-${{ steps.vars.outputs.KERNEL_TYPE }}-${{ matrix.arch }}
85+
path: ${{ steps.vars.outputs.KERNEL_IMAGE }}-${{ env.SUFFIX }}
10486

10587
- name: Upload vmlinux artifact
10688
uses: actions/upload-artifact@v3
10789
with:
10890
name: vmlinux
109-
path: ${{ steps.vars.outputs.OUT_DIR }}/vmlinux-${{ steps.vars.outputs.KERNEL_TYPE }}-${{ matrix.arch }}
91+
path: ${{ steps.vars.outputs.OUT_DIR }}/vmlinux-${{ env.SUFFIX }}
92+
93+
run:
94+
needs: build
95+
strategy:
96+
fail-fast: false
97+
matrix:
98+
kernel: [{ack: 0, version: 5.10.164}, {ack: 0, version: 5.15.89}, {ack: 0, version: 6.1.7}, {ack: 1, version: android13-5.10-lts}]
99+
arch: [arm64, x86_64]
100+
runs-on: ubuntu-22.04
101+
env:
102+
ACK: ${{ matrix.kernel.ack }}
103+
ARCH: ${{ matrix.arch }}
104+
steps:
105+
- uses: actions/checkout@v3
106+
107+
- name: Download all workflow run artifacts
108+
uses: actions/download-artifact@v3
109+
110+
- name: Install x86_64 dependencies
111+
if: ${{ matrix.arch == 'x86_64' }}
112+
shell: bash
113+
run: sudo apt update && sudo apt install -y qemu-system-x86
114+
115+
- name: Install arm64 dependencies
116+
if: ${{ matrix.arch == 'arm64' }}
117+
shell: bash
118+
run: sudo apt update && sudo apt install -y qemu-system-arm
119+
120+
- name: Set output variables
121+
id: vars
122+
run: |
123+
set -x
124+
125+
if [ $ACK -eq 0 ]; then
126+
KERNEL_TYPE=linux
127+
else
128+
KERNEL_TYPE=ack
129+
fi
130+
131+
SUFFIX=$KERNEL_TYPE-${{ matrix.kernel.version }}-${{ matrix.arch }}
132+
133+
if [ $ARCH == x86_64 ]; then
134+
IMAGE_NAME=bzImage-$SUFFIX
135+
else
136+
IMAGE_NAME=Image-$SUFFIX
137+
fi
138+
139+
echo "IMAGE_NAME=$IMAGE_NAME" >> $GITHUB_ENV
140+
141+
- name: Initialize rootfs and initramfs
142+
run: |
143+
make rootfs-init
144+
ROOTFS=./rootfs-${{ matrix.arch }} make rootfs-init
145+
146+
make cpio
147+
INITRAMFS_DIR=./rootfs/alpine-${{ matrix.arch }} make cpio CPIO_FILE=../../alpine-${{ matrix.arch }}.cpio.gz
148+
149+
- name: Setup shared/init.sh
150+
run: |
151+
mkdir shared
152+
echo poweroff > shared/init.sh
153+
chmod +x shared/init.sh
154+
155+
- run: ls -lR
156+
157+
- name: Run kernel
158+
run: |
159+
KERNEL_IMAGE=./kernel-image/$IMAGE_NAME make run
160+
KERNEL_IMAGE=./kernel-image/$IMAGE_NAME ROOTFS=./rootfs-${{ matrix.arch }} make run
161+
KERNEL_IMAGE=./kernel-image/$IMAGE_NAME INITRD=./alpine-${{ matrix.arch }}.cpio.gz make run
162+
KERNEL_IMAGE=./kernel-image/$IMAGE_NAME CPU=2 MEM=2048M QEMU_EXTRA_ARGS="" QEMU_EXTRA_KERNEL_CMDLINE="nokaslr" make run
110163
111164
- name: Upload rootfs artifact
112165
uses: actions/upload-artifact@v3
@@ -116,7 +169,7 @@ jobs:
116169

117170
release:
118171
runs-on: ubuntu-22.04
119-
needs: build
172+
needs: [run, build]
120173
permissions:
121174
contents: write
122175
steps:

.gitmodules

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99
[submodule "linux"]
1010
path = linux
1111
url = https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
12+
branch = master

linux

Submodule linux updated from 5dc4c99 to 21e9963

scripts/download_linux.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ LINUX_URL=https://cdn.kernel.org/pub/linux/kernel
1111
ACK_URL=https://android.googlesource.com/kernel/common/+archive/refs/heads
1212

1313
if [ -z "$VERSION" ]; then
14-
echo "usage: $0 VERSION"
14+
echo "usage: $0 VERSION [0 | 1]"
1515
exit 1
1616
fi
1717

0 commit comments

Comments
 (0)