immortalwrt-BE12_Pro #7
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: immortalwrt-BE12_Pro | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| enable_ssh_debug: | |
| description: '启用 SSH 调试模式' | |
| required: false | |
| default: 'false' | |
| type: choice | |
| options: | |
| - 'false' | |
| - 'true' | |
| env: | |
| REPO_URL: https://github.com/immortalwrt/immortalwrt | |
| REPO_BRANCH: master | |
| CONFIG_FILE: BE12_Pro.config | |
| DIY_P1_SH: OpenWrt-part1.sh | |
| DIY_P2_SH: OpenWrt-part2.sh | |
| CACHE_TOOLCHAIN: true | |
| UPLOAD_BIN_DIR: false | |
| FIRMWARE_RELEASE: true | |
| FIRMWARE_TAG: BE12-Pro-immortalwrt | |
| TZ: Asia/Shanghai | |
| ENABLE_CCACHE: true | |
| jobs: | |
| Build: | |
| runs-on: ubuntu-22.04 | |
| # 添加权限声明 | |
| permissions: | |
| contents: write | |
| packages: write | |
| steps: | |
| # 步骤 1: 检查服务器性能 | |
| - name: Check Server Performance | |
| run: | | |
| echo "警告⚠ 服务器性能检查" | |
| echo "分配的服务器性能有限,若选择的插件过多,务必注意CPU性能!" | |
| echo "已知CPU型号(降序): 7763,8370C,8272CL,8171M,E5-2673" | |
| echo "----- CPU信息 -----" | |
| echo "CPU物理数量: $(cat /proc/cpuinfo | grep 'physical id' | sort -u | wc -l)" | |
| echo "CPU核心数量: $(nproc)" | |
| echo "CPU型号信息: $(cat /proc/cpuinfo | grep -m1 'model name' | cut -d':' -f2 | xargs)" | |
| echo "----- 内存信息 -----" | |
| free -h || true | |
| echo "----- 硬盘信息 -----" | |
| df -hT | |
| # 步骤 2: 初始化编译环境 | |
| - name: Initialization Environment | |
| env: | |
| DEBIAN_FRONTEND: noninteractive | |
| run: | | |
| # 清理 Docker 镜像 | |
| docker rmi $(docker images -q) 2>/dev/null || true | |
| # 删除不需要的路径 | |
| sudo rm -rf /usr/share/dotnet /etc/apt/sources.list.d /usr/local/lib/android "$AGENT_TOOLSDIRECTORY" || true | |
| # 卸载大型软件包 | |
| sudo -E apt-get -y purge \ | |
| azure-cli ghc* zulu* llvm* firefox google* dotnet* \ | |
| powershell openjdk* mongodb* moby* 2>/dev/null || true | |
| # 更新包管理器 | |
| sudo -E apt-get -y update | |
| # 安装依赖包 | |
| sudo -E apt-get -y install \ | |
| build-essential ccache curl git libelf-dev libfuse-dev libglib2.0-dev \ | |
| libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev \ | |
| libncursesw5-dev libpython3-dev libreadline-dev libssl-dev libtool \ | |
| p7zip p7zip-full unzip vim wget jq libc6-dev libffi-dev libpcre3-dev \ | |
| libsqlite3-dev zip gzip | |
| # 清理和优化 | |
| sudo -E systemctl daemon-reload | |
| sudo -E apt-get -y autoremove --purge | |
| sudo -E apt-get -y clean | |
| # 设置时区 | |
| sudo timedatectl set-timezone "$TZ" | |
| # 步骤 3: 扩展磁盘空间 | |
| - name: Combine Disks | |
| uses: easimon/maximize-build-space@v10 | |
| with: | |
| swap-size-mb: 2048 | |
| temp-reserve-mb: 100 | |
| root-reserve-mb: 1024 | |
| # 步骤 4: 检出代码 | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| # 步骤 5: 克隆源码并提取 Git 信息 | |
| - name: Clone Source Code | |
| run: | | |
| echo "磁盘空间使用情况:" | |
| df -hT "$GITHUB_WORKSPACE" | |
| echo "克隆源码仓库..." | |
| git clone "$REPO_URL" -b "$REPO_BRANCH" openwrt | |
| cd openwrt | |
| echo "OPENWRT_PATH=$PWD" >> "$GITHUB_ENV" | |
| # 提取 Git 信息 | |
| COMMIT_AUTHOR=$(git show -s --date=short --format="作者: %an") | |
| echo "COMMIT_AUTHOR=$COMMIT_AUTHOR" >> "$GITHUB_ENV" | |
| COMMIT_DATE=$(git show -s --date=short --format="时间: %ci") | |
| echo "COMMIT_DATE=$COMMIT_DATE" >> "$GITHUB_ENV" | |
| COMMIT_MESSAGE=$(git show -s --date=short --format="内容: %s") | |
| echo "COMMIT_MESSAGE=$COMMIT_MESSAGE" >> "$GITHUB_ENV" | |
| COMMIT_HASH=$(git show -s --date=short --format="hash: %H") | |
| echo "COMMIT_HASH=$COMMIT_HASH" >> "$GITHUB_ENV" | |
| # 步骤 6: 生成变量 | |
| - name: Generate Variables | |
| run: | | |
| cp "$CONFIG_FILE" "$OPENWRT_PATH/.config" | |
| cd "$OPENWRT_PATH" | |
| make defconfig > /dev/null 2>&1 | |
| SOURCE_REPO="$(basename "$REPO_URL" .git)" | |
| echo "SOURCE_REPO=$SOURCE_REPO" >> "$GITHUB_ENV" | |
| DEVICE_TARGET=$(grep -m1 'CONFIG_TARGET_BOARD' .config | cut -d'"' -f2) | |
| echo "DEVICE_TARGET=$DEVICE_TARGET" >> "$GITHUB_ENV" | |
| DEVICE_SUBTARGET=$(grep -m1 'CONFIG_TARGET_SUBTARGET' .config | cut -d'"' -f2) | |
| echo "DEVICE_SUBTARGET=$DEVICE_SUBTARGET" >> "$GITHUB_ENV" | |
| # 步骤 6.1: 生成缓存 Key(基于配置) | |
| - name: Generate Cache Key | |
| id: cachekey | |
| run: | | |
| cd "$OPENWRT_PATH" | |
| make defconfig | |
| echo "CONFIG_HASH=$(sha1sum .config | cut -d' ' -f1)" >> "$GITHUB_ENV" | |
| # 步骤 7: Toolchain 缓存(更稳定) | |
| - name: Cache Toolchain | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ${{ env.OPENWRT_PATH }}/staging_dir/toolchain-* | |
| ${{ env.OPENWRT_PATH }}/staging_dir/host* | |
| key: toolchain-${{ env.CONFIG_HASH }} | |
| # 步骤 7.1: DL 源码缓存 | |
| - name: Cache DL | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ env.OPENWRT_PATH }}/dl | |
| key: dl-${{ env.CONFIG_HASH }} | |
| restore-keys: | | |
| dl- | |
| # 步骤 7.2: ccache 缓存 | |
| - name: Cache ccache | |
| if: always() && env.ENABLE_CCACHE == 'true' | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.ccache | |
| key: ccache-${{ github.ref }} | |
| restore-keys: ccache- | |
| # 步骤 8: 加载自定义 feeds | |
| - name: Load Custom Feeds | |
| run: | | |
| chmod +x "$DIY_P1_SH" | |
| cd "$OPENWRT_PATH" | |
| "$GITHUB_WORKSPACE/$DIY_P1_SH" | |
| # 步骤 9: 更新和安装 feeds | |
| - name: Install Feeds | |
| run: | | |
| cd "$OPENWRT_PATH" | |
| ./scripts/feeds update -a | |
| ./scripts/feeds install -a | |
| # 步骤 10: 加载自定义配置 | |
| - name: Load Custom Configuration | |
| run: | | |
| [ -e files ] && mv files "$OPENWRT_PATH/files" | |
| [ -e "$CONFIG_FILE" ] && mv "$CONFIG_FILE" "$OPENWRT_PATH/.config" | |
| [ -d "$GITHUB_WORKSPACE/scripts" ] && chmod +x "$GITHUB_WORKSPACE/scripts"/*.sh | |
| chmod +x "$DIY_P2_SH" | |
| cd "$OPENWRT_PATH" | |
| "$GITHUB_WORKSPACE/$DIY_P2_SH" | |
| # 步骤 11: SSH 调试(可选) | |
| - name: SSH Debug | |
| uses: mxschmitt/action-tmate@v3 | |
| if: | | |
| failure() || | |
| (github.event_name == 'workflow_dispatch' && | |
| github.event.inputs.enable_ssh_debug == 'true') | |
| with: | |
| limit-output-lines: 1000 | |
| # 步骤 12: 下载依赖包 | |
| - name: Download DL Package | |
| run: | | |
| cd "$OPENWRT_PATH" | |
| make defconfig | |
| make download -j$(nproc) | |
| # 移除损坏的包 | |
| find dl -size -1024c -exec rm -f {} \; | |
| # 步骤 13: 编译固件 | |
| - name: Compile Firmware | |
| id: compile | |
| run: | | |
| cd "$OPENWRT_PATH" | |
| if [ "$ENABLE_CCACHE" = "true" ]; then | |
| export CCACHE_DIR=~/.ccache | |
| export CCACHE_MAXSIZE=2G | |
| export CC="ccache gcc" | |
| export CXX="ccache g++" | |
| fi | |
| mkdir -p files/etc/uci-defaults | |
| cp "$GITHUB_WORKSPACE/scripts/init-settings.sh" files/etc/uci-defaults/99-init-settings | |
| echo "使用 $(nproc) 线程编译" | |
| echo "编译前的目录结构:" | |
| ls -la bin/ 2>/dev/null || echo "bin/ 目录不存在" | |
| # 多次尝试编译,逐步降低并行度 | |
| make -j$(nproc) || make -j$(( $(nproc) / 2 )) || make -j1 || make -j1 V=s | |
| echo "编译后的目录结构:" | |
| ls -la bin/ 2>/dev/null || echo "bin/ 目录仍不存在" | |
| # 标记编译成功 | |
| echo "status=success" >> "$GITHUB_OUTPUT" | |
| # 记录时间 | |
| echo "DATE=$(date +'%Y-%m-%d %H:%M:%S')" >> "$GITHUB_ENV" | |
| echo "FILE_DATE=$(date +'%Y.%m.%d')" >> "$GITHUB_ENV" | |
| # 步骤 14: 检查空间使用 | |
| - name: Check Space Usage | |
| if: always() | |
| run: | | |
| echo "编译后磁盘空间使用情况:" | |
| df -hT | |
| # 步骤 15: 整理固件文件 | |
| - name: Organize Files | |
| if: steps.compile.outputs.status == 'success' | |
| run: | | |
| echo "========== 调试信息 ==========" | |
| echo "当前工作目录: $PWD" | |
| echo "OPENWRT_PATH: $OPENWRT_PATH" | |
| # 列出编译输出目录结构 | |
| echo "bin 目录结构:" | |
| if [ -d "$OPENWRT_PATH/bin" ]; then | |
| ls -lR "$OPENWRT_PATH/bin/" | head -50 | |
| else | |
| echo "ERROR: $OPENWRT_PATH/bin 目录不存在!" | |
| exit 1 | |
| fi | |
| echo "========== 寻找固件文件 ==========" | |
| # 查找所有 .bin 或 .tar.gz 文件 | |
| FIRMWARE_FILES=$(find "$OPENWRT_PATH/bin" -type f \( -name "*.bin" -o -name "*.tar.gz" -o -name "*.squashfs" \) 2>/dev/null) | |
| if [ -z "$FIRMWARE_FILES" ]; then | |
| echo "ERROR: 没有找到任何固件文件!" | |
| echo "编译可能失败了。请检查上一步的编译日志。" | |
| exit 1 | |
| fi | |
| echo "找到的固件文件:" | |
| echo "$FIRMWARE_FILES" | |
| echo "========== 整理文件 ==========" | |
| # 创建输出目录 | |
| mkdir -p "$GITHUB_WORKSPACE/firmware-output" | |
| # 复制所有固件文件到输出目录 | |
| find "$OPENWRT_PATH/bin" -type f \( -name "*.bin" -o -name "*.tar.gz" -o -name "*.squashfs" -o -name "*.imagebuilder*" -o -name "*.manifest" -o -name "sha256sums" \) -exec cp {} "$GITHUB_WORKSPACE/firmware-output/" \; 2>/dev/null || true | |
| # 复制配置文件 | |
| [ -f "$OPENWRT_PATH/.config" ] && cp "$OPENWRT_PATH/.config" "$GITHUB_WORKSPACE/firmware-output/build.config" | |
| echo "输出目录内容:" | |
| ls -lh "$GITHUB_WORKSPACE/firmware-output/" | |
| # 设置固件路径 | |
| echo "FIRMWARE_PATH=$GITHUB_WORKSPACE/firmware-output" >> "$GITHUB_ENV" | |
| # 提取内核版本 | |
| if [ -f "$GITHUB_WORKSPACE/firmware-output"/*.manifest ]; then | |
| KERNEL=$(grep '^kernel' "$GITHUB_WORKSPACE/firmware-output"/*.manifest 2>/dev/null | head -1 | cut -d- -f2 | xargs || echo "unknown") | |
| echo "KERNEL=$KERNEL" >> "$GITHUB_ENV" | |
| fi | |
| # 步骤 16: 上传固件到制品库(可选) | |
| - name: Upload Firmware To Artifact | |
| if: steps.compile.outputs.status == 'success' && env.FIRMWARE_RELEASE != 'true' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ env.SOURCE_REPO }}-firmware-${{ env.DEVICE_TARGET }}-${{ env.DEVICE_SUBTARGET }}-${{ env.FILE_DATE }} | |
| path: ${{ env.FIRMWARE_PATH }} | |
| retention-days: 30 | |
| # 步骤 17: 上传固件到 Release | |
| - name: Upload Firmware To Release | |
| if: steps.compile.outputs.status == 'success' && env.FIRMWARE_RELEASE == 'true' | |
| uses: ncipollo/release-action@v1 | |
| with: | |
| name: R${{ env.DATE }} for ${{ env.FIRMWARE_TAG }} | |
| allowUpdates: true | |
| makeLatest: true | |
| tag: ${{ env.FIRMWARE_TAG }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| artifacts: ${{ env.FIRMWARE_PATH }}/* | |
| body: | | |
| # ImmortalWrt 固件发布 | |
| **设备**: ${{ env.FIRMWARE_TAG }} | |
| **编译时间**: ${{ env.DATE }} | |
| ## 📒 固件信息 | |
| - 💻 平台架构: `${{ env.DEVICE_TARGET }}-${{ env.DEVICE_SUBTARGET }}` | |
| - ⚽ 固件源码: [${{ env.REPO_URL }}](${{ env.REPO_URL }}) | |
| - 💝 源码分支: `${{ env.REPO_BRANCH }}` | |
| - 🚀 内核版本: `${{ env.KERNEL }}` | |
| - 🌐 默认地址: `192.168.1.1` | |
| - 🔑 默认密码: 无 | |
| ## 🧊 最后一次源码更新记录 | |
| ``` | |
| ${{ env.COMMIT_AUTHOR }} | |
| ${{ env.COMMIT_DATE }} | |
| ${{ env.COMMIT_MESSAGE }} | |
| ${{ env.COMMIT_HASH }} | |
| ``` | |
| ## 📝 SHA256 校验 | |
| 请检查下载的固件文件完整性。 | |
| # 步骤 18: 清理工作空间(可选) | |
| - name: Clean Up Workspace | |
| if: always() | |
| run: | | |
| # 可选:删除大型临时文件以节省空间 | |
| cd "$OPENWRT_PATH" 2>/dev/null || true | |
| rm -rf .git dl/git-* 2>/dev/null || true | |
| du -sh . || true |