From 0c9a3900b80dc7f657eacb1dc5d3a546bbfc15b1 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Sun, 20 Sep 2026 09:07:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(release):=20.hmap=20=E7=BA=B3=E5=85=A5?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E4=BA=A7=E7=89=A9=E7=99=BD=E5=90=8D=E5=8D=95?= =?UTF-8?q?=20+=20=E8=B7=AF=E5=BE=84=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 白名单(真问题) `upload_assets.py` 的 ARTIFACT_SUFFIXES 只有 .tar.gz/.zip/.deb/.rpm/.pkg/_win64.exe, **没有 .hmap** —— 即使插件包已经构建好放在 dist/ 下,上传时也会被静默跳过。 这正是「release 里一个插件包都没有」的直接原因之一。 补 `.hmap` 与 `SHA256SUMS.plugins`(插件包的汇总校验和,与内核包的 SHA256SUMS 分开, 避免混用)。实测 is_artifact() 现能正确识别两者、仍跳过 README.md。 ## 测试路径解析 `HMAP_BUNDLE_DIR=dist/plugins` 这种相对仓根的写法原先会失败:测试的 cwd 是包目录 (internal/plugins/pluginmgr),相对路径解析到包内,报 "no such file or directory", 看起来像产物不存在。改为相对路径按仓根解析(向上找含 go.mod 的目录)。 实测三种调用都正确:相对路径、绝对路径、不设时 skip。 --- deploy/scripts/upload_assets.py | 6 +++- .../plugins/pluginmgr/bundle_install_test.go | 29 ++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/deploy/scripts/upload_assets.py b/deploy/scripts/upload_assets.py index 97fe7c2..1e8211e 100755 --- a/deploy/scripts/upload_assets.py +++ b/deploy/scripts/upload_assets.py @@ -32,13 +32,17 @@ ARTIFACT_SUFFIXES = ( ".rpm", ".pkg", "_win64.exe", + # 插件包。之前不在白名单里,会被静默跳过——而 release 本该带上它们, + # 否则用户要自己装 Go + hmapdev 逐插件构建(见 SDK 仓 scripts/build_plugin_bundles.sh)。 + ".hmap", + # 插件包汇总校验和(与 SHA256SUMS 同性质,独立文件免得混淆内核包与插件) + "SHA256SUMS.plugins", ) def is_artifact(name: str) -> bool: return name == "SHA256SUMS" or name.endswith(ARTIFACT_SUFFIXES) - def get_upload_url(tag: str, token: str, filename: str) -> tuple[str, dict]: q = urllib.parse.urlencode({"file_name": filename}) url = f"{API}/{REPO}/releases/{tag}/upload_url?{q}" diff --git a/internal/plugins/pluginmgr/bundle_install_test.go b/internal/plugins/pluginmgr/bundle_install_test.go index f731ab5..dd51c0c 100644 --- a/internal/plugins/pluginmgr/bundle_install_test.go +++ b/internal/plugins/pluginmgr/bundle_install_test.go @@ -23,9 +23,17 @@ func TestBuildPluginBundlesInstallable(t *testing.T) { if dir == "" { t.Skip("未设 HMAP_BUNDLE_DIR(指向 build_plugin_bundles.sh 的产出目录)") } + // 相对路径按**仓根**而非本包目录解析:测试的 cwd 是包目录, + // 而调用方通常写 `HMAP_BUNDLE_DIR=dist/plugins`(相对仓根),不修正就会 + // 报 “no such file or directory”,看起来像产物不存在。 + if !filepath.IsAbs(dir) { + if abs, err := filepath.Abs(filepath.Join(repoRoot(), dir)); err == nil { + dir = abs + } + } entries, err := os.ReadDir(dir) if err != nil { - t.Fatalf("读产物目录: %v", err) + t.Fatalf("读产物目录 %s: %v", dir, err) } n := 0 @@ -105,6 +113,25 @@ func TestBuildPluginBundlesInstallable(t *testing.T) { t.Logf("共 %d 个插件包通过内核解包校验", n) } +// repoRoot 从本文件位置向上找到仓根(含 go.mod 的目录)。 +func repoRoot() string { + d, err := os.Getwd() + if err != nil { + return "." + } + for i := 0; i < 8; i++ { + if _, err := os.Stat(filepath.Join(d, "go.mod")); err == nil { + return d + } + parent := filepath.Dir(d) + if parent == d { + break + } + d = parent + } + return "." +} + // extractField 从 JSON 文本里取一个字符串字段(本文件不想为此引 encoding/json)。 func extractField(js, key string) string { pat := `"` + key + `"`