mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-07-07 19:11:39 +08:00
✨ feat(driver): 完善驱动批量管理并优化总包安装
- 驱动管理支持批量安装、重装需更新和删除外置驱动 - 批量任务增加总进度展示,并实时刷新已完成驱动状态 - 后端复用驱动总包下载缓存,支持并发等待和长超时下载 - 开发态优先本地构建 driver-agent,避免发布包 revision 不匹配 - DuckDB 构建自动探测 UCRT64 gcc 工具链 - 驱动总包构建接入 UPX 压缩以降低发布体积
This commit is contained in:
133
tools/compress-driver-artifact.sh
Normal file
133
tools/compress-driver-artifact.sh
Normal file
@@ -0,0 +1,133 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Usage:
|
||||
tools/compress-driver-artifact.sh <file> <GOOS/GOARCH> [label]
|
||||
|
||||
Environment:
|
||||
GONAVI_DRIVER_AGENT_UPX=auto|on|off|required
|
||||
|
||||
The default mode is auto: compress supported driver artifacts when upx is
|
||||
available, and skip cleanly otherwise.
|
||||
EOF
|
||||
}
|
||||
|
||||
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
artifact_path="${1:-}"
|
||||
platform="${2:-}"
|
||||
label="${3:-$artifact_path}"
|
||||
mode="$(printf '%s' "${GONAVI_DRIVER_AGENT_UPX:-auto}" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]')"
|
||||
|
||||
if [[ -z "$artifact_path" || -z "$platform" ]]; then
|
||||
usage >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if [[ ! -f "$artifact_path" ]]; then
|
||||
echo "⚠️ UPX 跳过:文件不存在:$artifact_path"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
case "$mode" in
|
||||
""|auto)
|
||||
mode="auto"
|
||||
;;
|
||||
1|true|yes|on|enabled)
|
||||
mode="on"
|
||||
;;
|
||||
required|strict)
|
||||
mode="required"
|
||||
;;
|
||||
0|false|no|off|disabled)
|
||||
echo "ℹ️ UPX 已关闭:$label"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "❌ GONAVI_DRIVER_AGENT_UPX 参数无效:$mode" >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
|
||||
goos="${platform%%/*}"
|
||||
goarch="${platform##*/}"
|
||||
|
||||
case "$goos/$goarch" in
|
||||
linux/amd64|linux/arm64|windows/amd64)
|
||||
;;
|
||||
*)
|
||||
echo "ℹ️ UPX 跳过不支持的平台:$label ($platform)"
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
if ! command -v upx >/dev/null 2>&1; then
|
||||
if [[ "$mode" == "required" ]]; then
|
||||
echo "❌ 未找到 upx,无法压缩:$label" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "⚠️ 未找到 upx,跳过压缩:$label"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
file_size_bytes() {
|
||||
local path="$1"
|
||||
if stat -c%s "$path" >/dev/null 2>&1; then
|
||||
stat -c%s "$path"
|
||||
return
|
||||
fi
|
||||
if stat -f%z "$path" >/dev/null 2>&1; then
|
||||
stat -f%z "$path"
|
||||
return
|
||||
fi
|
||||
wc -c <"$path" | tr -d '[:space:]'
|
||||
}
|
||||
|
||||
format_size_mb() {
|
||||
local bytes="${1:-0}"
|
||||
awk -v b="$bytes" 'BEGIN { printf "%.2fMB", b / 1024 / 1024 }'
|
||||
}
|
||||
|
||||
backup_path="$(mktemp "${TMPDIR:-/tmp}/gonavi-upx-artifact.XXXXXX")"
|
||||
cp "$artifact_path" "$backup_path"
|
||||
cleanup() {
|
||||
rm -f "$backup_path"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
before_bytes="$(file_size_bytes "$artifact_path")"
|
||||
echo "🗜️ UPX 压缩驱动产物:$label"
|
||||
|
||||
if ! upx --best --lzma --force "$artifact_path" >/dev/null 2>&1; then
|
||||
cp "$backup_path" "$artifact_path"
|
||||
if [[ "$mode" == "required" ]]; then
|
||||
echo "❌ UPX 压缩失败:$label" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "⚠️ UPX 压缩失败,已恢复原文件:$label"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if ! upx -t "$artifact_path" >/dev/null 2>&1; then
|
||||
cp "$backup_path" "$artifact_path"
|
||||
if [[ "$mode" == "required" ]]; then
|
||||
echo "❌ UPX 校验失败:$label" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "⚠️ UPX 校验失败,已恢复原文件:$label"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
after_bytes="$(file_size_bytes "$artifact_path")"
|
||||
if [[ "$after_bytes" -lt "$before_bytes" ]]; then
|
||||
saved_bytes=$((before_bytes - after_bytes))
|
||||
echo "✅ UPX 压缩完成:$(format_size_mb "$before_bytes") -> $(format_size_mb "$after_bytes"),减少 $(format_size_mb "$saved_bytes")"
|
||||
else
|
||||
echo "ℹ️ UPX 压缩完成:$(format_size_mb "$before_bytes") -> $(format_size_mb "$after_bytes")"
|
||||
fi
|
||||
Reference in New Issue
Block a user