@@ -3,25 +3,23 @@ name: Hyperion Kernel Build CI
33on :
44 workflow_dispatch :
55
6+ concurrency :
7+ group : hyperion-kernel
8+ cancel-in-progress : false
9+
610permissions :
711 contents : write
8- actions : write
912
1013jobs :
1114
1215 validate-config :
13- name : Validate Hyperion Config
1416 runs-on : ubuntu-latest
1517
1618 outputs :
1719 VERSION : ${{ steps.parse.outputs.VERSION }}
18- PATCH : ${{ steps.parse.outputs.PATCH }}
19- SUB : ${{ steps.parse.outputs.SUB }}
20- EXTRA : ${{ steps.parse.outputs.EXTRA }}
21- LOCAL : ${{ steps.parse.outputs.LOCAL }}
20+ FULL_VERSION : ${{ steps.parse.outputs.FULL_VERSION }}
2221 TAG : ${{ steps.parse.outputs.TAG }}
2322 HYPERION_VER : ${{ steps.parse.outputs.HYPERION_VER }}
24- FULL_VERSION : ${{ steps.parse.outputs.FULL_VERSION }}
2523 CONFIG_HASH : ${{ steps.parse.outputs.CONFIG_HASH }}
2624 PATCHES_HASH : ${{ steps.parse.outputs.PATCHES_HASH }}
2725
@@ -31,35 +29,29 @@ jobs:
3129 - name : Parse hyperion.config
3230 id : parse
3331 run : |
34- python3 << 'EOF'
35- import sys, os, hashlib, glob
32+ set -euo pipefail
3633
37- config = {}
34+ python3 << 'EOF'
35+ import os, hashlib, glob
3836
37+ config={}
3938 with open("hyperion.config") as f:
4039 for line in f:
4140 line=line.strip()
4241 if not line or line.startswith("#"): continue
4342 k,v=line.split("=",1)
4443 config[k.strip()]=v.strip().strip('"')
4544
46- def parse_int(k):
47- try:
48- return int(config.get(k,0))
49- except:
50- print("Invalid value:",k)
51- sys.exit(1)
45+ VERSION=int(config.get("CONFIG_VERSION",0))
46+ PATCH=int(config.get("CONFIG_PATCHLEVEL",0))
47+ SUB=int(config.get("CONFIG_SUBLEVEL",0))
5248
53- VERSION=parse_int("CONFIG_VERSION")
54- PATCH=parse_int("CONFIG_PATCHLEVEL")
55- SUB=parse_int("CONFIG_SUBLEVEL")
49+ FULL_VERSION=f"{VERSION}.{PATCH}" if SUB==0 else f"{VERSION}.{PATCH}.{SUB}"
5650
57- EXTRA=config.get("CONFIG_EXTRAVERSION","")
5851 LOCAL=config.get("CONFIG_LOCALVERSION","")
5952
60- FULL_VERSION=f"{VERSION}.{PATCH}" if SUB==0 else f"{VERSION}.{PATCH}.{SUB}"
61-
6253 HYPERION_VER=LOCAL.split("-Hyperion-",1)[-1] if "-Hyperion-" in LOCAL else LOCAL.lstrip("-")
54+
6355 TAG=HYPERION_VER
6456
6557 CONFIG_HASH=hashlib.sha256(open("hyperion.config","rb").read()).hexdigest()[:12]
@@ -73,37 +65,32 @@ jobs:
7365
7466 out=os.environ["GITHUB_OUTPUT"]
7567
76- with open(out,"a") as f:
77- f.write(f"VERSION={VERSION}\n")
78- f.write(f"PATCH={PATCH}\n")
79- f.write(f"SUB={SUB}\n")
80- f.write(f"EXTRA={EXTRA}\n")
81- f.write(f"LOCAL={LOCAL}\n")
82- f.write(f"TAG={TAG}\n")
83- f.write(f"HYPERION_VER={HYPERION_VER}\n")
84- f.write(f"FULL_VERSION={FULL_VERSION}\n")
85- f.write(f"CONFIG_HASH={CONFIG_HASH}\n")
86- f.write(f"PATCHES_HASH={PATCHES_HASH}\n")
68+ for k,v in {
69+ "VERSION":VERSION,
70+ "FULL_VERSION":FULL_VERSION,
71+ "TAG":TAG,
72+ "HYPERION_VER":HYPERION_VER,
73+ "CONFIG_HASH":CONFIG_HASH,
74+ "PATCHES_HASH":PATCHES_HASH
75+ }.items():
76+ open(out,"a").write(f"{k}={v}\n")
8777 EOF
8878
79+
8980 build-kernel :
90- name : Build Linux Hyperion Kernel
9181 needs : validate-config
9282 runs-on : ubuntu-latest
9383
9484 env :
95- KERNEL_VERSION : ${{ needs.validate-config.outputs.VERSION }}
96- FULL_VERSION : ${{ needs.validate-config.outputs.FULL_VERSION }}
97- CONFIG_HASH : ${{ needs.validate-config.outputs.CONFIG_HASH }}
98- PATCHES_HASH : ${{ needs.validate-config.outputs.PATCHES_HASH }}
99- TAG_NAME : ${{ needs.validate-config.outputs.TAG }}
100- HYPERION_VER : ${{ needs.validate-config.outputs.HYPERION_VER }}
85+ KERNEL_VERSION : ${{ needs.validate-config.outputs.VERSION }}
86+ FULL_VERSION : ${{ needs.validate-config.outputs.FULL_VERSION }}
87+ TAG_NAME : ${{ needs.validate-config.outputs.TAG }}
88+ HYPERION_VER : ${{ needs.validate-config.outputs.HYPERION_VER }}
89+ CONFIG_HASH : ${{ needs.validate-config.outputs.CONFIG_HASH }}
90+ PATCHES_HASH : ${{ needs.validate-config.outputs.PATCHES_HASH }}
10191
10292 KBUILD_BUILD_USER : Soumalya
103- KBUILD_BUILD_HOST : hyperion-ci
104- KBUILD_BUILD_TIMESTAMP : " 2024-01-01 00:00:00 UTC"
105- KBUILD_BUILD_VERSION : 1
106- SOURCE_DATE_EPOCH : 1704067200
93+ KBUILD_BUILD_HOST : github-runner
10794
10895 CCACHE_DIR : ${{ github.workspace }}/.ccache
10996 CCACHE_MAXSIZE : 5G
@@ -115,36 +102,62 @@ jobs:
115102
116103 - uses : actions/checkout@v4
117104
105+ # deterministic timestamp
106+ - name : Generate reproducible timestamp
107+ run : |
108+ SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)
109+ echo "SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH" >> $GITHUB_ENV
110+ echo "KBUILD_BUILD_TIMESTAMP=$(date -u -d "@$SOURCE_DATE_EPOCH")" >> $GITHUB_ENV
111+ echo "KBUILD_BUILD_VERSION=${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
112+
118113 - name : Install dependencies
119114 run : |
120115 sudo apt-get update
121- sudo apt-get install -y \
116+ sudo apt-get install -y --no-install-recommends \
122117 build-essential bc bison flex \
123118 libssl-dev libelf-dev libncurses-dev \
124119 dwarves rsync cpio git wget curl \
125- ccache zstd
120+ ccache zstd ca-certificates
126121
127- - name : Restore ccache
122+ # ccache layer
123+ - name : Restore compiler cache
128124 uses : actions/cache@v4
129125 with :
130126 path : .ccache
131- key : ccache-${{ env.FULL_VERSION }}-${{ env.CONFIG_HASH }}
132-
133- - name : Restore kernel tarball
127+ key : ccache-${{ runner.os }}-${{ env.FULL_VERSION }}-${{ env.CONFIG_HASH }}-${{ env.PATCHES_HASH }}
128+ restore-keys : |
129+ ccache-${{ runner.os }}-${{ env.FULL_VERSION }}-${{ env.CONFIG_HASH }}-
130+ ccache-${{ runner.os }}-${{ env.FULL_VERSION }}-
131+ ccache-
132+
133+ # kernel tarball cache
134+ - name : Restore kernel source
135+ id : kernel
134136 uses : actions/cache@v4
135- id : kernel-tar
136137 with :
137138 path : linux-${{ env.FULL_VERSION }}.tar.xz
138- key : kernel-${{ env.FULL_VERSION }}
139+ key : kernel-src- ${{ env.FULL_VERSION }}
139140
140141 - name : Download kernel
141- if : steps.kernel-tar .outputs.cache-hit != 'true'
142+ if : steps.kernel.outputs.cache-hit != 'true'
142143 run : |
143144 wget https://cdn.kernel.org/pub/linux/kernel/v${KERNEL_VERSION}.x/linux-${FULL_VERSION}.tar.xz
144145 wget https://cdn.kernel.org/pub/linux/kernel/v${KERNEL_VERSION}.x/sha256sums.asc
145146 grep "linux-${FULL_VERSION}.tar.xz" sha256sums.asc | sha256sum -c -
146147
148+ # kernel object tree cache
149+ - name : Restore kernel build cache
150+ id : kernel-build
151+ uses : actions/cache@v4
152+ with :
153+ path : kernel
154+ key : kernel-build-${{ env.FULL_VERSION }}-${{ env.CONFIG_HASH }}-${{ env.PATCHES_HASH }}
155+ restore-keys : |
156+ kernel-build-${{ env.FULL_VERSION }}-${{ env.CONFIG_HASH }}-
157+ kernel-build-${{ env.FULL_VERSION }}-
158+
147159 - name : Extract kernel
160+ if : steps.kernel-build.outputs.cache-hit != 'true'
148161 run : |
149162 tar -xf linux-${FULL_VERSION}.tar.xz
150163 mv linux-${FULL_VERSION} kernel
@@ -164,19 +177,15 @@ jobs:
164177 - name : Apply patches
165178 working-directory : kernel
166179 run : |
167- set -e
168180 shopt -s nullglob
169181 for patch in ../patches/*.patch; do
170- echo "Applying $patch"
171182 patch -p1 < "$patch"
172183 done
173184
174185 - name : Build kernel
175186 working-directory : kernel
176187 run : |
177- set -euo pipefail
178-
179- make -j$(nproc --all) \
188+ make -j$(nproc) \
180189 CC="ccache gcc" \
181190 LOCALVERSION="-Hyperion-${HYPERION_VER}" \
182191 bzImage modules
@@ -192,7 +201,7 @@ jobs:
192201
193202 tar --zstd -cf Hyperion-Kernel-${FULL_VERSION}.tar.zst artifacts
194203
195- - name : Checksums
204+ - name : Generate checksum
196205 run : |
197206 sha256sum Hyperion-Kernel-${FULL_VERSION}.tar.zst > Hyperion-Kernel-${FULL_VERSION}.sha256
198207
0 commit comments