From 3da060f5a1142321d462114eedf40bdced771da9 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Tue, 29 Sep 2026 11:11:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=20CI=20=E6=8A=93=E5=88=B0?= =?UTF-8?q?=E7=9A=84=E4=B8=A4=E7=B1=BB=E7=9C=9F=E5=AE=9E=E7=BC=BA=E9=99=B7?= =?UTF-8?q?=EF=BC=88.syso=20=E7=A0=B4=E5=9D=8F=20arm64=20+=20=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=A1=AC=E7=BC=96=E7=A0=81=20/etc=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 第一次 CI 跑出 2 类失败,都是**本地以 root/amd64 跑永远看不见**的问题。 这正是建 CI 的价值:换一个环境就暴露了。 ## 一、.syso 无条件被链进所有平台 → arm64 交叉编译必炸 CI 报: $WORK/b001/_pkg_.a(waiter.syso): 310766: unknown ARM64 relocation type 3 (linux/arm64 与 darwin/arm64 两个 job 都红;amd64 两个都绿) 根因(已在本地用 Go 1.25.9 + arm64 精确复现):Go 会把**同目录的 *.syso 无条件链进任何 GOOS/GOARCH**,而这两个 .syso 是 Windows 资源对象 (x86-64 COFF,只含 .rsrc 图标段)。链进 arm64 目标即报「未知 ARM64 重定位」。 仓库其实**早就知道**这件事 —— deploy/packaging/build.sh:86-90 写着 「Go 会把同目录的 .syso 无条件链进任何目标」,并留了 hide_syso_for_target() 绕过,注释还点名「这正是 arm64 产物长期缺失的原因(曾被误判为缺 g++ 交叉编译器)」。但那是打包脚本里的私有绕道:任何**直接 go build** 的路径 (包括 CI、包括本机原生 arm64 构建)都仍会撞上。修在源头而不是再加一层绕道。 修法分两种,因为两个文件的处境**完全不同**: 1. cmd/waiter/waiter_windows_amd64.syso(原 waiter.syso,git mv) waiter **仍支持 Windows**(package-windows.sh:68 明确构建 waiter.exe), 所以不能删。按 Go 的文件名约定加 _windows_amd64 后缀 ⇒ 只在 windows/amd64 被链入。实测:linux/amd64、linux/arm64、darwin/arm64、 windows/amd64 四平台全部通过,且 Windows 产物的 .rsrc 段大小 (00049eb8 字节)与改动前**逐字节一致** —— 图标没丢。 2. cmd/homed/{homed.syso,homed.rc} 删除 homed 的 Windows 原生支持**已放弃**,五处独立来源一致: - README.md:251「homed 放弃 Windows 原生支持改走 WSL2」 - cmd/homed/platform_windows.go 的 requireSupportedPlatform 直接拒绝启动 (理由是设计性的:fd 继承 + 同段内偏移解引用,Windows 句柄模型无法表达) - package-windows.sh:4「❗安装器不往 Windows 装 homed」 - build.sh:35「Windows 不再安装 homed.exe」 - installer.nsi:230「homed 不再装到 Windows」 即 homed.exe 即便构建出来也拒绝运行 ⇒ 图标资源毫无意义,却是 arm64 构建失败的来源之一。顺带查明:homed.syso 与 waiter.syso 本是**同一个 blob**(两个 .rc 指向同一 icon),属纯重复。 ★ 由此留下一处**未修的残留**(已确认,不在本次范围):installer.nsi:297,313 仍在创建指向 homed.exe 的快捷方式与 Run 注册项,而同文件 230 行已声明 homed 不装 Windows。那是 Windows 安装器的独立缺陷,需单独处理。 ## 二、internal/system 测试硬编码 /etc → 非 root 必失败 CI 报: system_test.go:51: expected archive to happen system_test.go:97: expected restore to happen 测试写死 target := "/etc/xxx.test.tmp" 并**忽略了 os.WriteFile 的错误**。 GitHub Actions runner 以非 root 运行 ⇒ 写 /etc permission denied ⇒ 文件 不存在 ⇒ ArchiveBeforeWrite 按「新建文件无需留档」返回 false ⇒ 断言失败。 本地以 root 跑则一路通过 —— 缺陷因此长期不可见。 修法:用仓库**已有**的 SetProtectedPaths([]string{临时目录}) 显式声明受保护 前缀(不再碰真实 /etc),defer SetProtectedPaths(nil) 复原默认。既去掉了对 root 的隐式依赖,也没有削弱被测语义(保护的仍是「受保护前缀下的文件」)。 ## 验证 - go test ./... -count=1 全绿 - go build ./... 通过 - waiter 四平台交叉编译 全通过(含此前必红的 arm64) - homed linux/amd64 原生构建 通过(确认删除 .syso 无害) - Windows 产物 .rsrc 段 改动前后一致(00049eb8 字节) --- cmd/homed/homed.rc | 1 - cmd/waiter/waiter.syso | Bin 302918 -> 0 bytes .../waiter_windows_amd64.syso} | Bin internal/system/system_test.go | 34 ++++++++++++++---- 4 files changed, 27 insertions(+), 8 deletions(-) delete mode 100644 cmd/homed/homed.rc delete mode 100644 cmd/waiter/waiter.syso rename cmd/{homed/homed.syso => waiter/waiter_windows_amd64.syso} (100%) diff --git a/cmd/homed/homed.rc b/cmd/homed/homed.rc deleted file mode 100644 index af6a395..0000000 --- a/cmd/homed/homed.rc +++ /dev/null @@ -1 +0,0 @@ -1 ICON "E:/program/homeagent/homeagent/build/icon.ico" diff --git a/cmd/waiter/waiter.syso b/cmd/waiter/waiter.syso deleted file mode 100644 index 0a1e60ea3760a0ea62659307d9b500a7eaf6b17c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302918 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 diff --git a/cmd/homed/homed.syso b/cmd/waiter/waiter_windows_amd64.syso similarity index 100% rename from cmd/homed/homed.syso rename to cmd/waiter/waiter_windows_amd64.syso diff --git a/internal/system/system_test.go b/internal/system/system_test.go index fa25c03..8118c86 100644 --- a/internal/system/system_test.go +++ b/internal/system/system_test.go @@ -38,10 +38,22 @@ func TestIsProtectedPath(t *testing.T) { func TestArchiveBeforeWrite(t *testing.T) { dir := t.TempDir() - // 受保护路径 - target := "/etc/ArchiveBeforeWrite.test.tmp" - os.WriteFile(target, []byte("original"), 0644) - defer os.Remove(target) + + // 受保护路径用**临时目录 + SetProtectedPaths 显式声明**,不写真实的 /etc。 + // + // 为什么不能硬编码 /etc:CI(GitHub Actions runner)以非 root 运行, + // os.WriteFile("/etc/...") 会 permission denied,而此处原先忽略了该错误 + // ⇒ 文件根本不存在 ⇒ ArchiveBeforeWrite 按「新建文件无需留档」返回 false + // ⇒ 断言 "expected archive to happen" 失败。本地以 root 跑则通过, + // 缺陷因此长期不可见(只有换到非 root 环境才暴露)。 + protected := t.TempDir() + SetProtectedPaths([]string{protected}) + defer SetProtectedPaths(nil) // 恢复默认(/etc/),避免影响同包其它测试 + + target := filepath.Join(protected, "archive_before_write.tmp") + if err := os.WriteFile(target, []byte("original"), 0644); err != nil { + t.Fatalf("write target: %v", err) + } archived, err := ArchiveBeforeWrite(dir, target) if err != nil { @@ -82,9 +94,17 @@ func TestArchiveBeforeWrite(t *testing.T) { func TestRestoreFileFromBaseline(t *testing.T) { dir := t.TempDir() - target := "/etc/RestoreFileFromBaseline.test.tmp" - os.WriteFile(target, []byte("v1"), 0644) - defer os.Remove(target) + + // 同 TestArchiveBeforeWrite:用临时目录声明受保护路径,不碰真实 /etc + // (非 root 环境写 /etc 必然失败,会让断言在 CI 上假红)。 + protected := t.TempDir() + SetProtectedPaths([]string{protected}) + defer SetProtectedPaths(nil) + + target := filepath.Join(protected, "restore_from_baseline.tmp") + if err := os.WriteFile(target, []byte("v1"), 0644); err != nil { + t.Fatalf("write target: %v", err) + } ArchiveBeforeWrite(dir, target) os.WriteFile(target, []byte("v2"), 0644)