build x86/64 openwrt #38
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
| name: build x86/64 openwrt | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| repo_url: | |
| description: '选择要编译的分支项目' | |
| required: true | |
| default: 'https://github.com/immortalwrt/immortalwrt' | |
| type: choice | |
| options: ['https://github.com/immortalwrt/immortalwrt', 'https://github.com/coolsnowwolf/lede'] | |
| source: | |
| description: '选择要编译的LUCI版本,lede无18.06' | |
| required: true | |
| default: 'openwrt-24.10' | |
| type: choice | |
| options: ['openwrt-18.06', 'openwrt-24.10', 'openwrt-25.12'] | |
| target: | |
| description: '选择要编译的机型' | |
| required: true | |
| default: 'x86-64' | |
| type: choice | |
| options: ['x86-64'] | |
| ip: | |
| description: '设置默认登录IP' | |
| required: false | |
| default: '192.168.123.2' | |
| partsize: | |
| description: '设置rootfs大小' | |
| required: false | |
| default: '800' | |
| toolchain: | |
| description: '使用toolchain缓存' | |
| required: false | |
| default: true | |
| type: boolean | |
| zsh_tool: | |
| description: '预设zsh终端工具' | |
| required: false | |
| default: true | |
| type: boolean | |
| openclash: | |
| description: '预设openclash内核' | |
| required: false | |
| default: 'amd64' | |
| type: choice | |
| options: [false, amd64, arm64, armv7, armv6, armv5, 386] | |
| artifact: | |
| description: '上传固件到Artifact' | |
| required: false | |
| default: true | |
| type: boolean | |
| release: | |
| description: '上传固件到Releases' | |
| required: false | |
| default: true | |
| type: boolean | |
| jobs: | |
| build: | |
| runs-on: ubuntu-24.04 | |
| name: build ${{ github.event.inputs.target }} ${{ github.event.inputs.source }} | |
| env: | |
| DEFAULT_IP: ${{ github.event.inputs.ip }} | |
| PART_SIZE: ${{ github.event.inputs.partsize }} | |
| TOOLCHAIN: ${{ github.event.inputs.toolchain }} | |
| ZSH_TOOL: ${{ github.event.inputs.zsh_tool }} | |
| CLASH_KERNEL: ${{ github.event.inputs.openclash }} | |
| CONFIG_FILE: configs/${{ github.event.inputs.target }}-${{ github.event.inputs.source }}.config | |
| DIY_SCRIPT: diy-${{ github.event.inputs.source }}.sh | |
| RELEASE_TAG: ${{ github.event.inputs.target }}-${{ github.event.inputs.source }} | |
| TOOLCHAIN_TAG: toolchain | |
| UPLOAD_BIN_DIR: false | |
| TZ: Asia/Shanghai | |
| REPO_URL: ${{ github.event.inputs.repo_url }} | |
| REPO_BRANCH: ${{ github.event.inputs.repo_url == 'https://github.com/coolsnowwolf/lede' && 'master' || github.event.inputs.source }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@main | |
| - name: Free up disk space | |
| run: | | |
| # 1. 清理 APT 缓存和旧包(最大的空间占用之一) | |
| sudo apt-get clean | |
| sudo apt-get autoremove -y --purge | |
| sudo rm -rf /var/lib/apt/lists/* | |
| # 2. 清理 Docker 镜像/容器(如果用了 Docker,这是空间大户) | |
| docker system prune -a -f || true # || true 避免无 Docker 时报错 | |
| sudo rm -rf /var/lib/docker/* || true | |
| # 3. 清理 GitHub Runner 旧日志和缓存 | |
| sudo rm -rf /home/runner/actions-runner/cached/_diag/*.log | |
| sudo rm -rf /home/runner/actions-runner/_work/_temp/* | |
| sudo rm -rf /home/runner/actions-runner/_work/_artifact/* | |
| # 4. 清理预装的大体积无用工具(按需删除,比如不用 Android/Unity/.NET 旧版本) | |
| sudo rm -rf /usr/local/lib/android # 约 10GB | |
| sudo rm -rf /usr/share/dotnet # 约 2GB | |
| sudo rm -rf /opt/ghc # Haskell 编译器,约 1GB | |
| sudo rm -rf /opt/hostedtoolcache/CodeQL # 不用 CodeQL 则删除 | |
| sudo rm -rf /opt/hostedtoolcache/node/* # 只保留当前需要的 Node 版本 | |
| # 5. 清理临时文件 | |
| sudo rm -rf /tmp/* | |
| sudo rm -rf /var/tmp/* | |
| # 验证剩余空间 | |
| df -h | |
| - name: Check Server Performance | |
| run: | | |
| echo "警告⚠" | |
| echo "分配的服务器性能有限,若选择的插件过多,务必注意CPU性能!" | |
| echo -e "已知CPU型号(降序): 7763,8370C,8272CL,8171M,E5-2673\n" | |
| echo "==========================CPU信息==========================" | |
| echo "CPU物理数量: $(cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l)" | |
| echo "CPU线程数量: $(nproc)" | |
| echo -e "CPU型号信息:$(cat /proc/cpuinfo | grep -m1 name | awk -F: '{print $2}')\n" | |
| echo "==========================内存信息==========================" | |
| echo "已安装内存详细信息:" | |
| echo -e "$(sudo lshw -short -C memory | grep GiB)\n" | |
| echo "==========================硬盘信息==========================" | |
| echo "硬盘数量: $(ls /dev/sd* | grep -v [1-9] | wc -l)" && df -hT | |
| - name: Initialization Environment | |
| env: | |
| DEBIAN_FRONTEND: noninteractive | |
| run: | | |
| docker rmi -f $(docker images -q) 2>/dev/null || true | |
| sudo rm -rf /usr/share/dotnet /usr/local/lib/android $AGENT_TOOLSDIRECTORY | |
| sudo swapoff -a && sudo rm -f /swapfile /mnt/swapfile | |
| sudo -E apt-get -y purge azure-cli ghc* zulu* llvm* firefox google* dotnet* powershell openjdk* mongodb* moby* || true | |
| sudo -E apt-get -y update | |
| sudo -E apt-get -y install lvm2 btrfs-progs | |
| sudo -E apt-get -y install $(curl -fsSL is.gd/depends_ubuntu_2404) | |
| sudo -E systemctl daemon-reload | |
| sudo -E apt-get -y autoremove --purge | |
| sudo -E apt-get -y clean | |
| sudo timedatectl set-timezone "$TZ" | |
| - name: Combine Disks | |
| run: | | |
| # 仅修复核心错误:解决fallocate无效长度问题 | |
| # 1. 定义安全计算函数(避免负数/非数值) | |
| calculate_safe_size() { | |
| local mount_point=$1 | |
| local reserve_mb=$2 | |
| # 获取可用空间(KB),过滤非数字字符 | |
| local avail_kb=$(df --block-size=1024 --output=avail "$mount_point" 2>/dev/null | tail -1 | tr -d '[:space:]') | |
| # 验证数值有效性 | |
| if ! [[ "$avail_kb" =~ ^[0-9]+$ ]]; then | |
| echo "Error: 无法获取 $mount_point 的可用空间" | |
| exit 1 | |
| fi | |
| # 计算目标大小(字节),最小值设为100MB | |
| local reserve_kb=$((reserve_mb * 1024)) | |
| local target_kb=$((avail_kb - reserve_kb)) | |
| [ $target_kb -lt 102400 ] && target_kb=102400 | |
| echo $((target_kb * 1024)) | |
| } | |
| # 2. 安全计算大小 + 替换fallocate为truncate(核心修复) | |
| MNT_SIZE=$(calculate_safe_size "/mnt" 1024) | |
| sudo truncate -s $MNT_SIZE /mnt/mnt.img | |
| MNT_NAME=$(sudo losetup -Pf --show /mnt/mnt.img) | |
| sudo pvcreate -f $MNT_NAME | |
| ROOT_SIZE=$(calculate_safe_size "/" 4096) | |
| sudo truncate -s $ROOT_SIZE /root.img | |
| ROOT_NAME=$(sudo losetup -Pf --show /root.img) | |
| sudo pvcreate -f $ROOT_NAME | |
| # 3. 原逻辑保留,仅新增卷组创建容错 | |
| sudo vgcreate actions $MNT_NAME $ROOT_NAME || { | |
| sudo vgremove -f actions && sudo vgcreate actions $MNT_NAME $ROOT_NAME | |
| } | |
| sudo lvcreate -n disk -l 100%FREE actions | |
| LV_NAME=$(sudo lvscan | awk -F "'" '{print $2}') | |
| sudo mkfs.btrfs -f -L combinedisk $LV_NAME | |
| sudo mkdir -p /workdir | |
| sudo mount -o compress=zstd $LV_NAME /workdir | |
| sudo chown -R runner:runner /workdir && df -hT | |
| - name: Load Compile Script | |
| run: chmod +x $DIY_SCRIPT && ./$DIY_SCRIPT | |
| - name: Compile Toolchain | |
| if: env.REBUILD_TOOLCHAIN == 'true' | |
| id: toolchain | |
| run: | | |
| cd $OPENWRT_PATH | |
| make toolchain/compile -j$(nproc) || make toolchain/compile -j1 V=s | |
| $GITHUB_WORKSPACE/$DIY_SCRIPT | |
| - name: Delete Old Toolchain | |
| if: steps.toolchain.conclusion == 'success' || env.OUTPUT_RELEASE == 'true' | |
| uses: mknejp/delete-release-assets@v1 | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| tag: ${{ env.TOOLCHAIN_TAG }} | |
| assets: '${{ env.SOURCE_REPO }}-${{ env.LITE_BRANCH }}-${{ env.DEVICE_TARGET }}*' | |
| fail-if-no-assets: false | |
| fail-if-no-release: false | |
| - name: Upload Toolchain To Release | |
| if: steps.toolchain.conclusion == 'success' || env.OUTPUT_RELEASE == 'true' | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| name: toolchain-cache | |
| tag_name: ${{ env.TOOLCHAIN_TAG }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| files: output/* | |
| body: OpenWrt 工具链缓存 | |
| - name: Download DL Package | |
| run: | | |
| cd $OPENWRT_PATH | |
| # make download -j$(nproc) | |
| make package/download -j$(nproc) | |
| find dl -size -1024c -exec ls -l {} \; | |
| find dl -size -1024c -exec rm -f {} \; | |
| - name: Compile Firmware | |
| id: compile | |
| run: | | |
| cd $OPENWRT_PATH | |
| mkdir -p files/etc/uci-defaults | |
| cp $GITHUB_WORKSPACE/scripts/init-settings.sh files/etc/uci-defaults/99-init-settings | |
| echo -e "$(nproc) thread compile" | |
| make -j$(nproc) || make -j1 V=s | |
| echo "FILE_DATE=$(date +"%Y.%m.%d")" >>$GITHUB_ENV | |
| echo "DATE=$(date +"%Y-%m-%d %H:%M:%S")" >>$GITHUB_ENV | |
| - name: Upload Bin Directory | |
| if: steps.compile.conclusion == 'success' && env.UPLOAD_BIN_DIR == 'true' | |
| uses: actions/upload-artifact@main | |
| with: | |
| name: ${{ env.SOURCE_REPO }}-${{ env.LITE_BRANCH }}-${{ env.DEVICE_TARGET }}-bin-${{ env.FILE_DATE }} | |
| path: ${{ env.OPENWRT_PATH }}/bin | |
| - name: Organize Files | |
| if: steps.compile.conclusion == 'success' | |
| run: | | |
| df -hT | |
| echo "===============================" | |
| ls $OPENWRT_PATH/bin/targets/*/* | |
| echo "===============================" | |
| cd $OPENWRT_PATH/bin/targets/*/* | |
| cat config.buildinfo | |
| cp -rf $OPENWRT_PATH/bin/packages/* packages | |
| tar -zcf packages.tar.gz packages | |
| sleep 3s && rm -rf packages sha256sums *.buildinfo *.bin *.json *rootfs.img.gz | |
| sed '/^$/d' $OPENWRT_PATH/.config >config.txt | |
| echo "FIRMWARE_PATH=$PWD" >>$GITHUB_ENV | |
| - name: Upload Firmware To Artifact | |
| if: steps.compile.conclusion == 'success' && github.event.inputs.artifact == 'true' | |
| uses: actions/upload-artifact@main | |
| with: | |
| name: ${{ env.SOURCE_REPO }}-${{ env.LITE_BRANCH }}-${{ env.DEVICE_TARGET }}-firmware-${{ env.FILE_DATE }} | |
| path: ${{ env.FIRMWARE_PATH }} | |
| - name: Upload Firmware To Release | |
| if: steps.compile.conclusion == 'success' && github.event.inputs.release == 'true' | |
| uses: ncipollo/release-action@main | |
| with: | |
| name: ${{ env.DATE }} for ${{ env.DEVICE_TARGET }} | |
| allowUpdates: true | |
| removeArtifacts: true | |
| tag: ${{ env.SOURCE_REPO}}-${{ env.RELEASE_TAG }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| artifacts: ${{ env.FIRMWARE_PATH }}/* | |
| body: | | |
| **This is ${{ env.SOURCE_REPO }} firmware for ${{ env.DEVICE_TARGET }}** | |
| ### 📒 固件信息 | |
| - 💻 平台架构: ${{ env.DEVICE_TARGET }} | |
| - ⚽ 固件源码: ${{ env.REPO_URL }} | |
| - 💝 源码分支: ${{ env.REPO_BRANCH }} | |
| - 🚀 内核版本: ${{ env.KERNEL_VERSION }} | |
| - 🌐 默认地址: ${{ env.DEFAULT_IP }} | |
| - 🔑 默认密码: password | |
| ### 🧊 固件版本 | |
| - 固件编译前最后一次➦[主源码](${{ env.REPO_URL }})更新记录 | |
| - ${{ env.COMMIT_AUTHOR }} | |
| - ${{ env.COMMIT_DATE }} | |
| - ${{ env.COMMIT_MESSAGE }} | |
| - ${{ env.COMMIT_HASH }} |