Skip to content

编译OpenWrt固件 #1130

编译OpenWrt固件

编译OpenWrt固件 #1130

#
#
# 感谢p3terx大神的一键编译脚本
#
# Copyright (C) 2019 P3TERX <https://p3terx.com>
# <https://github.com/P3TERX/Actions-OpenWrt.git>
#
name: 编译OpenWrt固件
on:
workflow_dispatch:
inputs:
Lean_x86_64:
description: '编译 Lean_x86_64'
type: boolean
default: false
Lean_x86_64_Long:
description: '编译 Lean_x86_64_Long'
type: boolean
default: false
immortalwrt_x86_64:
description: '编译 immortalwrt_x86_64'
type: boolean
default: false
immortalwrt_ax6600:
description: '编译 immortalwrt_ax6600'
type: boolean
default: false
CACHE_BUILD:
description: '缓存加速'
type: boolean
default: true
BUILD_SSH:
description: '开启SSH调试模式'
type: boolean
default: false
Build_Mod:
description: '调试模式,只配置环境不编译'
type: boolean
default: false
Custom_Commands:
description: '临时调试命令 (手动输入要执行的 Shell 命令)'
type: string
default: ''
# 定时触发编译(1,5,10,15,20,25,30早3点)
schedule:
- cron: 0 17 4,9,14,19,24,31 * *
# 点赞☆Star触发编译
# watch:
# types: [started]
env:
TZ: Asia/Shanghai
MY_GITHUB_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }}
WECHAT_WORK_URL: ${{ secrets.WECHAT_WORK_URL }}
WECHAT_WORK_TOKEN: ${{ secrets.WECHAT_WORK_TOKEN }}
TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
GITHUB_RELEASE: "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/releases"
jobs:
# 生成设备数组
build-openwrt:
runs-on: ubuntu-latest
outputs:
selected_models: ${{ steps.set-models.outputs.models }}
steps:
- id: set-models
run: |
MODELS=()
# 定时触发编译全部
if [ "${{ github.event_name }}" = "schedule" ]; then
MODELS=("Lean_x86_64" "Lean_x86_64_Long" "immortalwrt_x86_64" "immortalwrt_ax6600")
else
# 手动触发判断
[ "${{ github.event.inputs.Lean_x86_64 }}" = "true" ] && MODELS+=("Lean_x86_64")
[ "${{ github.event.inputs.Lean_x86_64_Long }}" = "true" ] && MODELS+=("Lean_x86_64_Long")
[ "${{ github.event.inputs.immortalwrt_x86_64 }}" = "true" ] && MODELS+=("immortalwrt_x86_64")
[ "${{ github.event.inputs.immortalwrt_ax6600 }}" = "true" ] && MODELS+=("immortalwrt_ax6600")
fi
# 转换为 JSON 数组
JSON_MODELS=$(printf '%s\n' "${MODELS[@]}" | jq -R . | jq -s -c .)
echo "models=$JSON_MODELS" >> $GITHUB_OUTPUT
build:
needs: [build-openwrt]
runs-on: ubuntu-22.04
env:
CACHE_BUILD: ${{ github.event.inputs.CACHE_BUILD || 'true' }}
BUILD_SSH: ${{ github.event.inputs.BUILD_SSH || 'false' }}
BUILD_MOD: ${{ github.event.inputs.Build_Mod || 'false' }}
if: needs.build-openwrt.outputs.selected_models != '[]' && (github.event.repository.owner.id == github.event.sender.id || ! github.event.sender.id)
strategy:
fail-fast: false
matrix:
target: ${{ fromJSON(needs.build-openwrt.outputs.selected_models) }}
name: 编译 ${{matrix.target}}
steps:
- name: 编译参数
run: |
echo "正在编译目标设备: ${{ matrix.target }}"
echo "是否开启缓存: ${CACHE_BUILD}"
echo "是否开启SSH: ${BUILD_SSH}"
echo "是否为调试模式: ${BUILD_MOD}"
echo "调试命令: ${{ github.event.inputs.Custom_Commands }}"
- name: Checkout 仓库
uses: actions/checkout@v5
- name: 检测脚本设置
run: |
source "${GITHUB_WORKSPACE}/build/${{matrix.target}}/settings.ini"
echo "REPO_URL=${REPO_URL}" >> $GITHUB_ENV
echo "REPO_BRANCH=${REPO_BRANCH}" >> $GITHUB_ENV
echo "CONFIG_FILE=${CONFIG_FILE}" >> $GITHUB_ENV
echo "FIRMWARE_MESSAGE=${FIRMWARE_MESSAGE}" >> $GITHUB_ENV
echo "CUSTOM_SH=${CUSTOM_SH}" >> $GITHUB_ENV
echo "CACHE_BUILD=${CACHE_BUILD}" >> $GITHUB_ENV
echo "UPLOAD_FIRMWARE=${UPLOAD_FIRMWARE}" >> $GITHUB_ENV
echo "UPLOAD_QCOW2=${UPLOAD_QCOW2}" >> $GITHUB_ENV
echo "UPLOAD_VHDX=${UPLOAD_VHDX}" >> $GITHUB_ENV
echo "UPLOAD_VMDK=${UPLOAD_VMDK}" >> $GITHUB_ENV
echo "UPLOAD_IPK=${UPLOAD_IPK}" >> $GITHUB_ENV
echo "UPLOAD_CONFIG=${UPLOAD_CONFIG}" >> $GITHUB_ENV
echo "UPLOAD_ISO=${UPLOAD_ISO}" >> $GITHUB_ENV
echo "UPLOAD_RELEASE=${UPLOAD_RELEASE}" >> $GITHUB_ENV
echo "WECHAT_WORK_PUSH=${WECHAT_WORK_PUSH}" >> $GITHUB_ENV
echo "TELEGRAM_BOT=${TELEGRAM_BOT}" >> $GITHUB_ENV
#添加变量
echo "HOME=${GITHUB_WORKSPACE}/openwrt" >> $GITHUB_ENV
echo "WORKPATH=${GITHUB_WORKSPACE}/openwrt/build/${{matrix.target}}" >> $GITHUB_ENV
- name: 初始化系统环境
env:
DEBIAN_FRONTEND: noninteractive
run: |
sudo -E apt -yqq purge firefox
sudo -E apt -yqq update
sudo -E apt -yqq full-upgrade
sudo -E apt -yqq autoremove --purge
sudo -E apt -yqq autoclean
sudo -E apt -yqq clean
sudo -E apt -yqq install dos2unix python3-netifaces libfuse-dev
sudo bash -c 'bash <(curl -sL https://build-scripts.immortalwrt.org/init_build_environment.sh)'
sudo -E systemctl daemon-reload
sudo -E apt -y autoremove --purge
sudo -E apt clean
- name: 编译前准备
run: |
sudo mkdir -p /workdir
sudo chown $USER:$GROUPS /workdir
sudo timedatectl set-timezone "$TZ"
echo
echo " 系统空间 类型 总数 已用 可用 使用率"
df -hT $PWD
- name: 释放Ubuntu磁盘空间
if: env.BUILD_MOD == 'false'
uses: jlumbroso/free-disk-space@main
with:
# this might remove tools that are actually needed,
# if set to "true" but frees about 6 GB
tool-cache: true
# all of these default to true, but feel free to set to
# "false" if necessary for your workflow
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- name: 创建模拟物理磁盘
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 /dev/github/runner
sudo mkdir -p /github-builder
sudo mount /dev/github/runner /github-builder
sudo chown -R $USER:$GROUPS /github-builder
df -Th
- name: 下载${{matrix.target}}源码
working-directory: /github-builder
run: |
df -hT $PWD
git clone -b $REPO_BRANCH --single-branch $REPO_URL openwrt
ln -sf /github-builder/openwrt $GITHUB_WORKSPACE/openwrt
- name: 缓存加速
uses: stupidloud/cachewrtbuild@main
if: env.CACHE_BUILD == 'true' || (github.event.inputs.CACHE_BUILD == 'true')
with:
ccache: 'true'
prefix: ${{ github.workspace }}/openwrt
- name: 更新时区、编译时间
id: date
run: |
sudo timedatectl set-timezone "$TZ"
echo "FILE_TIME=$(date +"%m-%d %H.%M")" >> $GITHUB_ENV
echo "FILE_TIME1=$(date "+%Y年%m月%d日-%H点%M分")" >> $GITHUB_ENV
echo "FILE_TIME2=$(date "+%Y%m%d-%H%M")" >> $GITHUB_ENV
echo "编译开始时间..."
START_TIME=`date +'%Y-%m-%d %H:%M:%S'`
echo "START_SECONDS=$(date --date="$START_TIME" +%s)" >> $GITHUB_ENV
- name: 加载源,定制文件并生成自定义配置
run: |
# 复制配置文件到源码目录
cp -Rf `find ./ -maxdepth 1 -type d ! -path './openwrt' ! -path './'` openwrt
cd openwrt
echo "执行单项脚本"
if [ -f "${WORKPATH}/$CUSTOM_SH" ]; then
(
chmod +x ${WORKPATH}/$CUSTOM_SH
/bin/bash "${WORKPATH}/$CUSTOM_SH"
)
fi
echo "执行全局脚本"
if [ -f "${GITHUB_WORKSPACE}/openwrt/build/custom.sh" ]; then
(
chmod +x ${GITHUB_WORKSPACE}/openwrt/build/custom.sh
/bin/bash "${GITHUB_WORKSPACE}/openwrt/build/custom.sh"
)
fi
echo "复制脚本文件..."
if [ -n "$(ls -A "${GITHUB_WORKSPACE}/openwrt/build/scripts/files" 2>/dev/null)" ]; then
if [ -d "files" ];then
cp -rf ${GITHUB_WORKSPACE}/openwrt/build/scripts/files/* files
chmod -R 755 ${HOME}/files
else
cp -rf ${GITHUB_WORKSPACE}/openwrt/build/scripts/files/ files
chmod -R 755 ${HOME}/files
fi
fi
echo "复制配置文件..."
if [ -n "$(ls -A "${WORKPATH}/files" 2>/dev/null)" ]; then
if [ -d "files" ];then
cp -rf ${WORKPATH}/files/* files
chmod -R 755 ${WORKPATH}/files
else
cp -rf ${WORKPATH}/files/ files
chmod -R 755 ${WORKPATH}/files
fi
fi
echo "复制源码文件..."
if [ -n "$(ls -A "${WORKPATH}/sources" 2>/dev/null)" ]; then
cp -Rf ${WORKPATH}/sources/* ./
fi
echo "写入配置文件..."
mv ${WORKPATH}/$CONFIG_FILE .config
make defconfig
# echo "GitHub Action 移除国内下载源"
# PROJECT_MIRRORS_FILE="scripts/projectsmirrors.json"
# if [ -f "$PROJECT_MIRRORS_FILE" ]; then
# sed -i '/.cn\//d; /tencent/d; /aliyun/d' "$PROJECT_MIRRORS_FILE"
# fi
- name: 输出编译信息
run: |
cd openwrt
echo
echo " 系统空间 类型 总数 已用 可用 使用率"
df -hT $PWD
echo
echo "=========================================="
echo
echo " CPU物理数量:$(cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l)"
echo " CPU核心及版本信息:$(cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c)"
echo
echo "=========================================="
echo
ZZZ="package/lean/default-settings/files/zzz-default-settings"
if [ -f "$ZZZ" ]; then
echo " 当前编译版本:$(cat $ZZZ|grep DISTRIB_REVISION= | sed 's/^.\{24\}//g' | sed 's/.\{26\}$//')"
fi
echo "KERNEL_PATCHVER=$(cat target/linux/x86/Makefile|grep KERNEL_PATCHVER | sed 's/^.\{17\}//g')" >> $GITHUB_ENV
echo " 内核版本:$(cat target/linux/x86/Makefile|grep KERNEL_PATCHVER | sed 's/^.\{17\}//g')"
echo " 源码分支:${{ env.REPO_BRANCH }}"
echo " 编译时间:${{ env.FILE_TIME1 }}"
echo
echo "=========================================="
grep -i CONFIG_PACKAGE_luci-app .config | grep -v \# > Plug-in
grep -i CONFIG_PACKAGE_luci-theme .config | grep -v \# >> Plug-in
sed -i '/INCLUDE/d' Plug-in > /dev/null 2>&1
sed -i 's/CONFIG_PACKAGE_/、/g' Plug-in
sed -i '/Transparent_Proxy/d' Plug-in > /dev/null 2>&1 #排除 luci-app-passwall_Transparent_Proxy
sed -i '/qbittorrent-simple_dynamic/d' Plug-in > /dev/null 2>&1 #排除 luci-app-qbittorrent-simple_dynamic
sed -i 's/=y/\ /g' Plug-in
awk '$0=NR$0' Plug-in > Plug-2
awk '{print " " $0}' Plug-2 > Plug-in
# 将结果写入 GitHub 环境变量 (用于 Release Body)
echo "PACKAGED_PLUGINS<<EOF" >> $GITHUB_ENV
cat Plug-in >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
echo
echo
echo " 已选插件列表"
cat Plug-in
rm -rf {Plug-in,Plug-2}
echo
echo "=========================================="
echo
echo
echo "输出完整插件信息..."
echo
echo
echo "==== 配置开始 ===="
cat .config
echo "==== 配置结束 ===="
- name: 准备上传文件
run: |
mkdir -p ./upload_tmp
cp openwrt/.config ./upload_tmp/${{matrix.target}}.config
cp openwrt/tmp/.packageinfo ./upload_tmp/${{matrix.target}}.packageinfo
- name: 上传插件列表和依赖归递文件
uses: actions/upload-artifact@v7
with:
name: ${{matrix.target}}_OpenWrt_packageinfo_${{ env.FILE_TIME }}
path: ./upload_tmp/
- name: 执行临时调试命令
if: github.event.inputs.Custom_Commands != ''
run: |
cd openwrt
echo "==== 开始执行自定义调试命令 ===="
${{ github.event.inputs.Custom_Commands }}
echo "==== 自定义命令执行完毕 ===="
- name: SSH远程调试
if: env.BUILD_SSH == 'true'
timeout-minutes: 32
run: |
chmod +x ${GITHUB_WORKSPACE}/openwrt/build/debug-ssh.sh
/bin/bash "${GITHUB_WORKSPACE}/openwrt/build/debug-ssh.sh"
- name: 调试结束
run: |
if [[ "${BUILD_MOD}" == "true" ]]; then
curl "http://${{ secrets.WECHAT_WORK_URL }}/push?token=${{ secrets.WECHAT_WORK_TOKEN }}&message=Github%20Actions%20调试模式运行已完成,请检查运行结果..." || true && curl "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" -d "chat_id=${{ secrets.TELEGRAM_CHAT_ID }}&text=Github Actions 调试模式运行已完成,请检查运行结果..." >/dev/null 2>&1 && echo "ok..."
echo "当前处于调试模式,环境配置已完成,跳过编译步骤。"
exit 0
fi
- name: 下载编译所需文件
if: env.BUILD_MOD == 'false'
run: |
cd openwrt && make download -j$(($(nproc) * 2))
- name: 开始编译固件
id: compile
if: env.BUILD_MOD == 'false'
run: |
cd openwrt
make -j$(($(nproc) + 1)) || make -j1 V=s
- name: 检查空间使用情况
run: |
echo "======================="
echo "Space usage:"
echo "======================="
df -hT
echo "======================="
du -h --max-depth=1 openwrt/ --exclude=build_dir --exclude=bin || true
du -h --max-depth=1 openwrt/build_dir || true
du -h --max-depth=1 openwrt/bin || true
- name: 整理固件文件
id: organizer
if: env.BUILD_MOD == 'false'
run: |
mkdir -p ./artifact/firmware
mkdir -p ./artifact/pvekvm
mkdir -p ./artifact/hyperv
mkdir -p ./artifact/vmware
mkdir -p ./artifact/package
mkdir -p ./artifact/buildinfo
rm -rf $(find openwrt/bin/targets/ -type d -name "packages")
cp -rf $(find openwrt/bin/packages/ -type f -name "*.ipk") ./artifact/package/ || true
cp -rf $(find openwrt/bin/targets/ -type f -name "*.buildinfo" -o -name "*.manifest") ./artifact/buildinfo/ || true
# cp -rf $(find openwrt/bin/targets/ -type f -name "*squashfs*efi*img*") ./artifact/firmware/
cp -rf $(find openwrt/bin/targets/ -type f \( -name "*squashfs*efi*img*" -o -name "*squashfs*sysupgrade*bin*" -o -name "*squashfs*factory*bin*" \) ) ./artifact/firmware/
cp -rf $(find openwrt/bin/targets/ -type f -name "*squashfs*efi*qcow2*") ./artifact/pvekvm/ || true
cp -rf $(find openwrt/bin/targets/ -type f -name "*squashfs*efi*vhdx*") ./artifact/hyperv/ || true
cp -rf $(find openwrt/bin/targets/ -type f -name "*squashfs*efi*vmdk*") ./artifact/vmware/ || true
echo "编译完成时间..."
START_SECONDS=${{ env.START_SECONDS }}
END_TIME=`date +'%Y-%m-%d %H:%M:%S'`
END_SECONDS=$(date --date="$END_TIME" +%s)
SECONDS=$((END_SECONDS-START_SECONDS))
HOUR=$(( $SECONDS/3600 )) && MIN=$(( ($SECONDS-${HOUR}*3600)/60 )) && SEC=$(( $SECONDS-${HOUR}*3600-${MIN}*60 ))
echo "BUILD_TIME=${HOUR}时${MIN}分${SEC}秒" >> $GITHUB_ENV
- name: 上传固件文件
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.UPLOAD_FIRMWARE == 'true'
uses: actions/upload-artifact@v7
with:
name: ${{matrix.target}}_OpenWrt_firmware_${{ env.FILE_TIME }}
path: ./artifact/firmware/
- name: 上传PVE/KVM镜像文件
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.UPLOAD_QCOW2 == 'true'
uses: actions/upload-artifact@v7
with:
name: ${{matrix.target}}_OpenWrt_pvekvm_${{ env.FILE_TIME }}
path: ./artifact/pvekvm/
- name: 上传Hyper-V镜像文件
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.UPLOAD_VHDX == 'true'
uses: actions/upload-artifact@v7
with:
name: ${{matrix.target}}_OpenWrt_hyperv_${{ env.FILE_TIME }}
path: ./artifact/hyperv/
- name: 上传VMware镜像文件
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.UPLOAD_VMDK == 'true'
uses: actions/upload-artifact@v7
with:
name: ${{matrix.target}}_OpenWrt_vmware_${{ env.FILE_TIME }}
path: ./artifact/vmware/
- name: 上传插件包文件
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.UPLOAD_IPK == 'true'
uses: actions/upload-artifact@v7
with:
name: ${{matrix.target}}_OpenWrt_package_${{ env.FILE_TIME }}
path: ./artifact/package/
- name: 上传固件信息
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.UPLOAD_CONFIG == 'true'
uses: actions/upload-artifact@v7
with:
name: ${{matrix.target}}_OpenWrt_buildinfo_${{ env.FILE_TIME }}
path: ./artifact/buildinfo/
- name: 同步 img-installer 项目准备制作 ISO
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.UPLOAD_ISO == 'true' && (contains(matrix.target, 'x86_64') || contains(matrix.target, 'x86-64'))
run: |
echo "检测到当前编译目标为 x86-64 架构,正在同步 ISO 打包工具..."
git clone https://github.com/wukongdaily/img-installer.git
chmod +x img-installer/custom.sh
chmod +x img-installer/supportFiles/custom/build.sh
chmod +x img-installer/autobuild/autobuild.sh
- name: 制作专属一键刷机 ISO
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.UPLOAD_ISO == 'true' && (contains(matrix.target, 'x86_64') || contains(matrix.target, 'x86-64'))
run: |
# 直接去 ./artifact/firmware/ 目录下匹配带 efi 且以 .img 或 .img.gz 结尾的固件
firmware_file=$(ls ./artifact/firmware/*efi*.img* 2>/dev/null | head -n 1)
# 创建临时目录,复制固件
mkdir -p ./tmp_iso_build
cp -f "$firmware_file" ./tmp_iso_build/target_firmware.img.gz
echo "📦 正在使用临时固件副本 [ ./tmp_iso_build/target_firmware.img.gz ] 封装进 ISO..."
cd img-installer
# 打包ISO镜像
bash autobuild/autobuild.sh "../tmp_iso_build/target_firmware.img.gz"
# 重命名 ISO 镜像,防止多任务混淆
mv output/custom-installer-x86_64.iso output/${{ matrix.target }}-installer-x86_64.iso
echo "✅ ISO 制作成功: output/${{ matrix.target }}-installer-x86_64.iso"
# 清理临时目录
rm -rf ../tmp_iso_build
- name: 上传ISO固件文件
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.UPLOAD_ISO == 'true' && (contains(matrix.target, 'x86_64') || contains(matrix.target, 'x86-64'))
uses: actions/upload-artifact@v7
with:
name: ${{matrix.target}}_OpenWrt_ISO_${{ env.FILE_TIME }}
path: img-installer/output/*-installer-x86_64.iso
- name: 自动发布固件及各自的 ISO 到 Releases
uses: ncipollo/release-action@main
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.UPLOAD_RELEASE == 'true'
with:
name: ${{ env.FILE_TIME1 }} 「 ${{ env.FIRMWARE_MESSAGE }} 」
tag: ${{ env.FILE_TIME2 }}-${{matrix.target}}
token: ${{ secrets.MY_GITHUB_TOKEN }}
body: |
★ 源码 : ${{ env.REPO_URL }}
★ 分支 : ${{ env.REPO_BRANCH }}
★ 感谢源码作者无私分享!
🖥 内核版本:${{ env.KERNEL_PATCHVER }}
🎈 编译时间:${{ env.FILE_TIME1 }}
⏰ 编译用时:${{ env.BUILD_TIME }}
📦 包含插件列表:
${{ env.PACKAGED_PLUGINS }}
━━━━━━━━━━━━━━━━━━━━
🎉 [ ${{ env.FIRMWARE_MESSAGE }} ] 固件及 ISO 镜像下载
(提示:非 x86_64 架构固件不包含 ISO 镜像)
artifacts: |
./artifact/firmware/*
img-installer/output/*-installer-x86_64.iso
# 当找不到 ISO 文件时,不让构建失败,继续发布其他文件
artifactErrorsFailBuild: false
- name: 自动生成并保存固件与 ISO 下载直链
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.UPLOAD_RELEASE == 'true' && always()
run: |
echo "==== 正在计算最终下载链接 ===="
# 拼接基础 Release 下载根路径
base_url="${{ env.GITHUB_RELEASE }}/download/${{ env.FILE_TIME2 }}-${{ matrix.target }}"
# 创建或清空用于后续通知的链接文件
echo " 📥 本次编译直链下载: " > ./artifact/download_links.txt
# 抓取当前编译出的固件文件名
full_path=$(ls ./artifact/firmware/*efi*.img* ./artifact/firmware/*squashfs-sysupgrade.bin* 2>/dev/null | head -n 1)
if [ -n "$full_path" ]; then
firmware_name=$(basename "$full_path")
firmware_download_url="${base_url}/${firmware_name}"
echo "🔗 固件直链: $firmware_download_url"
echo "* 📦 固件下载: $firmware_download_url" >> ./artifact/download_links.txt
else
echo "⚠️ 未能抓取到固件文件名。"
fi
# 如果是 x86 架构,才去拼接并打印 ISO 的直链
if [[ "${{ matrix.target }}" =~ "x86" ]]; then
iso_download_url="${base_url}/${{ matrix.target }}-installer-x86_64.iso"
echo "🔗 专属ISO直链: $iso_download_url"
echo "* 💿 刷机ISO下载: $iso_download_url" >> ./artifact/download_links.txt
fi
echo "========================================"
echo "链接已写入 ./artifact/download_links.txt"
# 写入下载地址到变量
echo "DOWNLOAD_LINKS<<EOF" >> $GITHUB_ENV
cat ./artifact/download_links.txt >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: 删除运行记录
uses: Mattraks/delete-workflow-runs@v2
with:
token: ${{ secrets.MY_GITHUB_TOKEN }}
repository: ${{ github.repository }}
retain_days: 30 #保留最后多少记录不删除
keep_minimum_runs: 0
- name: 删除自动发布的旧固件
uses: nikhilbadyal/ghaction-rm-releases@v0.8.0
with:
GITHUB_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }}
RELEASE_PATTERN: ".*" # 匹配所有 Release 标签(也可以写正则,比如 "^v.*")
RELEASES_TO_KEEP: 20 # 保留最新的 4 个
#DAYS_TO_KEEP: 30 # 或者保留 30 天内的(二者满足其一即保留)
- name: 编译成功信息通知-企业微信
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.WECHAT_WORK_PUSH == 'true'
run: |
# 构造消息内容
WECHAT_MSG="您的${{ env.FIRMWARE_MESSAGE }}固件成功编译完成了!
🎈 编译时间:${{ env.FILE_TIME1 }}
🖥 内核版本:${{ env.KERNEL_PATCHVER }}
⏰ 编译用时:${{ env.BUILD_TIME }}
🌴 固件已经编译完成 🎈!!!"
curl -s "http://${{ secrets.WECHAT_WORK_URL }}/push?token=${{ secrets.WECHAT_WORK_TOKEN }}" \
--data-urlencode "message=$WECHAT_MSG" || true
- name: 编译成功信息通知-Telegram
if: steps.compile.outcome == 'success' && env.BUILD_MOD == 'false' && env.TELEGRAM_BOT == 'true'
run: |
# 构造消息内容
TG_MSG="您的${{ env.FIRMWARE_MESSAGE }}固件成功编译完成了!
🖥 内核版本:${{ env.KERNEL_PATCHVER }}
🎈 编译时间:${{ env.FILE_TIME1 }}
⏰ 编译用时:${{ env.BUILD_TIME }}
🎉 发布地址:${{ env.GITHUB_RELEASE }}/tag/${{ env.FILE_TIME2 }}-${{ matrix.target }}
${{ env.DOWNLOAD_LINKS }}
📦 包含插件列表:
${{ env.PACKAGED_PLUGINS }}
🌴 固件已经编译完成 🎈!!!"
curl -s -X POST "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" \
-d "chat_id=${{ secrets.TELEGRAM_CHAT_ID }}" \
--data-urlencode "text=$TG_MSG" >/dev/null 2>&1 && echo "Telegram 通知发送成功!"