English | 简体中文
Build OpenWrt firmware for multiple devices via GitHub Actions. Forked from eSirPlayground/AutoBuild-OpenWrt; all builds run in CI, no local toolchain required.
Thanks to:
| Device | Workflow | Source | Branch | Arch |
|---|---|---|---|---|
| JDCloud AX3000 | Build_JDCloud_AX3000.yml |
immortalwrt/immortalwrt | openwrt-25.12 | qualcommax/ipq50xx |
| Redmi AX5 JDCloud | Build_Redmi_AX5_JDCloud.yml |
LiBwrt/LibWrt | 25.12-nss | qualcommax/ipq60xx |
| x86_64 | Build_OP_x86_64.yml |
coolsnowwolf/lede | master | x86/64 |
1. Prerequisite
- Sign up for GitHub Actions
- Fork this repository
2. Compile Firmware
- Click
[.github/workflows]folder on the top of repo and you could see few workflow files, each for one particular device. - Click "Actions" on the menu, click your favorite device on the left side, then click the "Run workflow" button on the right side and confirm.
- The build starts automatically. Progress can be viewed on the Actions page.
- When the build is complete, click the
Artifactsbutton in the upper right corner of the Actions page to download the binaries. - The firmware is also published to GitHub Releases (fixed tag, overwritten on each build).
- Default Web Admin IP:
192.168.10.1, usernameroot, no login password
3. Sync Code
- Uncomment the
push-branches-masterlines underOnsection and commit changes to let theSync Code.ymlworkflow sync the code from upstream once. - Uncomment the
schedule-cronlines underOnsection to sync on a schedule.
- Global
customize.sh(all devices): rewrites the default LuCI IP to192.168.10.1inpackage/base-files/files/bin/config_generate. - Device-specific
devices/<name>/customize.shruns inside the cloned source tree before feeds are updated:- JDCloud AX3000
- Applies
device-files/*.patch— full RE-CS-03 device support (DTS / ath11k BDF / eMMC upgrade / uboot-env / caldata), migrated from jdc_re-cs-03 (openwrt main) to immortalwrt openwrt-25.12 - Adapted for the big-partition layout (
gpt.bin): single-slot eMMC partitions0:HLOS/rootfs/rootfs_data/swap;sysupgradetargets the actual partition names (not the upstream dual-slot*_1names) - Persistent
rootfs_dataoverlay viafstools_partname_fallback_scan=1bootarg (matched by GPT PARTNAME, so partition layout changes are tolerated) - Known issue — first boot needs a manual
rootfs_dataformat. The big-partition layout uses a dedicatedrootfs_datapartition (p16, ext4). Unlike rootdisk layouts (e.g. Redmi AX5 JDCloud) or MTD devices, fstools does not auto-format a standalone eMMCrootfs_data(jffs2_switch()only initializes MTD volumes), so the first boot falls back to a tmpfs overlay. Ifdf -hshows/on a small tmpfs, run once:mkfs.ext4 -L rootfs_data /dev/mmcblk0p16 && reboot(this is a one-time action; the partition keeps its data afterwards).
- Applies
- Redmi AX5 JDCloud / x86_64: currently an empty template
- JDCloud AX3000
- Build flow: checkout → free disk space → install deps → clone source + customize →
feeds update -a/feeds install -a→ config +make defconfig→make download→make -j$(nproc) V=s→ upload artifact & release.