mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-22 00:42:47 +08:00
⚡️ perf(driver/release): 优化驱动镜像下载与发布链路
- 将各平台驱动拆分为独立 ZIP,并为 DuckDB 同包携带运行库 - 仅生成 ZIP 下载候选,按 Gatewaysentry 与 GitHub 短测速结果调整优先级 - 扩展发布索引的归档摘要与条目元数据,强化跨平台资产校验 - 禁止裸驱动与 CI 总包进入 VPS 镜像,并校验载荷摘要和索引一致性 - 显式控制驱动镜像发布,自动清理失败暂存、过期目录和旧版本
This commit is contained in:
@@ -5,18 +5,23 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
TEMP_DIR="$(mktemp -d)"
|
||||
trap 'rm -rf "${TEMP_DIR}"' EXIT
|
||||
|
||||
# The no-flock fallback must share the staging cleanup trap instead of replacing it.
|
||||
test "$(grep -c '^trap cleanup EXIT$' "${SCRIPT_DIR}/vps-release-commit.sh")" -eq 1
|
||||
test "$(grep -c "trap 'rmdir" "${SCRIPT_DIR}/vps-release-commit.sh")" -eq 0
|
||||
|
||||
ROOT="${TEMP_DIR}/mirror"
|
||||
SOURCE="${TEMP_DIR}/source"
|
||||
mkdir -p "${ROOT}/.incoming" "${SOURCE}/app" "${SOURCE}/driver"
|
||||
printf '%s\n' 'gonavi-download-mirror-v1' > "${ROOT}/.gonavi-mirror-root"
|
||||
printf '%s' 'portable zip' > "${SOURCE}/app/GoNavi.zip"
|
||||
printf '%s' 'driver binary' > "${SOURCE}/driver/mysql.exe"
|
||||
printf '%s' 'driver archive' > "${SOURCE}/driver/mysql-driver-agent-windows-amd64.zip"
|
||||
|
||||
python3 - "${SOURCE}" <<'PY'
|
||||
import hashlib
|
||||
import json
|
||||
import pathlib
|
||||
import sys
|
||||
import zipfile
|
||||
|
||||
source = pathlib.Path(sys.argv[1])
|
||||
app = (source / "app/GoNavi.zip").read_bytes()
|
||||
@@ -28,9 +33,27 @@ app = (source / "app/GoNavi.zip").read_bytes()
|
||||
"sha256": hashlib.sha256(app).hexdigest(),
|
||||
}],
|
||||
}))
|
||||
assets = {"mysql.exe": (source / "driver/mysql.exe").stat().st_size}
|
||||
(source / "driver/version.json").write_text(json.dumps({"tagName": "v1.2.3", "assets": assets}))
|
||||
(source / "driver/latest.json").write_text(json.dumps({"tagName": "v1.2.3", "assets": assets}))
|
||||
driver_name = "mysql-driver-agent-windows-amd64.zip"
|
||||
driver_entry_name = "mysql-driver-agent-windows-amd64.exe"
|
||||
driver_entry_path = f"Windows/{driver_entry_name}"
|
||||
driver_entry = b"driver binary"
|
||||
with zipfile.ZipFile(source / "driver" / driver_name, "w", compression=zipfile.ZIP_DEFLATED) as archive:
|
||||
archive.writestr(driver_entry_path, driver_entry)
|
||||
driver_archive = (source / "driver" / driver_name).read_bytes()
|
||||
index = {
|
||||
"assets": {driver_name: len(driver_archive)},
|
||||
"assetSha256": {driver_name: hashlib.sha256(driver_archive).hexdigest()},
|
||||
"entries": {
|
||||
driver_entry_name: {
|
||||
"archive": driver_name,
|
||||
"path": driver_entry_path,
|
||||
"size": len(driver_entry),
|
||||
"sha256": hashlib.sha256(driver_entry).hexdigest(),
|
||||
}
|
||||
},
|
||||
}
|
||||
(source / "driver/version.json").write_text(json.dumps({**index, "tagName": "v1.2.3"}))
|
||||
(source / "driver/latest.json").write_text(json.dumps({**index, "tagName": "latest", "mirrorTagName": "v1.2.3"}))
|
||||
PY
|
||||
|
||||
prepare_stable() {
|
||||
@@ -55,7 +78,7 @@ bash "${SCRIPT_DIR}/vps-release-commit.sh" \
|
||||
|
||||
test -f "${ROOT}/gonavi/releases/download/v1.2.3/GoNavi.zip"
|
||||
test -f "${ROOT}/gonavi/releases/latest/latest.json"
|
||||
test -f "${ROOT}/drivers/releases/download/v1.2.3/mysql.exe"
|
||||
test -f "${ROOT}/drivers/releases/download/v1.2.3/mysql-driver-agent-windows-amd64.zip"
|
||||
test -f "${ROOT}/drivers/releases/latest/GoNavi-DriverAgents-Index.json"
|
||||
test ! -e "${ROOT}/gonavi/releases/download/v0.9.0"
|
||||
test ! -e "${ROOT}/drivers/releases/download/v0.9.0"
|
||||
@@ -98,5 +121,29 @@ if bash "${SCRIPT_DIR}/vps-release-commit.sh" \
|
||||
exit 1
|
||||
fi
|
||||
test ! -e "${ROOT}/gonavi/dev/releases/latest/latest-dev.json"
|
||||
test ! -e "${ROOT}/.incoming/dev-1"
|
||||
test ! -e "${ROOT}/.deploy.lock.d"
|
||||
|
||||
# A driver-disabled dev deployment must not prune stable or existing dev driver assets.
|
||||
mkdir -p "${ROOT}/gonavi/dev/releases/download/dev-old" \
|
||||
"${ROOT}/drivers/dev/releases/download/dev-driver-old" \
|
||||
"${ROOT}/drivers/dev/releases/latest"
|
||||
printf '%s' 'old driver pointer' > "${ROOT}/drivers/dev/releases/latest/GoNavi-DriverAgents-Index.json"
|
||||
python3 "${SCRIPT_DIR}/prepare-vps-release-payload.py" \
|
||||
--channel dev \
|
||||
--app-tag dev-abc123 \
|
||||
--app-dir "${SOURCE}/app" \
|
||||
--app-manifest "${SOURCE}/app/latest-dev.json" \
|
||||
--output "${ROOT}/.incoming/dev-2" >/dev/null
|
||||
bash "${SCRIPT_DIR}/vps-release-commit.sh" \
|
||||
"${ROOT}" "${ROOT}/.incoming/dev-2" dev dev-abc123 '' >/dev/null
|
||||
|
||||
test -f "${ROOT}/gonavi/dev/releases/download/dev-abc123/GoNavi-dev.zip"
|
||||
test ! -e "${ROOT}/gonavi/dev/releases/download/dev-old"
|
||||
test -d "${ROOT}/drivers/dev/releases/download/dev-driver-old"
|
||||
test "$(cat "${ROOT}/drivers/dev/releases/latest/GoNavi-DriverAgents-Index.json")" = 'old driver pointer'
|
||||
test -d "${ROOT}/gonavi/releases/download/v1.2.3"
|
||||
test -d "${ROOT}/drivers/releases/download/v1.2.3"
|
||||
test ! -e "${ROOT}/.incoming/dev-2"
|
||||
|
||||
echo "vps release commit tests passed"
|
||||
|
||||
Reference in New Issue
Block a user