No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-16 22:17:59 +08:00
.forgejo/workflows Buildroot 编译测试:Forgejo 流水线(只编译 + 计时,用于衡量 runner 性能) 2026-10-16 22:17:59 +08:00
scripts Buildroot 编译测试:Forgejo 流水线(只编译 + 计时,用于衡量 runner 性能) 2026-10-16 22:17:59 +08:00
.gitignore Buildroot 编译测试:Forgejo 流水线(只编译 + 计时,用于衡量 runner 性能) 2026-10-16 22:17:59 +08:00
README.md Buildroot 编译测试:Forgejo 流水线(只编译 + 计时,用于衡量 runner 性能) 2026-10-16 22:17:59 +08:00

Buildroot 编译测试

在自建 Forgejo + Forgejo Runner 上全量编译 buildroot/buildroot 的 QEMU 镜像(qemu_aarch64_virt / qemu_x86_64 / qemu_riscv64_virt / qemu_arm_vexpress), 只看编译能不能跑完、花了多久——用来衡量 runner 机器的编译性能(比如 2C12G 的 ARM VPS)。 不发布 Release,不做启动验证;产物镜像留在 out/<板子>/images/ 里,想看结果可以去 runner 上看。

目录结构

.forgejo/workflows/build.yml   # 定时与手动触发的编译流水线
scripts/install-deps.sh        # 安装宿主机编译依赖
scripts/prepare.sh             # 拉取 Buildroot 源码到指定 ref
scripts/build.sh               # 逐板 defconfig + 编译 + 计时
src/                           # Buildroot 源码(构建时生成)
out/                           # 各板子 output、日志、耗时汇总(构建时生成)

scripts/build.sh 对每个板子只做四步:make O=out/<板子> <板子>_defconfig → 追加 BR2_CCACHE* / BR2_DL_DIR 到 .config → make olddefconfig → make source → make -j。 板级内容全部由 Buildroot 自带的 configs/*_defconfig 决定,这个仓库不维护任何配置文件。

耗时怎么看

构建结束后每个板子会打印一行,同时追加到 out/timings.txt:

2026-10-16 13:30:47  qemu_aarch64_virt      -j4   download     62s  compile    2013s  total    2075s
  • download 段是 make source,首次会把内核、工具链、QEMU 等源码包拉下来;缓存命中后基本是几秒。
  • compile 段是 make -j,这才是机器的真实性能指标。
  • out/logs/<板子>.log 里每分钟有一行 [monitor] load=… disk=… mem_avail=…, 可以回看编译期间的负载、磁盘和内存余量:耗时异常、编译中途被杀,多半能从这里看出原因。
  • 想让多次数据可比:在 workflow 里设固定的 MAKE_JOBS(默认按可用内存推导),并且注意 ccache 命中率——第二轮会比第一轮快很多(脚本会在日志里打印 ccache -s)。想测"冷启动"性能就清掉 /ccache。

触发方式

定时:cron: '0 17 * * *' 按 UTC 解释,即北京时间每天 01:00,使用 DEFAULT_SOURCE_REF(默认 2026.02.3, 当前 LTS)和 DEFAULT_BOARDS(默认 qemu_aarch64_virt)。定时任务只在默认分支生效。

手动:workflow_dispatch 提供

  • source_ref:Buildroot 版本下拉(2026.02.3、2026.05.3、2026.08、master 等)
  • source_ref_custom:填了就用它,覆盖下拉选项(上游发新 tag 时不用改 workflow)
  • boards:Buildroot 的 defconfig 前缀,空格分隔,例如 qemu_aarch64_virt qemu_x86_64; 写别的也行,只要 configs/<名字>_defconfig 存在(ls src/configs | grep defconfig 可查)

首次使用前

  1. runner 标签:build.yml 里写的是 ubuntu-latest,改成你 runner 实际声明的标签。建议该标签映射到 Ubuntu 22.04/24.04 镜像,例如 runner 配置里的 ubuntu-latest:docker://ghcr.io/catthehacker/ubuntu:act-24.04。 镜像需带 apt,步骤以 root 运行。
  2. 磁盘:一个板子的 out/<板子>/(工具链 + 内核 + 包)约 5~10GB,out 与 /dl、/ccache 共用一个盘。 建议留 20GB 以上;构建脚本在剩余空间 <20GB 时会打警告。
  3. 第一次先手动跑一个板子(boards 填 qemu_aarch64_virt),确认依赖装得上、能编完,再开定时任务。

本地手工运行

cd buildroot-qemu-ci
export SOURCE_REPO=https://github.com/buildroot/buildroot
export DEFAULT_SOURCE_REF=2026.02.3
export DL_DIR=$PWD/out/dl CCACHE_DIR=$PWD/out/ccache
bash scripts/install-deps.sh
bash scripts/prepare.sh
BOARDS_INPUT=qemu_aarch64_virt MAKE_JOBS=2 bash scripts/build.sh

参考量级(qemu_aarch64_virt,含 BR2_PACKAGE_HOST_QEMU=y 会额外编一份宿主 QEMU): 4 核容器约 30~45 分钟,2 核机器预计 1 小时以上,具体以 timings.txt 为准。

常见问题

编译被静默杀掉(没有报错就结束):先看 out/logs/<板子>.log 里的 [monitor] 行——磁盘写满或被 OOM killer 杀掉都不会留下正常报错。降 MAKE_JOBS 重试(脚本在 137/143/139 退出码时会自动降并行度重试一次)。

make source 一直失败:多半是网络。日志里有具体 URL,可以把外部镜像设为 BR2_PRIMARY_SITE (workflow 里导出同名环境变量即可,build.sh 会写进 .config),或先手工把 tarball 放进 DL_DIR。

耗时波动大:确认两次运行的 MAKE_JOBS、ccache 状态、/dl 是否命中一致;VPS 上还要留意 邻居超卖(看 [monitor] 行的 load 与编译时间是否同步恶化)。