构建审计
CI 矩阵、SHA256SUMS、可复现、OpenSSF。
构建矩阵
5 目标 GitHub Actions 矩阵,各目标原生 runner:
| 目标 | runner | 链接 | 归档 |
|---|---|---|---|
x86_64-linux-musl | ubuntu-latest + Alpine 3.20 docker | 完全静态 musl | .tar.gz |
aarch64-linux-musl | ubuntu-24.04-arm + Alpine 3.20 docker | 完全静态 musl | .tar.gz |
aarch64-macos | macos-14 | 静态,系统 libc++/libSystem | .tar.gz |
x86_64-macos | macos-14(从 aarch64 交叉) | 静态,系统 libc++/libSystem | .tar.gz |
x86_64-windows | windows-latest + MSYS2 + mingw64 | 完全静态 | .zip |
aarch64-windows 暂不做——MSYS2 MINGW64 没 mingw-w64-aarch64-gcc
包,需要 LLVM clang 加 -target aarch64-w64-windows-msvc
或者从源码编译 mingw-w64-aarch64。
CI 两阶段
-
build-and-test.yml— 每个 push 到main和每个 PR 都跑。全矩阵构建 + smoke + 把dist/作为 workflow artifact 上传(7 天保留)。 PR 准入门槛就是它。 -
release.yml— 只在 tag push (v*)和workflow_dispatch触发。 构建矩阵跟前者完全一致;最后一步通过 softprops/action-gh-release 发 GitHub Release,带每个 archive 的.sha256和顶层SHA256SUMS。
Smoke 测试
脚本(scripts/smoke.sh)做两件事:
- 版本检查——确认
lha跑出预期的版本横幅。 - CLI 解码 round-trip——拿
upstream/lhasa/test/archives/里的.lzh/.lzs/.pma跑lha l和lha xq。
不直接跑 make check:上游测试 driver 用相对路径
source test_extract.sh,跟我们用的 musl+glibc 隔离的
out-of-tree 模式冲突。走 CLI 等价路径。
依赖足迹
lhasa 源码树零外部库依赖——没 zlib、没 libiconv、没 libcurl、
没 libarchive。configure.ac 只 probe C 编译器和 Libtool。
- Linux musl——完全静态。同一个二进制在 Alpine / Debian / Ubuntu /
RHEL / Fedora / Arch 都能跑。CI 里
ldd验证。 - macOS——只链系统
libc++/libSystem。otool -L在 CI 验证,碰到 Homebrew 路径就 fail。 - Windows——MinGW 静态。没 VC redistributable。
OpenSSF Scorecard
等 GitHub 历史积累够 PR 让启发式有意义再开 Scorecard。已经满足的项:
- Code-Review——PR 走
build-and-test矩阵过审。 - License——MIT 包装 + ISC 上游,都在
/LICENSE和/NOTICE.md。 - Token-Permissions——CI workflow 顶部声明
permissions: contents: write(按需最小)。 - Pinned-Dependencies——GitHub Actions pin 到 major + sha。