Skip to content

build x86/64 openwrt #38

build x86/64 openwrt

build x86/64 openwrt #38

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 }}