Files
xxxig/CLAUDE.md
T
wangdefaandClaude Opus 4.8 491c9e0bc3
Build and Release / release (push) Successful in 12s
Build and Release / build-and-test (amd64) (push) Successful in 1m27s
Build and Release / build-and-test (arm64) (push) Successful in 4m5s
统一 musl 全静态构建,规范 Dockerfile 与产物命名
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 10:12:08 +08:00

5.3 KiB
Raw Blame History

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

仓库性质

本仓库只包含构建与打包基础设施,不含矿机源码。矿机源码在编译时从外部仓库克隆(见两个 Dockerfile):

  • 源码仓库:github.com/wangdefaa/xxxig.git(注意结尾是 wangdefaa,双 a
  • 发布仓库:Gitea gitea.bcde.io 下的 wangdefa/xxxig(结尾是 wangdefa,单 a

这两个名字极易混淆,改动 URL 时务必区分。xxxig 是 XMRigRandomX CPU 矿机)的定制/换名构建,带 CCCentral Control 集中管理)功能。

整体架构:三个二进制

编译产出三个可执行文件,构成 XMRig-CC 的 client/server 架构:

  • xxxig —— 实际挖矿程序,由 daemon 拉起
  • xxxigDaemon —— 客户端守护进程,控制 xxxig,通过 cc-client 配置连接到中心服务器。这是安装后作为主服务运行的进程
  • xxxigServer —— 中心控制服务器,带 Web UI(index.html),daemon 连到它上报/受控

两份配置:config.jsondaemon/矿机用)与 config_cc.jsonserver 用),均来自源码 src/ 目录。

构建与发布流程(CI

.gitea/workflows/ci.yaml 是 Gitea Actions 流水线:

  1. build-and-test(矩阵 arch=[amd64,arm64],跑在对应架构的原生 runner 上):用 docker buildxdocker/Dockerfile 原生编译 → 打成 tar.gz → 调 debian/build-deb.sh 打 .deb → 上传 artifact。
  2. release(仅 tag 触发):下载 artifact,上传 tar.gz 到 Generic Package Registry、上传 .deb 到 Debian Registrystable/main),并创建 Gitea Release。

关键点:

  • 版本号硬编码在 ci.yaml 的 PACKAGE_VERSION: "6.26.0"(纯数字,符合 Debian 版本规范),发版改这里。关键分界:上游源码 git tag 带 vCI 用 XXXIG_VERSION=v${PACKAGE_VERSION} 检出 v6.26.0),而 tar.gz/deb/registry 路径等包版本一律用数字;release job 用 VERSION="${TAG#v}" 归一,install 脚本下载时同样 ${version#v}
  • 编译选项(docker/Dockerfilemusl 全静态):-DWITH_CC_CLIENT=ON -DWITH_CC_SERVER=ON -DBUILD_STATIC=ON -DWITH_OPENCL=OFF -DWITH_CUDA=OFF,即 CPU-only 全静态构建;arm64/arm 在对应架构原生 runner 上编译并设 -DARM_TARGET=8/7
  • 为何用 musl(alpine) 而非 glibc(勿改回 glibc 全静态)glibc 的 getaddrinfo 依赖运行时 dlopen NSS 模块,-static 全静态后无法加载,跨 glibc 版本运行时 DNS 解析失败(errno=EBUSY → libuv UV_EBUSYDNS error: "resource busy or locked")。musl 的 getaddrinfo 自带实现,全静态也能正常解析。曾用的 glibc(ubuntu) 构建线已删除。
  • 架构名映射:x86_64→amd64aarch64→arm64
  • tar.gz 下载 URL 形如 https://gitea.bcde.io/api/packages/wangdefa/generic/xxxig/{version}/xxxig-{arch}-linux-static-{version}.tar.gz

本地常用命令

# 本地编译某架构/发行版的二进制(输出到 ./output/linux_<arch>/
docker buildx build --platform linux/amd64 \
  --build-arg XXXIG_VERSION=v6.26.0 \
  --output type=local,dest=./output \
  -f docker/Dockerfile .

# 用已有 tar.gz 打 .deb 包
./debian/build-deb.sh amd64 6.26.0 xxxig-amd64-linux-static-6.26.0.tar.gz

# 改 shell 脚本后做静态检查(仓库未配置,需自行安装 shellcheck)
shellcheck script/*.sh debian/*.sh

无单元测试;CI 中唯一的冒烟测试是解包后跑 xxxigDaemon --version

两种分发渠道与安装布局(差异很大)

tar.gzscript/install.sh .deb / APTscript/install.deb.sh
来源 Generic Registry 直接下载解包 加 APT 源后 apt-get install
二进制 /etc/miner/xxxig/(仅 daemon+矿机) /opt/xxxig/(含 Server
配置 /etc/miner/xxxig/config.json /etc/xxxig/config.jsonconfig_cc.json
服务 单个 xxxigsystemd 或 Alpine OpenRC xxxig-daemon + xxxig-server(仅 systemd
默认启用 xxxig xxxig-daemonserver 需手动 enable

.deb 的服务文件、维护脚本在 debian/postinst 自动启用服务,但 install.deb.sh 会主动 enable daemon。卸载统一用 script/uninstall.sh(自动探测安装方式)。

配置改写逻辑(改动重点:代码重复)

install.sh 与 install.deb.sh 各自维护一份近乎相同的 parse_args / replace_config / configure_cpu_rx / configure_hugepages修改任何安装参数或配置写入逻辑时,两个文件都要同步改。

  • 配置全部用 jq 改写 config.json(矿池 url/user/pass/algo/tls/nicehash、cc-clientdonate-level=0 等)。
  • CPU 亲和性 configure_cpu_rx:线程数 ≤ 核数一半时 step=2(隔核分配,避开超线程),否则 step=1,生成 cpu.rx 数组(algo 为 panthera 时写 cpu.panthera)。
  • 已知差异:install.sh 把 log-file 设为 /etc/miner/xxxig/xxxig.loginstall.deb.sh 设为空串(由 systemd 服务用 --log-file 显式指定到 /var/log/xxxig/)。
  • 两脚本都会先卸载旧版再装(幂等重装);缺省 wallet/password/cc-work-id 会自动生成。