Build OpenWrt system image #135
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #============================================================================================ | |
| # 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 |