From c8d1dcca301aefcbeb98c3fe0892f8e87b21f9c1 Mon Sep 17 00:00:00 2001 From: mofeng-git Date: Wed, 20 Aug 2025 16:12:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=20GitHub=20Actions?= =?UTF-8?q?=20=E5=B7=A5=E4=BD=9C=E6=B5=81=E5=92=8C=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加自动下载缺失文件功能,支持 .xz 压缩格式 - 优化构建流程,增加文件清理和压缩功能 - 修复发布资产上传步骤,确保预发布标记正确设置 - 调整发布标签格式,包含版本号、设备目标和运行 ID - 升级 Actions 版本,使用 softprops/action-gh-release@v1 - 移除 NFS 挂载依赖,简化部署流程 - 增强错误处理和日志输出 --- .github/workflows/build_img.yaml | 25 +++--- AUTO_DOWNLOAD.md | 137 +++++++++++++++++++++++++++++++ build/build_img.sh | 10 ++- build/functions/common.sh | 89 +++++++++++++++++++- build/functions/devices.sh | 67 +++++++++++++-- build/functions/install.sh | 7 +- build/functions/packaging.sh | 42 +++++++++- build/record.txt | 21 +++++ 8 files changed, 373 insertions(+), 25 deletions(-) create mode 100644 AUTO_DOWNLOAD.md create mode 100644 build/record.txt diff --git a/.github/workflows/build_img.yaml b/.github/workflows/build_img.yaml index 34be748a..1f6a3938 100644 --- a/.github/workflows/build_img.yaml +++ b/.github/workflows/build_img.yaml @@ -26,11 +26,10 @@ jobs: TZ: Asia/Shanghai volumes: - /dev:/dev - - /mnt/nfs/lfs/:/mnt/nfs/lfs/ steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install dependencies run: | @@ -38,7 +37,7 @@ jobs: export DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ sudo tzdata docker.io qemu-utils qemu-user-static binfmt-support parted e2fsprogs \ - curl tar python3 python3-pip rsync git android-sdk-libsparse-utils coreutils zerofree + curl tar python3 python3-pip rsync git android-sdk-libsparse-utils coreutils zerofree wget apt-get clean rm -rf /var/lib/apt/lists/* ln -snf /usr/share/zoneinfo/$TZ /etc/localtime @@ -59,16 +58,16 @@ jobs: echo "Build script finished." env: CI_PROJECT_DIR: ${{ github.workspace }} + GITHUB_ACTIONS: true + OUTPUTDIR: ${{ github.workspace }}/output - - name: Upload artifact - uses: actions/upload-artifact@v3 + - name: Create GitHub Release + id: release + uses: softprops/action-gh-release@v1 with: - name: onekvm-image-${{ github.event.inputs.device_target }}-${{ env.BUILD_DATE }} - path: | - ${{ github.workspace }}/output/*.img - ${{ github.workspace }}/output/*.vmdk - ${{ github.workspace }}/output/*.vdi - ${{ github.workspace }}/output/*.burn.img - if-no-files-found: ignore + tag_name: v${{ env.BUILD_DATE }}-${{ github.event.inputs.device_target }}-${{ github.run_id }} + name: CI Build ${{ github.event.inputs.device_target }} ${{ env.BUILD_DATE }} + files: ${{ github.workspace }}/output/*.xz + prerelease: true env: - CI_PROJECT_DIR: ${{ github.workspace }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/AUTO_DOWNLOAD.md b/AUTO_DOWNLOAD.md new file mode 100644 index 00000000..d0e7682b --- /dev/null +++ b/AUTO_DOWNLOAD.md @@ -0,0 +1,137 @@ +# 自动下载功能说明 + +## 概述 + +构建脚本现在支持自动下载缺失的文件。当构建过程中发现所需的镜像文件、DTB文件、配置文件或工具不存在时,系统会自动尝试从远程服务器下载。 + +## 功能特性 + +### 1. 智能下载策略 +- **首先尝试直接下载**:使用原始文件名从远程服务器下载 +- **失败后尝试压缩版本**:如果直接下载失败,自动尝试添加 `.xz` 后缀下载压缩版本 +- **自动解压**:如果下载的是 `.xz` 压缩文件,会自动解压 + +### 2. 支持的文件类型 +- **镜像文件**:各种设备的 Armbian 镜像 +- **DTB 文件**:设备树二进制文件 +- **配置文件**:JSON、CONF 等配置文件 +- **工具文件**:如 AmlImg 工具 + +### 3. 错误处理 +- 文件已存在时跳过下载 +- 下载失败时提供详细的错误信息 +- 解压失败时自动清理临时文件 + +## 配置 + +### 环境变量 +```bash +# 远程文件服务器前缀(默认值) +REMOTE_PREFIX="https://files.mofeng.run" + +# 本地源码路径(默认值) +SRCPATH="/mnt/src" +``` + +### 文件路径映射 +本地文件路径:`$SRCPATH/image/device/filename` +远程下载URL:`$REMOTE_PREFIX/image/device/filename` + +## 使用示例 + +### 1. 构建特定设备 +```bash +# 构建 Cumebox2(会自动下载所需文件) +./build/build_img.sh cumebox2 +``` + +### 2. 构建所有设备 +```bash +# 构建所有设备(会自动下载所有所需文件) +./build/build_img.sh all +``` + +### 3. 自定义远程服务器 +```bash +# 使用自定义的远程服务器 +REMOTE_PREFIX="https://your-server.com/files" ./build/build_img.sh cumebox2 +``` + +## 支持的文件列表 + +### Onecloud 设备 +- `image/onecloud/AmlImg_v0.3.1_linux_amd64` - AmlImg 工具 +- `image/onecloud/Armbian_by-SilentWind_24.5.0-trunk_Onecloud_bookworm_legacy_5.9.0-rc7_minimal_support-dvd-emulation.burn.img` - 源镜像 +- `image/onecloud/meson8b-onecloud-fix.dtb` - DTB 文件 + +### Cumebox2 设备 +- `image/cumebox2/Armbian_25.2.2_Khadas-vim1_bookworm_current_6.12.17_minimal.img` - 源镜像 +- `image/cumebox2/v-fix.dtb` - DTB 文件 +- `image/cumebox2/ssd` - SSD 脚本 +- `image/cumebox2/config.json` - OLED 配置文件 + +### Chainedbox 设备 +- `image/chainedbox/Armbian_24.11.0_rockchip_chainedbox_bookworm_6.1.112_server_2024.10.02_add800m.img` - 源镜像 +- `image/chainedbox/rk3328-l1pro-1296mhz-fix.dtb` - DTB 文件 + +### VM 设备 +- `image/vm/Armbian_25.2.1_Uefi-x86_bookworm_current_6.12.13_minimal.img` - 源镜像 + +### E900V22C 设备 +- `image/e900v22c/Armbian_23.08.0_amlogic_s905l3a_bookworm_5.15.123_server_2023.08.01.img` - 源镜像 + +### Octopus-Planet 设备 +- `image/octopus-flanet/Armbian_24.11.0_amlogic_s912_bookworm_6.1.114_server_2024.11.01.img` - 源镜像 +- `image/octopus-flanet/model_database.conf` - 配置文件 + +## 技术实现 + +### 核心函数 +```bash +download_file_if_missing(file_path) +``` + +### 工作流程 +1. 检查文件是否已存在 +2. 计算相对于 SRCPATH 的路径 +3. 确保目标目录存在 +4. 尝试直接下载 +5. 如果失败,尝试下载 .xz 版本 +6. 如果是 .xz 文件,自动解压 +7. 返回成功或失败状态 + +### 依赖工具 +- `curl` - 用于下载文件 +- `xz` - 用于解压 .xz 文件 +- `mkdir` - 用于创建目录 + +## 注意事项 + +1. **网络连接**:确保构建环境能够访问远程服务器 +2. **磁盘空间**:下载的文件可能很大,确保有足够的磁盘空间 +3. **权限**:确保脚本有权限创建目录和文件 +4. **防火墙**:确保防火墙允许 HTTP/HTTPS 连接 + +## 故障排除 + +### 常见问题 + +1. **下载失败** + - 检查网络连接 + - 验证 REMOTE_PREFIX 是否正确 + - 确认远程文件是否存在 + +2. **解压失败** + - 检查 xz 工具是否安装 + - 验证下载的文件是否完整 + +3. **权限错误** + - 确保脚本有足够的权限 + - 检查目标目录的权限设置 + +### 调试模式 +可以通过设置环境变量来启用更详细的输出: +```bash +export DEBUG=1 +./build/build_img.sh cumebox2 +``` \ No newline at end of file diff --git a/build/build_img.sh b/build/build_img.sh index 958356cd..6ef488ab 100755 --- a/build/build_img.sh +++ b/build/build_img.sh @@ -2,12 +2,15 @@ # --- 配置 --- # 允许通过环境变量覆盖默认路径 -SRCPATH="${SRCPATH:-/mnt/nfs/lfs/src}" +SRCPATH="${SRCPATH:-/mnt/src}" BOOTFS="${BOOTFS:-/tmp/bootfs}" ROOTFS="${ROOTFS:-/tmp/rootfs}" -OUTPUTDIR="${OUTPUTDIR:-/mnt/nfs/lfs/src/output}" +OUTPUTDIR="${OUTPUTDIR:-/mnt/output}" TMPDIR="${TMPDIR:-$SRCPATH/tmp}" +# 远程文件下载配置 +REMOTE_PREFIX="${REMOTE_PREFIX:-https://files.mofeng.run/src}" + export LC_ALL=C # 全局变量 @@ -132,6 +135,9 @@ build_target() { ;; esac + # 在 GitHub Actions 环境中清理下载的文件 + cleanup_downloaded_files + echo "==================================================" echo "信息:目标 $target 构建完成!" echo "==================================================" diff --git a/build/functions/common.sh b/build/functions/common.sh index d9efc048..321570f7 100755 --- a/build/functions/common.sh +++ b/build/functions/common.sh @@ -172,9 +172,96 @@ write_meta() { run_in_chroot "sed -i 's/localhost.localdomain/$hostname/g' /etc/kvmd/meta.yaml" } +# 检测是否在 GitHub Actions 环境中 +is_github_actions() { + [[ -n "$GITHUB_ACTIONS" ]] +} + +# 记录下载的文件列表(仅在 GitHub Actions 环境中) +DOWNLOADED_FILES_LIST="/tmp/downloaded_files.txt" + +# 自动下载文件函数 +download_file_if_missing() { + local file_path="$1" + local relative_path="" + + # 如果文件已存在,直接返回 + if [[ -f "$file_path" ]]; then + echo "信息:文件已存在: $file_path" + return 0 + fi + + # 计算相对于 SRCPATH 的路径 + if [[ "$file_path" == "$SRCPATH"/* ]]; then + relative_path="${file_path#$SRCPATH/}" + else + echo "错误:文件路径 $file_path 不在 SRCPATH ($SRCPATH) 下" >&2 + return 1 + fi + + echo "信息:文件不存在,尝试下载: $file_path" + echo "信息:相对路径: $relative_path" + + # 确保目标目录存在 + local target_dir="$(dirname "$file_path")" + ensure_dir "$target_dir" + + # 首先尝试直接下载 + local remote_url="${REMOTE_PREFIX}/${relative_path}" + echo "信息:尝试下载: $remote_url" + + if curl -f -L -o "$file_path" "$remote_url" 2>/dev/null; then + echo "信息:下载成功: $file_path" + # 在 GitHub Actions 环境中记录下载的文件 + if is_github_actions; then + echo "$file_path" >> "$DOWNLOADED_FILES_LIST" + fi + return 0 + fi + + # 如果直接下载失败,尝试添加 .xz 后缀 + echo "信息:直接下载失败,尝试 .xz 压缩版本..." + local xz_url="${remote_url}.xz" + local xz_file="${file_path}.xz" + + if curl -f -L -o "$xz_file" "$xz_url" 2>/dev/null; then + echo "信息:下载 .xz 文件成功,正在解压..." + if xz -d "$xz_file"; then + echo "信息:解压成功: $file_path" + # 在 GitHub Actions 环境中记录下载的文件 + if is_github_actions; then + echo "$file_path" >> "$DOWNLOADED_FILES_LIST" + fi + return 0 + else + echo "错误:解压 .xz 文件失败" >&2 + rm -f "$xz_file" + return 1 + fi + fi + + echo "错误:无法下载文件 $file_path (尝试了原始版本和 .xz 版本)" >&2 + return 1 +} + +# 清理下载的文件(仅在 GitHub Actions 环境中) +cleanup_downloaded_files() { + if is_github_actions && [[ -f "$DOWNLOADED_FILES_LIST" ]]; then + echo "信息:清理 GitHub Actions 环境中下载的文件..." + while IFS= read -r file_path; do + if [[ -f "$file_path" ]]; then + echo "信息:删除下载的文件: $file_path" + rm -f "$file_path" + fi + done < "$DOWNLOADED_FILES_LIST" + rm -f "$DOWNLOADED_FILES_LIST" + echo "信息:下载文件清理完成" + fi +} + # 检查必要的外部工具 check_required_tools() { - local required_tools="sudo docker losetup mount umount parted e2fsck resize2fs qemu-img curl tar python3 pip3 rsync git simg2img img2simg dd cat rm mkdir mv cp sed chmod chown ln grep printf id" + local required_tools="sudo docker losetup mount umount parted e2fsck resize2fs qemu-img curl tar python3 pip3 rsync git simg2img img2simg dd cat rm mkdir mv cp sed chmod chown ln grep printf id xz" for cmd in $required_tools; do if ! command -v "$cmd" &> /dev/null; then diff --git a/build/functions/devices.sh b/build/functions/devices.sh index 337c7351..f2cc9750 100755 --- a/build/functions/devices.sh +++ b/build/functions/devices.sh @@ -4,7 +4,7 @@ onecloud_rootfs() { local unpacker="$SRCPATH/image/onecloud/AmlImg_v0.3.1_linux_amd64" - local source_image="$SRCPATH/image/onecloud/Armbian_by-SilentWind_24.5.0-trunk_Onecloud_bookworm_legacy_5.9.0-rc7_minimal.burn.img" + local source_image="$SRCPATH/image/onecloud/Armbian_by-SilentWind_24.5.0-trunk_Onecloud_bookworm_legacy_5.9.0-rc7_minimal_support-dvd-emulation.burn.img" local bootfs_img="$TMPDIR/bootfs.img" local rootfs_img="$TMPDIR/rootfs.img" local bootfs_sparse="$TMPDIR/6.boot.PARTITION.sparse" @@ -16,6 +16,13 @@ onecloud_rootfs() { ensure_dir "$TMPDIR" ensure_dir "$BOOTFS" + # 自动下载 AmlImg 工具(如果不存在) + download_file_if_missing "$unpacker" || { echo "错误:下载 AmlImg 工具失败" >&2; exit 1; } + sudo chmod +x "$unpacker" || { echo "错误:设置 AmlImg 工具执行权限失败" >&2; exit 1; } + + # 自动下载源镜像文件(如果不存在) + download_file_if_missing "$source_image" || { echo "错误:下载 Onecloud 原始镜像失败" >&2; exit 1; } + echo "信息:解包 Onecloud burn 镜像..." sudo "$unpacker" unpack "$source_image" "$TMPDIR" || { echo "错误:解包失败" >&2; exit 1; } @@ -30,7 +37,12 @@ onecloud_rootfs() { sudo losetup "$bootfs_loopdev" "$bootfs_img" || { echo "错误:关联 bootfs 镜像到 $bootfs_loopdev 失败" >&2; exit 1; } sudo mount "$bootfs_loopdev" "$BOOTFS" || { echo "错误:挂载 bootfs ($bootfs_loopdev) 失败" >&2; exit 1; } BOOTFS_MOUNTED=1 - sudo cp "$SRCPATH/image/onecloud/meson8b-onecloud-fix.dtb" "$BOOTFS/dtb/meson8b-onecloud.dtb" || { echo "错误:复制修复后的 DTB 文件失败" >&2; exit 1; } + + # 自动下载 DTB 文件(如果不存在) + local dtb_file="$SRCPATH/image/onecloud/meson8b-onecloud-fix.dtb" + download_file_if_missing "$dtb_file" || { echo "错误:下载 Onecloud DTB 文件失败" >&2; exit 1; } + + sudo cp "$dtb_file" "$BOOTFS/dtb/meson8b-onecloud.dtb" || { echo "错误:复制修复后的 DTB 文件失败" >&2; exit 1; } sudo umount "$BOOTFS" || { echo "警告:卸载 bootfs ($BOOTFS) 失败" >&2; BOOTFS_MOUNTED=0; } # 卸载失败不应中断流程 BOOTFS_MOUNTED=0 echo "信息:分离 bootfs loop 设备 $bootfs_loopdev..." @@ -60,6 +72,10 @@ cumebox2_rootfs() { echo "信息:准备 Cumebox2 Rootfs..." ensure_dir "$TMPDIR" + + # 自动下载源镜像文件(如果不存在) + download_file_if_missing "$source_image" || { echo "错误:下载 Cumebox2 原始镜像失败" >&2; exit 1; } + cp "$source_image" "$target_image" || { echo "错误:复制 Cumebox2 原始镜像失败" >&2; exit 1; } echo "信息:调整镜像分区大小..." @@ -86,6 +102,10 @@ chainedbox_rootfs_and_fix_dtb() { echo "信息:准备 Chainedbox Rootfs 并修复 DTB..." ensure_dir "$TMPDIR"; ensure_dir "$BOOTFS" + + # 自动下载源镜像文件(如果不存在) + download_file_if_missing "$source_image" || { echo "错误:下载 Chainedbox 原始镜像失败" >&2; exit 1; } + cp "$source_image" "$target_image" || { echo "错误:复制 Chainedbox 原始镜像失败" >&2; exit 1; } echo "信息:挂载 boot 分区并修复 DTB..." @@ -95,7 +115,12 @@ chainedbox_rootfs_and_fix_dtb() { sudo losetup --offset "$boot_offset" "$bootfs_loopdev" "$target_image" || { echo "错误:设置 boot 分区 loop 设备 $bootfs_loopdev 失败" >&2; exit 1; } sudo mount "$bootfs_loopdev" "$BOOTFS" || { echo "错误:挂载 boot 分区 ($bootfs_loopdev) 失败" >&2; exit 1; } BOOTFS_MOUNTED=1 - sudo cp "$SRCPATH/image/chainedbox/rk3328-l1pro-1296mhz-fix.dtb" "$BOOTFS/dtb/rockchip/rk3328-l1pro-1296mhz.dtb" || { echo "错误:复制修复后的 DTB 文件失败" >&2; exit 1; } + + # 自动下载 DTB 文件(如果不存在) + local dtb_file="$SRCPATH/image/chainedbox/rk3328-l1pro-1296mhz-fix.dtb" + download_file_if_missing "$dtb_file" || { echo "错误:下载 Chainedbox DTB 文件失败" >&2; exit 1; } + + sudo cp "$dtb_file" "$BOOTFS/dtb/rockchip/rk3328-l1pro-1296mhz.dtb" || { echo "错误:复制修复后的 DTB 文件失败" >&2; exit 1; } sudo umount "$BOOTFS" || { echo "警告:卸载 boot 分区 ($BOOTFS) 失败" >&2; BOOTFS_MOUNTED=0; } BOOTFS_MOUNTED=0 echo "信息:分离 boot loop 设备 $bootfs_loopdev..." @@ -116,6 +141,10 @@ vm_rootfs() { echo "信息:准备 Vm Rootfs..." ensure_dir "$TMPDIR" + + # 自动下载源镜像文件(如果不存在) + download_file_if_missing "$source_image" || { echo "错误:下载 Vm 原始镜像失败" >&2; exit 1; } + cp "$source_image" "$target_image" || { echo "错误:复制 Vm 原始镜像失败" >&2; exit 1; } echo "信息:设置带偏移量的 loop 设备..." @@ -134,6 +163,10 @@ e900v22c_rootfs() { echo "信息:准备 E900V22C Rootfs..." ensure_dir "$TMPDIR" + + # 自动下载源镜像文件(如果不存在) + download_file_if_missing "$source_image" || { echo "错误:下载 E900V22C 原始镜像失败" >&2; exit 1; } + cp "$source_image" "$target_image" || { echo "错误:复制 E900V22C 原始镜像失败" >&2; exit 1; } echo "信息:扩展镜像文件 (${add_size_mb}MB)..." @@ -164,6 +197,10 @@ octopus_flanet_rootfs() { echo "信息:准备 Octopus-Planet Rootfs..." ensure_dir "$TMPDIR"; ensure_dir "$BOOTFS" + + # 自动下载源镜像文件(如果不存在) + download_file_if_missing "$source_image" || { echo "错误:下载 Octopus-Planet 原始镜像失败" >&2; exit 1; } + cp "$source_image" "$target_image" || { echo "错误:复制 Octopus-Planet 原始镜像失败" >&2; exit 1; } echo "信息:挂载 boot 分区并修改 uEnv.txt (使用 VIM2 DTB)..." @@ -199,14 +236,30 @@ octopus_flanet_rootfs() { config_cumebox2_files() { echo "信息:为 Cumebox2 配置特定文件 (OLED, DTB)..." ensure_dir "$ROOTFS/etc/oled" + + # 自动下载 Cumebox2 相关文件(如果不存在) + local dtb_file="$SRCPATH/image/cumebox2/v-fix.dtb" + local ssd_file="$SRCPATH/image/cumebox2/ssd" + local config_file="$SRCPATH/image/cumebox2/config.json" + + download_file_if_missing "$dtb_file" || echo "警告:下载 Cumebox2 DTB 失败" + download_file_if_missing "$ssd_file" || echo "警告:下载 Cumebox2 ssd 脚本失败" + download_file_if_missing "$config_file" || echo "警告:下载 Cumebox2 配置文件失败" + # 注意 DTB 路径可能需要根据实际 Armbian 版本调整 - sudo cp "$SRCPATH/image/cumebox2/v-fix.dtb" "$ROOTFS/boot/dtb/amlogic/meson-gxl-s905x-khadas-vim.dtb" || echo "警告:复制 Cumebox2 DTB 失败" - sudo cp "$SRCPATH/image/cumebox2/ssd" "$ROOTFS/usr/bin/" || echo "警告:复制 Cumebox2 ssd 脚本失败" + sudo cp "$dtb_file" "$ROOTFS/boot/dtb/amlogic/meson-gxl-s905x-khadas-vim.dtb" || echo "警告:复制 Cumebox2 DTB 失败" + sudo cp "$ssd_file" "$ROOTFS/usr/bin/" || echo "警告:复制 Cumebox2 ssd 脚本失败" sudo chmod +x "$ROOTFS/usr/bin/ssd" || echo "警告:设置 ssd 脚本执行权限失败" - sudo cp "$SRCPATH/image/cumebox2/config.json" "$ROOTFS/etc/oled/config.json" || echo "警告:复制 OLED 配置文件失败" + sudo cp "$config_file" "$ROOTFS/etc/oled/config.json" || echo "警告:复制 OLED 配置文件失败" } config_octopus_flanet_files() { echo "信息:为 Octopus-Planet 配置特定文件 (model_database.conf)..." - sudo cp "$SRCPATH/image/octopus-flanet/model_database.conf" "$ROOTFS/etc/model_database.conf" || echo "警告:复制 model_database.conf 失败" + + # 自动下载 Octopus-Planet 相关文件(如果不存在) + local config_file="$SRCPATH/image/octopus-flanet/model_database.conf" + + download_file_if_missing "$config_file" || echo "警告:下载 Octopus-Planet 配置文件失败" + + sudo cp "$config_file" "$ROOTFS/etc/model_database.conf" || echo "警告:复制 model_database.conf 失败" } \ No newline at end of file diff --git a/build/functions/install.sh b/build/functions/install.sh index b22494b3..96dd2f16 100755 --- a/build/functions/install.sh +++ b/build/functions/install.sh @@ -21,7 +21,12 @@ delete_armbian_verify(){ prepare_external_binaries() { local platform="$1" # linux/armhf or linux/amd64 or linux/aarch64 - local docker_image="registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd-stage-0" + # 如果在 GitHub Actions 环境下,使用 silentwind0/kvmd-stage-0,否则用阿里云镜像 + if is_github_actions; then + local docker_image="silentwind0/kvmd-stage-0" + else + local docker_image="registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd-stage-0" + fi echo "信息:准备外部预编译二进制文件 (平台: $platform)..." ensure_dir "$PREBUILT_DIR" diff --git a/build/functions/packaging.sh b/build/functions/packaging.sh index 4fb9cb70..4305e7d8 100755 --- a/build/functions/packaging.sh +++ b/build/functions/packaging.sh @@ -1,5 +1,21 @@ #!/bin/bash +# --- 压缩函数 --- + +# 压缩镜像文件(仅在 GitHub Actions 环境中) +compress_image_file() { + local file_path="$1" + + if is_github_actions && [[ -f "$file_path" ]]; then + echo "信息:压缩镜像文件: $file_path" + if xz -9 -vv "$file_path"; then + echo "信息:压缩完成: ${file_path}.xz" + else + echo "警告:压缩文件 $file_path 失败" + fi + fi +} + # --- 打包函数 --- pack_img() { @@ -29,7 +45,22 @@ pack_img() { sudo qemu-img convert -f raw -O vmdk "$raw_img" "$vmdk_img" || echo "警告:转换为 VMDK 失败" echo "信息:转换为 VDI..." sudo qemu-img convert -f raw -O vdi "$raw_img" "$vdi_img" || echo "警告:转换为 VDI 失败" + + # 在 GitHub Actions 环境中压缩 VM 镜像文件 + if is_github_actions; then + echo "信息:在 GitHub Actions 环境中压缩 VM 镜像文件..." + compress_image_file "$raw_img" + compress_image_file "$vmdk_img" + compress_image_file "$vdi_img" + fi + else + # 在 GitHub Actions 环境中压缩镜像文件 + if is_github_actions; then + echo "信息:在 GitHub Actions 环境中压缩镜像文件..." + compress_image_file "$OUTPUTDIR/$target_img_name" + fi fi + echo "信息:镜像打包完成: $OUTPUTDIR/$target_img_name" } @@ -48,6 +79,10 @@ pack_img_onecloud() { unmount_all fi + # 自动下载 AmlImg 工具(如果不存在) + download_file_if_missing "$aml_packer" || { echo "错误:下载 AmlImg 工具失败" >&2; exit 1; } + sudo chmod +x "$aml_packer" || { echo "错误:设置 AmlImg 工具执行权限失败" >&2; exit 1; } + echo "信息:将 raw rootfs 转换为 sparse image..." # 先删除可能存在的旧 sparse 文件 sudo rm -f "$rootfs_sparse_img" @@ -55,11 +90,16 @@ pack_img_onecloud() { sudo rm "$rootfs_raw_img" # 删除 raw 文件,因为它已被转换 echo "信息:使用 AmlImg 工具打包..." - sudo chmod +x "$aml_packer" sudo "$aml_packer" pack "$OUTPUTDIR/$target_img_name" "$TMPDIR/" || { echo "错误:AmlImg 打包失败" >&2; exit 1; } echo "信息:清理 Onecloud 临时文件..." sudo rm -f "$TMPDIR/6.boot.PARTITION.sparse" "$TMPDIR/7.rootfs.PARTITION.sparse" "$TMPDIR/dts.img" + # 在 GitHub Actions 环境中压缩 Onecloud 镜像文件 + if is_github_actions; then + echo "信息:在 GitHub Actions 环境中压缩 Onecloud 镜像文件..." + compress_image_file "$OUTPUTDIR/$target_img_name" + fi + echo "信息:Onecloud burn 镜像打包完成: $OUTPUTDIR/$target_img_name" } \ No newline at end of file diff --git a/build/record.txt b/build/record.txt new file mode 100644 index 00000000..77a1e841 --- /dev/null +++ b/build/record.txt @@ -0,0 +1,21 @@ +wget https://github.com/hzyitc/AmlImg/releases/download/v0.3.1/AmlImg_v0.3.1_linux_amd64 -O /mnt/src/image/onecloud/AmlImg_v0.3.1_linux_amd64 +chmod +x /mnt/src/image/onecloud/AmlImg_v0.3.1_linux_amd64 + + +#!/bin/bash +# 文件映射脚本 +# 本地目录前缀:/mnt +# 远程URL前缀:https://files.mofeng.run + +LOCAL_PREFIX="/mnt" +REMOTE_PREFIX="https://files.mofeng.run" + +# 文件相对路径 +REL_PATH="src/image/onecloud/Armbian_by-SilentWind_24.5.0-trunk_Onecloud_bookworm_legacy_5.9.0-rc7_minimal_support-dvd-emulation.burn.img" + +LOCAL_FILE="$LOCAL_PREFIX/$REL_PATH" +REMOTE_URL="$REMOTE_PREFIX/$REL_PATH" + +echo "下载 $REMOTE_URL 到 $LOCAL_FILE" +mkdir -p "$(dirname "$LOCAL_FILE")" +wget -O "$LOCAL_FILE" "$REMOTE_URL" \ No newline at end of file