Skip to content

immortalwrt-BE12_Pro #7

immortalwrt-BE12_Pro

immortalwrt-BE12_Pro #7

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