编译OpenWrt固件 #1130
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
| # | |
| # | |
| # 感谢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 通知发送成功!" | |