nuttx/tools
Lup Yuen Lee 12e8f92a28 CI: Retry build upon failure
In Jan-Feb 2026: NuttX CI hit a [record high usage of GitHub Runners](https://github.com/apache/nuttx/issues/17914), exceeding the limit enforced by ASF Infrastructure Team. We analysed the PRs and discovered that most GitHub Runners were wasted on __(1) Failure to Download the Build Dependencies__ for DTC Device Tree, OpenAMP Messaging, MicroADB Debugger, MCUBoot Bootloader, NimBLE Bluetooth, etc __(2) Resubmitting PR Commits__:

- [Video: Analysing the Most Expensive PR](https://youtu.be/swFaxaTCEQg)
- [Video: Second Most Expensive PR](https://youtu.be/uSpQkzBogEw)
- [Video: Third Most Expensive PR](https://youtu.be/J7w1gyjwZ1w)
- [Video: Most Expensive Apps PR](https://youtu.be/182h8cRpfvI)
- [Spreadsheet: Most Expensive PRs](https://docs.google.com/spreadsheets/d/1HY7fIZzd_fs3QPyA0TX7vsYOjL86m1fNOf1Wls93luI/edit?gid=70515654#gid=70515654)

Why would __Download Failures__ waste GitHub Runners? That's because Download Failures will terminate the Entire CI Build (across All CI Jobs), requiring a restart of the CI Build. And the CI Build isn't terminated immediately upon failure: NuttX CI waits for the CI Job to complete (e.g. arm-01), before terminating the CI Build. Which means that CI Builds can get terminated 2.5 hours into the CI Build, wasting 2.5 elapsed hours x [7.4 parallel processes](https://lupyuen.org/articles/ci3#live-metric-for-full-time-runners) of GitHub Runners.

This PR proposes to __Retry the Build for Each CI Target__. NuttX CI shall rebuild each CI Target (e.g. `sim:nsh`), upon failure, up to 3 times (total 4 builds). Each rebuild will be attempted after a Randomised Delay with Exponential
Backoff, initially set to 60 seconds, then 120 seconds, 240 seconds. The rebuilds will mitigate the effects of Intermittent Download Failures that occur in GitHub Actions. (And eliminate developer frustration)

If the build fails after 3 retries: Subsequent CI Targets will __not be allowed to rebuild__ upon failure. This is to prevent cascading build failures from overloading GitHub Actions, and consuming too many GitHub Runners.

Note that NuttX CI shall retry the build for __Any Kind of Build Failure__, including Download Failures, Compile Errors and Config Errors. We designed it simplistically due to our current constraints: (1) Lack of CI Expertise (2) NuttX CI is Mission Critical (3) Legacy CI Scripts are Highly Complex. To prevent Compile Errors and Config Errors: We expect NuttX Devs to [Build and Test PRs in Our Own Repos](https://github.com/apache/nuttx/issues/18568), before submitting to NuttX.

What about __Resubmitting PR Commits__ and its wastage of GitHub Runners? We also require NuttX Devs to [Build and Test PRs in Our Own Repos](https://github.com/apache/nuttx/issues/18568), before resubmitting to NuttX. GitHub Runners will then be charged to the developer's quota, without affecting the GitHub Runners quota for Apache NuttX Project. We plan to [Kill All CI Jobs](https://youtu.be/182h8cRpfvI?si=MmAuwLISZPPMoqDq&t=1479) for PRs that have been switched to Draft Mode. We'll monitor this through the [NuttX Build Monitor](https://github.com/apache/nuttx/issues/18659).

Modified Files:

`tools/testbuild.sh`: We introduce a New Wrapper Function `retrytest` that will call the Existing Function `dotest`, to build the CI Target and retry on error.

`Documentation/components/tools/testbuild.rst`: Updated the `testbuild.sh` doc with the Retry Logic.

Signed-off-by: Lup Yuen Lee <luppy@appkaki.com>
2026-04-15 12:30:17 +02:00
..
bcm2711 arch/bcm2711, boards/raspberry-pi-4b: Add preliminary support for the BCM2711 and Raspberry Pi 4B. 2024-12-17 16:43:17 +08:00
bl602 Documentation/bl602: Update some imformation; Add partition.toml in tool/bl602 2021-07-27 21:01:15 -07:00
ci tools/ci: Added esptool for Windows Native 2026-04-13 23:55:10 +08:00
codeowners docs/codeowners: Add preliminary code owner file 2025-09-05 19:53:06 -04:00
cxd56 fix misspelled names in locally scoped code 2025-05-15 10:12:12 +08:00
esp32 espressif: automate build system for flash enc 2025-12-11 11:29:26 +01:00
esp32c3 tools/espressif: add esptool version check to Espressif build system 2024-10-15 20:42:57 +02:00
esp32s2 espressif: automate build system for flash enc 2025-12-11 11:29:26 +01:00
esp32s3 espressif: automate build system for flash enc 2025-12-11 11:29:26 +01:00
espressif arch/espressif: add flash encryption support on CMake 2026-04-02 13:16:54 +08:00
imx9 arch/arm64/imx9: Support for imx9 edgelock enclave 2025-03-17 21:35:25 +02:00
licensing tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
lwl docs/guides/lwl: move lwl's README.txt to lwl.rst 2025-12-23 15:20:06 +01:00
mpfs tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
nix tools/nix: move nix flakes to tools/ 2025-08-28 10:04:01 +08:00
pic32 tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
pynuttx nxgdb: change the symbol g_statenames to nxsched_get_stateinfo::g_statenames 2026-03-02 08:06:18 -03:00
rp23xx tools/rp{2040,23xx}: Ensure that picotool is found or built 2025-08-22 00:30:28 +08:00
rp2040 style: Fix case statement formatting in power management callbacks. 2026-01-10 12:59:14 -03:00
simwifi fix(udhcpc): missing interface name in log message 2025-05-05 09:32:31 +08:00
zds style: Fix "the the" typo across the codebase. 2026-03-23 11:07:49 +01:00
.gitignore !build: add build-time password generation with mkpasswd tool. 2026-04-14 16:06:30 +08:00
abi_check.py abi_check.py:Check ABI compatibility between different ELF versions. 2026-01-28 18:32:39 +01:00
b16.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
bdf-converter.c tools/bdf-converter: Fix loop termination condition. 2025-03-18 10:12:23 -03:00
btdecode.sh arch/risc-v/espressif/esp32p4: Support ESP32-P4 on NuttX 2026-03-09 21:40:25 +01:00
build-globals.sh libc/elf: rename modlib to libelf 2025-04-11 09:43:22 +08:00
callstack.py tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
cfgdefine.c libc/elf: rename modlib to libelf 2025-04-11 09:43:22 +08:00
cfgdefine.h tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
cfgparser.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
cfgparser.h tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
checkkconfig.py tools[feat]: add config check tool 2026-01-14 17:50:18 +01:00
checkpatch.sh tools/checkpatch.sh: Enhance stdin support for patch checking 2026-03-09 11:08:52 +08:00
checkrelease.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
CMakeLists.txt tools/CMakeLists.txt: Improvements to CMakeLists.txt file 2025-05-17 16:09:20 +08:00
cmpconfig.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
cnvwindeps.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
Config.mk build/cmake/stdlib: guard include/cxx by LIBMINIABI, fix div_t conflict 2026-03-29 16:45:29 -03:00
configure.bat tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
configure.c style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
configure.sh tools/configure.sh: align tools/configure.sh with CmakeLists.txt 2025-09-05 09:50:11 +08:00
configure_completion.bash tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
convert-comments.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
copydir.bat style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
copydir.sh style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
coredump.py coredump.py:bug fix python file not have rename 2024-10-30 12:29:22 +08:00
csvparser.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
csvparser.h tools/mksyscall: fix 106: Unexpected end of line: "FAR char * co" 2025-03-08 12:39:24 +08:00
D.defs debug symbol level: Use config instead 2024-12-04 22:36:45 +08:00
define.bat style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
define.sh style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
detab.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
Directories.mk libbuitin/compiler_rt: Supports separate builtin rt.builtins or rt.profile 2024-11-12 16:12:53 +08:00
discover.py tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
doreleasenotes.py tools/doreleasenotes: remove deprecater API 2025-05-27 20:34:54 +08:00
Export.mk tools: Export LLVM flags for kernel build 2025-01-26 20:22:35 +08:00
find_symbol_callers.sh toos/scipts: add script to find symbol caller 2025-12-31 08:47:23 -03:00
flash_writer.py fix misspelled names in locally scoped code 2025-05-15 10:12:12 +08:00
FlatLibs.mk libbuitin/compiler_rt: Supports separate builtin rt.builtins or rt.profile 2024-11-12 16:12:53 +08:00
gcov.py gcov: Refactoring the implementation framework of gcov 2025-07-03 00:17:58 +08:00
gdbserver.py gdbserver.py:add x86_64 arch 2026-01-24 23:31:43 +08:00
gencromfs.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
host_info_dump.py tools: fix make host_info flag parsing and config string escaping 2026-02-05 14:23:19 +01:00
host_info_parse.py tools: fix make host_info flag parsing and config string escaping 2026-02-05 14:23:19 +01:00
ide_exporter.py tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
incdir.bat tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
incdir.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
incdir.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
indent.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
initialconfig.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
jlink-nuttx.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
kasan_global.py kasan/globals: fix compile error 2024-12-05 20:37:47 +08:00
kconfig.bat tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
kconfig2html.c style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
KernelLibs.mk libbuitin/compiler_rt: Supports separate builtin rt.builtins or rt.profile 2024-11-12 16:12:53 +08:00
LibTargets.mk clang:libclang_rt.builtins-xxx.a supports builtin 2024-10-28 16:38:45 +08:00
link.bat tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
link.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
lowhex.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
macar-qcs.sh tools/macar-qcs.sh: migrate license to ASF 2024-12-16 14:14:55 +08:00
Make.defs tools: Rename apps-or-nuttx-Make.defs to Make.defs 2024-10-17 07:55:02 +08:00
Makefile.host !build: add build-time password generation with mkpasswd tool. 2026-04-14 16:06:30 +08:00
merge_config.py install kconfiglib using apt repo 2024-12-02 13:43:29 +08:00
mkallsyms.py tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
mkallsyms.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
mkconfig.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
mkconfigvars.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
mkctags.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
mkdeps.c tools/mkdeps: increase MAX_BUFFER from 16384 to 65536 2024-10-31 08:55:07 +08:00
mkexport.sh build/export: Fix missing gnu-elf.ld copy and toolchain script. 2025-09-14 10:44:51 +08:00
mkfsdata.pl tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
mkfsdata.py style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
mknulldeps.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
mkpasswd.c !build: add build-time password generation with mkpasswd tool. 2026-04-14 16:06:30 +08:00
mkromfsimg.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
mksymtab.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
mksyscall.c tools/mksyscall: fix union illegal type for cast 2026-04-08 18:38:39 +08:00
mkversion.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
mkwindeps.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
netusb.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
noteinfo.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
nxstyle.c style: fix checkpatch issues after debug.h move 2026-04-07 07:50:06 -03:00
nxtagspkgsfetch.sh tools/nxtagspkgsfetch.sh: Fetch tags packages for NuttX and Apps. 2025-12-17 08:12:44 -03:00
parsecallstack.py tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
parsememdump.py mm: dump node overheadp during memdump 2024-11-25 00:42:34 +08:00
parsetrace.py tools/parsetrace.py: Fix get_typesize bug in parsetrace.py 2026-01-26 23:22:41 +01:00
pre-commit tools: add git pre-commit hook based on checkpatch.sh 2023-05-03 14:42:34 +02:00
process_config.py cmake(enhance):include-style defconfig can modified via menuconfig 2026-01-15 15:42:17 -03:00
process_config.sh tools/process_config.sh: Fix sed errors 2025-07-03 09:41:56 -03:00
ProtectedLibs.mk libbuitin/compiler_rt: Supports separate builtin rt.builtins or rt.profile 2024-11-12 16:12:53 +08:00
refresh.sh tools: Modify refresh.sh to support update all configs from a board 2025-06-21 04:21:10 +08:00
rmcr.c tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
Rust.defs tools/Rust.defs: Use 'gnu' target for Linux and 'darwin' for macOS 2025-01-28 16:43:37 +08:00
sethost.sh CI: Improved speed to build nuttx on MSYS2 job 2025-03-26 22:35:19 +08:00
showsize.sh tools/showsize.sh: support pass custom nuttx executable 2024-10-13 02:11:12 +08:00
simbridge.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
simhostroute.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
simlaunch.sh sim:support sim elf and dynamic libs package in post build 2024-11-06 01:56:44 +08:00
size_report.py fix: TreeNode has same attribute with NodeMixin 2023-10-09 17:51:01 -04:00
splashscreen_converter.py drivers/video/fb.c: Add startup splashscreen option 2025-04-30 06:38:05 -03:00
stackusage.py tools/stackusage.py: use toolchain binaries instead of Python libraries 2026-03-17 11:26:44 -03:00
stm32_pinmap_tool.py fix misspelled names in locally scoped code 2025-05-15 10:12:12 +08:00
Swift.defs debug symbol level: Use config instead 2024-12-04 22:36:45 +08:00
testbuild.ps1 tools/ci: Added esptool for Windows Native 2026-04-13 23:55:10 +08:00
testbuild.sh CI: Retry build upon failure 2026-04-15 12:30:17 +02:00
toolchain.cmake.export arch/crt0.c: revert entry _start 2025-12-10 19:06:04 +08:00
uncrustify.cfg style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
Unix.mk tools/Unix.mk: fix Untracked files defconfig.tmp-e on macOS 2026-04-15 17:10:22 +08:00
unlink.bat tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
unlink.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
version.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
Win.mk libc: add support for C23 stdbit.h with bit manipulation macros 2026-03-02 09:09:40 -03:00
xmlrpc_test.py tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
Zig.defs tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
zipme.sh tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00