diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index cfc3577..7999fd1 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -4,7 +4,7 @@ name: Build and Release Mond on: push: branches: [main, master, develop] - tags: ['v*'] + tags: ['*'] env: DOCKER_BUILDKIT: "1" @@ -60,9 +60,11 @@ jobs: # 快速验证 mkdir -p test && tar -xzf "${TARGZ}" -C test test/mond --version 2>/dev/null || echo "⚠️ 跳过版本检查" - # 纯静态校验(depends 系统应产出无动态依赖的二进制) - ldd test/mond 2>&1 | grep -q "not a dynamic executable" \ - && echo "✅ 纯静态链接" || echo "⚠️ 非纯静态二进制" + # 依赖校验:第三方库(boost/ssl/zmq 等)应已被 depends 静态链入, + # 运行时只应依赖 glibc(libc/libm/libpthread/ld-linux) + EXTRA=$(ldd test/mond 2>/dev/null | awk '{print $1}' \ + | grep -vE '(^|/)(linux-vdso|libc\.so|libm\.so|libpthread\.so|libdl\.so|librt\.so|libresolv\.so|libutil\.so|ld-linux)' || true) + [ -z "$EXTRA" ] && echo "✅ 运行时仅依赖 glibc" || echo "⚠️ 检测到非 glibc 动态依赖: ${EXTRA}" rm -rf test - name: Build Debian package diff --git a/CLAUDE.md b/CLAUDE.md index f93944b..992274c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -25,8 +25,8 @@ mond 是 Monero 守护进程 `monerod` 的定制换名构建。换名通过 [ini 2. **release**(仅 tag 触发):下载 artifact,上传 tar.gz 到 Generic Package Registry、上传 .deb 到 Debian Registry(stable/main),并用 `jq` 生成描述创建 Gitea Release。 关键点: -- **只构建 ubuntu,不做 alpine**(与参考项目不同,刻意取舍):mond 用 Monero **官方 depends 系统**(`make depends target=…`)交叉编译,产物为纯静态二进制(`ldd` 显示 "not a dynamic executable"),任意发行版可跑,Alpine 无需单独构建;且单次构建耗时 30–60 分钟,加 distro 维度会让 CI 翻倍而无收益。 -- **版本号约定**:包版本硬编码在 ci.yaml 的 `PACKAGE_VERSION: "0.18.5.0"`(**纯数字、无 v**,符合 Debian 版本规范)。**关键分界**:上游 Monero git tag 带 `v`,故 build job 用 `MONERO_VERSION=v${PACKAGE_VERSION}` 补回 v 传给 Dockerfile `git checkout`;tar.gz / deb / registry 路径 / Release 标题等包版本一律直接用 `${PACKAGE_VERSION}`;release job 用 `VERSION="${TAG#v}"` 归一。发版改 `PACKAGE_VERSION` 并打对应 `v*` tag。 +- **只构建 ubuntu,不做 alpine**(刻意取舍):mond 用 Monero **官方 depends 系统**(`make depends target=…`)交叉编译,将 boost/openssl/zmq 等第三方依赖全部静态链入,**运行时仅动态依赖 glibc**(`ldd` 仍列出 libc/libm/libpthread/ld-linux —— 并非纯静态,故 Alpine/musl 系统无法直接运行)。主分发渠道是面向 Debian/Ubuntu 的 .deb(`Depends: libc6 (>= 2.31)`);单次构建耗时 30–60 分钟,加 distro 维度会让 CI 翻倍。若要支持 Alpine 须改用 musl + `-static-pie` 真静态构建(当前未做)。 +- **版本号约定**:包版本硬编码在 ci.yaml 的 `PACKAGE_VERSION: "0.18.5.0"`(**纯数字、无 v**,符合 Debian 版本规范)。**关键分界**:上游 Monero git tag 带 `v`,故 build job 用 `MONERO_VERSION=v${PACKAGE_VERSION}` 补回 v 传给 Dockerfile `git checkout`;tar.gz / deb / registry 路径 / Release 标题等包版本一律直接用 `${PACKAGE_VERSION}`;release job 用 `VERSION="${TAG#v}"` 归一(tag 带不带 v 都兼容)。CI 触发条件为 `tags: ['*']`,发版改 `PACKAGE_VERSION` 并打对应 tag(纯数字,如 `0.18.5.0`)。 - **依赖精简**:depends 系统已将 boost/openssl/zmq/unbound/sodium/unwind 静态链入,故 [debian/control.template](debian/control.template) 仅 `Depends: libc6`,无需列动态库。 - 架构名映射:Dockerfile 内 `arm64→aarch64-linux-gnu`、`amd64→x86_64-linux-gnu` 作为 depends target。 - tar.gz 下载 URL 形如 `https://gitea.bcde.io/api/packages/wangdefa/generic/mond/{version}/mond-{arch}-ubuntu-{version}.tar.gz`(version 为纯数字)。 @@ -47,7 +47,7 @@ docker buildx build --platform linux/amd64 \ shellcheck debian/*.sh ``` -无单元测试;CI 中唯一的冒烟测试是解包后跑 `mond --version` 并 `ldd` 校验纯静态。 +无单元测试;CI 中唯一的冒烟测试是解包后跑 `mond --version`,并用 `ldd` 校验运行时仅依赖 glibc(无第三方动态库)。 ## Debian 包布局与服务 diff --git a/README.md b/README.md index 30670ce..a6b49a6 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ - 🏗️ **多架构支持** - 原生支持 AMD64 和 ARM64 架构 - 📦 **多种安装方式** - 提供 Debian 包和通用二进制包 - 🐧 **多发行版兼容** - 支持 Ubuntu 和 Debian -- 🔗 **纯静态链接** - 无需依赖,可在任意 Linux 系统运行 +- 🔗 **依赖精简** - 第三方库(boost/OpenSSL/ZMQ 等)全部静态链入,运行时仅依赖系统 glibc(libc6 ≥ 2.31) - 🔒 **隐私优先** - 基于 Monero 的隐私保护技术 - 🔄 **自动更新** - 通过 Debian 仓库轻松安装和更新 @@ -144,7 +144,7 @@ sudo systemctl restart mond.service ### Docker 构建(推荐) -本项目使用 Docker 和官方 depends 系统构建,确保纯静态链接。 +本项目使用 Docker 和官方 depends 系统构建,将 boost/OpenSSL/ZMQ 等第三方依赖全部静态链入(运行时仅依赖系统 glibc)。 #### 构建多架构二进制文件 @@ -169,15 +169,12 @@ docker buildx build --platform linux/arm64 \ --output type=local,dest=./output . ``` -#### 验证静态链接 +#### 验证依赖 ```bash -# 检查二进制文件是否为纯静态链接 +# 运行时动态依赖应只有 glibc 组件(libc/libm/libpthread/ld-linux),无第三方库 ldd output/linux_amd64/mond -# 预期输出: "not a dynamic executable" - -file output/linux_amd64/mond -# 预期输出: "statically linked" +# 预期: 仅 linux-vdso、libc、libm、libpthread、ld-linux 等 glibc 组件 ``` ### 本地构建