Files
matrix-screen-controller/核桃派软件源代码/scripts/build_ota_package.py
T

82 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""Create one self-contained browser OTA package on the development computer."""
from __future__ import annotations
import argparse
from datetime import datetime, timezone
import hashlib
from pathlib import Path
import sys
SOURCE_ROOT = Path(__file__).resolve().parents[1]
if str(SOURCE_ROOT) not in sys.path:
sys.path.insert(0, str(SOURCE_ROOT))
from app.ota.package import build_package
from app.ota.versioning import read_software_version
from app.ota.policy import read_policy
from scripts.offline_wheels import validate_offline_wheels
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--notes", required=True, help="short release description")
parser.add_argument("--output-root", type=Path)
args = parser.parse_args()
source_root = Path(__file__).resolve().parents[1]
project_root = source_root.parent
wheelhouse = project_root / "发布更新相关" / "其他依赖" / "aarch64-py311"
validate_offline_wheels(source_root, wheelhouse)
frpc_bundle = project_root / "发布更新相关" / "其他依赖" / "frp" / "0.71.0" / "linux-arm64"
version = read_software_version(source_root)
policy = read_policy(source_root)
if policy["checkpoints"] and version < type(version).parse(policy["checkpoints"][-1]["version"]):
parser.error("源码包含未发布的软件依赖;请使用 export_release.py ota --version 导出安装节点")
if version.patch != 0:
frpc_bundle = None
output_root = (args.output_root or project_root / "发布更新相关" / "OTA数据包").resolve()
version_dir = output_root / str(version)
if version_dir.exists():
parser.error(f"version output already exists and will not be overwritten: {version_dir}")
version_dir.mkdir(parents=True)
package_path = version_dir / f"matrix-screen-controller-{version}.ota"
created = datetime.now(timezone.utc)
try:
info = build_package(
source_root,
wheelhouse,
package_path,
version=version,
release_notes=args.notes,
created_at=created,
system_dependencies=frpc_bundle,
)
package_sha = hashlib.sha256(package_path.read_bytes()).hexdigest()
readme = (
f"# 奇妙小屏幕控制器 OTA {version}\n\n"
f"- 软件版本:`{version}`\n"
f"- 打包时间:`{info.created_at}`\n"
f"- 更新说明:{args.notes.strip()}\n"
f"- 更新包:`{package_path.name}`\n"
f"- 文件大小:`{package_path.stat().st_size}` bytes\n"
f"- 文件 SHA-256:`{package_sha}`\n"
f"- 载荷 SHA-256:`{info.payload_sha256}`\n\n"
"通过设备网页的“系统设置 → 软件更新”选择 `.ota` 文件。"
"本包是离线全量包,不使用服务器下载、增量、加密或签名。\n"
)
(version_dir / "README.md").write_text(readme, encoding="utf-8", newline="\n")
except BaseException:
package_path.unlink(missing_ok=True)
try:
version_dir.rmdir()
except OSError:
pass
raise
print(version_dir)
return 0
if __name__ == "__main__":
raise SystemExit(main())