Skip to content

Build OpenWrt system image #135

Build OpenWrt system image

Build OpenWrt system image #135

#============================================================================================
# https://github.com/ophub/amlogic-s9xxx-openwrt
# Description: Build OpenWrt system image
#============================================================================================
name: Build OpenWrt system image
on:
repository_dispatch:
workflow_dispatch:
inputs:
source_branch:
description: "Select the source branch"
required: false
default: "openwrt_main"
type: choice
options:
- openwrt_main
- immortalwrt_master
- lede_master
openwrt_board:
description: "Select device board"
required: false
default: "all"
type: choice
options:
- all
- top55
- after55
- a311d-oes_s922x-oes-plus_wxy-oect
- nsy-g16-plus_nsy-g68-plus_bdy-g18-pro
- s905d_s905x3_s912_s922x-ct2000
- a311d
- a311d-oes
- alark35-3500
- anas3035
- aio-3399b
- bdy-g18-pro
- beikeyun
- chainedbox
- crrc
- dc-a588
- dg3399
- dg-tn3568
- dlfr100
- e20c
- e25
- eaidk-610
- emb3531
- fine3399
- firefly-rk3399
- fmx1-pro
- jp-tvbox
- h28k
- h66k
- h68k
- h69k
- h88k
- h88k-v3
- h96-max-m2
- hs530r
- hugsun-x99
- ipc-r
- king3399
- kylin3399
- lckfb-tspi
- leez
- lx-r3s
- mrkaio-m68s
- nanopc-t6
- nanopi-r5c
- nanopi-r5s
- nsy-g16-plus
- nsy-g68-plus
- orangepi-5-plus
- orangepi-5b
- panther-x2
- photonicat
- r66s
- r68s
- renegade-rk3328
- rk3318-box
- rock5b
- rock5c
- ruisen-box
- s905
- s905-beelink-mini
- s905-mxqpro-plus
- s905d
- s905d-ki-pro
- s905d-sml5442tw
- s905l
- s905l-aurora-1s
- s905l-b860av21u
- s905l-mg101
- s905l2
- s905l2-e900v21e
- s905l2-wojia
- s905l3
- s905l3-cm211
- s905l3-unt400g1
- s905l3-unt402a
- s905l3a
- s905l3a-cm311
- s905l3a-m401a
- s905l3b
- s905l3b-e900v21d
- s905l3b-e900v22d
- s905l3b-e900v22e
- s905l3b-ip103h
- s905l3b-rg020et-ca
- s905l3b-unt403a
- s905lb-ipbs9505
- s905lb-q96-mini
- s905lb-r3300l
- s905mb
- s905w
- s905w-w95
- s905w-x96-mini
- s905w-x96w
- s905x
- s905x-b860h
- s905x-nexbox-a95x
- s905x-t95
- s905x-tbee
- s905x-tx9
- s905x2
- s905x2-km3
- s905x2-x96max-2g
- s905x2-hg680fj
- s905x3
- s905x3-2101
- s905x3-a100
- s905x3-a95xf3
- s905x3-a95xf3-gb
- s905x3-b
- s905x3-h96max
- s905x3-hk1
- s905x3-ip1001m
- s905x3-q1
- s905x3-q2
- s905x3-tx3
- s905x3-tx3-bz
- s905x3-ugoosx3
- s905x3-whale
- s905x3-x88-pro-x3
- s905x3-x96air
- s905x3-x96air-gb
- s905x3-x96max
- s912
- s912-h96pro-plus
- s912-m8s-pro
- s912-nexbox-a1
- s912-nexbox-a2
- s912-onecloudpro
- s912-phicomm-t1
- s912-t95z-plus
- s912-tx8-max
- s912-tx9-pro-2g
- s912-tx9-pro-3g
- s912-x92
- s912-zyxq-fake
- s922x
- s922x-ct2000
- s922x-gtking
- s922x-gtkingpro-h
- s922x-odroid-n2
- s922x-oes-plus
- s922x-reva
- s922x-ugoos-am6
- seewo-sv21
- smart-am40
- smart-am60
- station-m1
- station-m2
- sv-33a6x
- swan1-w28
- sw799
- tanix-tx6
- tb-ls3399
- tn3399
- tpm312
- tqc-a01
- tvi3315a
- vplus
- wocyber-a3
- wxy-oect
- wxy-oect-mod
- xiaobao
- yskj
- zcube1-max
- zk-r39a
- zysj
openwrt_kernel:
description: "Select kernel version"
required: false
default: "6.1.y_6.12.y"
type: choice
options:
- 5.10.y
- 5.15.y
- 6.1.y
- 6.6.y
- 6.12.y
- 5.10.y_5.15.y
- 5.15.y_6.1.y
- 6.1.y_6.12.y
- 6.1.y_6.6.y
- 6.6.y_6.12.y
auto_kernel:
description: "Auto use the latest kernel"
required: false
default: true
type: boolean
kernel_repo:
description: "Set the kernel repository"
required: false
default: "ophub/kernel"
type: choice
options:
- ophub/kernel
kernel_usage:
description: "Set the tags of the stable kernel."
required: false
default: "stable"
type: choice
options:
- stable
- flippy
- beta
openwrt_ip:
description: "Set OpenWrt default IP address."
required: false
default: "192.168.1.1"
use_ccache:
description: "Auto use ccache."
required: false
default: true
type: boolean
openwrt_storage:
description: "Select image storage type."
required: false
default: "save"
type: choice
options:
- save
- temp
builder_name:
description: "Set OpenWrt builder signature."
required: false
default: "ophub"
type: choice
options:
- ophub
- angel
- yourname
env:
FEEDS_CONF: config/${{ inputs.source_branch }}/feeds.conf.default
CONFIG_FILE: config/${{ inputs.source_branch }}/config
DIY_P1_SH: config/${{ inputs.source_branch }}/diy-part1.sh
DIY_P2_SH: config/${{ inputs.source_branch }}/diy-part2.sh
TZ: Etc/UTC
CCACHE_DIR: /builder/openwrt/.ccache
jobs:
build:
runs-on: ubuntu-24.04
if: ${{ github.event.repository.owner.id }} == ${{ github.event.sender.id }}
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Initialization environment
id: init
env:
DEBIAN_FRONTEND: noninteractive
run: |
docker rmi -f $(docker images -q) 2>/dev/null || true
[[ -n "${AGENT_TOOLSDIRECTORY}" ]] && sudo rm -rf "${AGENT_TOOLSDIRECTORY}"
sudo rm -rf /usr/share/dotnet /usr/local/lib/android 2>/dev/null
sudo swapoff -a
sudo rm -f /swapfile /mnt/swapfile
sudo -E apt-get -y update
sudo -E apt-get -y purge azure-cli ghc* zulu* llvm* firefox google* dotnet* powershell openjdk* mongodb* moby* || true
sudo -E apt-get -y install $(curl -fsSL https://ophub.org/ubuntu2404-make-openwrt-depends)
sudo -E systemctl daemon-reload
#sudo -E apt-get -y full-upgrade
sudo -E apt-get -y autoremove --purge
sudo -E apt-get clean
sudo sed -i '/NVM_DIR/d;/skel/d' /root/{.bashrc,.profile}
sudo rm -rf ~/{.cargo,.dotnet,.rustup}
sudo -E timedatectl set-timezone "${TZ:-Etc/UTC}"
sudo -E ntpdate ntp.ubuntu.com 0.pool.ntp.org || true
sudo -E timedatectl set-ntp true
date -u
timedatectl status || true
echo "status=success" >> ${GITHUB_OUTPUT}
- name: Create simulated physical disk
run: |
mnt_size=$(expr $(df -h /mnt | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 1)
root_size=$(expr $(df -h / | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 4)
sudo truncate -s "${mnt_size}"G /mnt/mnt.img
sudo truncate -s "${root_size}"G /root.img
sudo losetup /dev/loop6 /mnt/mnt.img
sudo losetup /dev/loop7 /root.img
sudo pvcreate /dev/loop6
sudo pvcreate /dev/loop7
sudo vgcreate github /dev/loop6 /dev/loop7
sudo lvcreate -n runner -l 100%FREE github
sudo mkfs.xfs -f -i sparse=0 -b size=4096 /dev/github/runner
sudo mkdir -p /builder
sudo mount /dev/github/runner /builder
sudo chown -R runner:runner /builder
df -Th
echo "status=success" >> ${GITHUB_OUTPUT}
- name: Clone source code [ ${{ inputs.source_branch }} ]
id: codes
working-directory: /builder
if: ${{ steps.init.outputs.status }} == 'success' && !cancelled()
run: |
# Set up compilation source code
if [[ "${{ inputs.source_branch }}" =~ ^openwrt ]]; then
REPO_URL="https://github.com/openwrt/openwrt"
elif [[ "${{ inputs.source_branch }}" =~ ^lede ]]; then
REPO_URL="https://github.com/coolsnowwolf/lede"
elif [[ "${{ inputs.source_branch }}" =~ ^immortalwrt ]]; then
REPO_URL="https://github.com/immortalwrt/immortalwrt"
else
echo "Unknown source code repository."
exit 1
fi
source_branch_input="${{ inputs.source_branch }}"
REPO_NAME="${source_branch_input%_*}"
REPO_BRANCH="${source_branch_input##*_}"
# Clone source code
git clone -q --single-branch --depth=1 --branch=${REPO_BRANCH} ${REPO_URL} openwrt
ln -sf /builder/openwrt ${{ github.workspace }}/openwrt
ln -sf /builder/openwrt /home/runner/work/_actions/ophub/amlogic-s9xxx-openwrt/main/openwrt
# Set output information
echo "build_tag=OpenWrt_${{ inputs.source_branch }}_${{ inputs.openwrt_storage }}_$(date +"%Y.%m")" >> ${GITHUB_ENV}
echo -e "REPO_URL: [ ${REPO_URL} ]\nREPO_BRANCH: [ ${REPO_BRANCH} ]\nREPO_NAME: [ ${REPO_NAME} ]"
df -hT ${PWD}
echo "REPO_URL=${REPO_URL}" >> ${GITHUB_ENV}
echo "REPO_NAME=${REPO_NAME}" >> ${GITHUB_ENV}
echo "REPO_BRANCH=${REPO_BRANCH}" >> ${GITHUB_ENV}
echo "status=success" >> ${GITHUB_OUTPUT}
- name: Load custom feeds
run: |
[[ -f "${FEEDS_CONF}" ]] && cp -f ${FEEDS_CONF} openwrt/feeds.conf.default
chmod +x ${DIY_P1_SH}
cd openwrt/
${{ github.workspace }}/${DIY_P1_SH}
- name: Update feeds
run: cd openwrt/ && ./scripts/feeds update -a
- name: Install feeds
run: cd openwrt/ && ./scripts/feeds install -a
- name: Load custom configuration
run: |
[[ -d "files" ]] && mv -f files openwrt/files
[[ -e "${CONFIG_FILE}" ]] && cp -f ${CONFIG_FILE} openwrt/.config
chmod +x ${DIY_P2_SH}
cd openwrt/
${{ github.workspace }}/${DIY_P2_SH} "${{ inputs.openwrt_ip }}" "${{ inputs.use_ccache }}"
- name: Download package
id: package
run: |
cd openwrt/
make defconfig
make download -j8
find dl -size -1024c -exec ls -l {} \;
find dl -size -1024c -exec rm -f {} \;
- name: Get OpenWrt source hash
id: openwrthash
if: ${{ steps.pull.outputs.status }} == 'success' && !cancelled()
run: |
# Get the latest source hash from the kernel repository
repo_path="$(echo "${{ env.REPO_URL }}" | awk -F"github.com/" '{print $2}')"
api_url="https://api.github.com/repos/${repo_path}/git/ref/heads/${{ env.REPO_BRANCH }}"
source_hash=$(curl -fsSL -m 20 \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
${api_url} |
jq -r '.object.sha'
)
[[ -z "${source_hash}" || "${source_hash}" == "null" ]] && source_hash="${{ github.sha }}"
echo "source_hash=${source_hash}" >> ${GITHUB_ENV}
echo "status=success" >> ${GITHUB_OUTPUT}
- name: Cache ccache
uses: actions/cache@v4
with:
path: /builder/openwrt/.ccache
key: openwrt-${{ env.REPO_NAME }}-${{ env.source_hash }}
restore-keys: |
openwrt-${{ env.REPO_NAME }}-
- name: Compile the OpenWrt
id: compile
run: |
cd openwrt/
echo -e "$(nproc) thread compile"
make -j$(($(nproc) + 1)) V=s || make -j1 || make -j1 V=s
echo -e "ccache statistics:"
ccache -s 2>/dev/null
echo -e "ccache directory size:"
du -sh $(pwd)/.ccache 2>/dev/null || echo "No ccache directory."
echo "status=success" >> ${GITHUB_OUTPUT}
- name: Clear server space
id: clean
if: ${{ steps.compile.outputs.status }} == 'success' && !cancelled()
run: |
# Clean up server space
cd openwrt/
[[ -d "output" ]] || mkdir output
cp -f bin/targets/*/*/*rootfs.tar.gz output/
cp -f .config output/config
ls -A | grep -vE '^(output|\.ccache)$' | xargs rm -rf || true
# Set output information
df -hT ${PWD}
echo "status=success" >> ${GITHUB_OUTPUT}
- name: Upload OpenWrt to Release
uses: ncipollo/release-action@main
if: ${{ steps.clean.outputs.status }} == 'success' && !cancelled()
with:
tag: ${{ env.build_tag }}
artifacts: openwrt/output/*
allowUpdates: true
removeArtifacts: false
replacesArtifacts: true
makeLatest: true
token: ${{ secrets.GITHUB_TOKEN }}
- name: Packaging OpenWrt
if: ${{ steps.clean.outputs.status }} == 'success' && !cancelled()
uses: ophub/amlogic-s9xxx-openwrt@main
with:
openwrt_path: openwrt/output/*rootfs.tar.gz
openwrt_ip: ${{ inputs.openwrt_ip }}
openwrt_board: ${{ inputs.openwrt_board }}
openwrt_kernel: ${{ inputs.openwrt_kernel }}
auto_kernel: ${{ inputs.auto_kernel }}
kernel_repo: ${{ inputs.kernel_repo }}
kernel_usage: ${{ inputs.kernel_usage }}
builder_name: ${{ inputs.builder_name }}
- name: Upload the packaged OpenWrt
uses: ncipollo/release-action@main
if: ${{ env.PACKAGED_STATUS }} == 'success' && !cancelled()
with:
tag: ${{ env.build_tag }}
artifacts: ${{ env.PACKAGED_OUTPUTPATH }}/*
allowUpdates: true
removeArtifacts: false
replacesArtifacts: true
makeLatest: true
token: ${{ secrets.GITHUB_TOKEN }}
body: |
### OpenWrt Image information
- Default IP: `192.168.1.1`
- Default username: `root`
- Default password: `password`
- Default WIFI name: `OpenWrt`
- Default WIFI password: `none`
### Install to EMMC
- Login to OpenWrt → `System` → `Amlogic Service` → `Install OpenWrt`
### OpenWrt source code
- [${{ env.REPO_NAME }}](${{ env.REPO_URL }}/tree/${{ env.REPO_BRANCH }})
### Applicable platform
- 🐧 `arm64`
- 🐋 Docker image: https://hub.docker.com/u/ophub