From 491c9e0bc3d40e8a13b2b362a3f3ecdc4091b2bb Mon Sep 17 00:00:00 2001 From: Wang Defa <1+wangdefa@noreply.gitea.bcde.io> Date: Wed, 10 Jun 2026 10:12:08 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E4=B8=80=20musl=20=E5=85=A8=E9=9D=99?= =?UTF-8?q?=E6=80=81=E6=9E=84=E5=BB=BA=EF=BC=8C=E8=A7=84=E8=8C=83=20Docker?= =?UTF-8?q?file=20=E4=B8=8E=E4=BA=A7=E7=89=A9=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- .gitea/workflows/ci.yaml | 12 ++-- CLAUDE.md | 11 +-- README.md | 12 ++-- debian/build-deb.sh | 2 +- docker/{Dockerfile.alpine => Dockerfile} | 0 docker/Dockerfile.ubuntu | 86 ------------------------ script/README.md | 2 +- script/install.sh | 3 +- 8 files changed, 21 insertions(+), 107 deletions(-) rename docker/{Dockerfile.alpine => Dockerfile} (100%) delete mode 100644 docker/Dockerfile.ubuntu diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index b4e2b98..3ec2f90 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -18,7 +18,6 @@ jobs: strategy: matrix: arch: [amd64, arm64] - distro: [ubuntu, alpine] steps: - uses: actions/checkout@v4 @@ -39,7 +38,7 @@ jobs: PLATFORM="linux/${{ matrix.arch }}" echo "🏗️ Building ${PLATFORM} on native ${{ matrix.arch }} runner" - echo "📦 Distribution: ${{ matrix.distro }}" + echo "📦 Build: musl 全静态 (docker/Dockerfile, 基于 alpine)" # 设置 BuildKit 优化参数 export BUILDKIT_PROGRESS=plain @@ -48,7 +47,7 @@ jobs: --platform ${PLATFORM} \ --build-arg XXXIG_VERSION=${XXXIG_VERSION} \ --output type=local,dest=./output \ - -f docker/Dockerfile.${{ matrix.distro }} . + -f docker/Dockerfile . - name: Package and test run: | @@ -59,7 +58,7 @@ jobs: exit 1 fi - TARGZ="${PRODUCT_NAME}-${{ matrix.arch }}-${{ matrix.distro }}-${PACKAGE_VERSION}.tar.gz" + TARGZ="${PRODUCT_NAME}-${{ matrix.arch }}-linux-static-${PACKAGE_VERSION}.tar.gz" tar -czf "${TARGZ}" -C "$DIR" . echo "📦 Created package: ${TARGZ}" @@ -71,12 +70,11 @@ jobs: rm -rf test - name: Build Debian package - if: matrix.distro == 'ubuntu' run: | # 安装 dpkg-deb(如果需要) sudo apt-get update && sudo apt-get install -y dpkg-dev - TARGZ="${PRODUCT_NAME}-${{ matrix.arch }}-${{ matrix.distro }}-${PACKAGE_VERSION}.tar.gz" + TARGZ="${PRODUCT_NAME}-${{ matrix.arch }}-linux-static-${PACKAGE_VERSION}.tar.gz" echo "📦 Building Debian package for ${{ matrix.arch }}..." chmod +x debian/build-deb.sh @@ -86,7 +84,7 @@ jobs: - uses: https://github.com/ChristopherHX/gitea-upload-artifact@v4 with: - name: binaries-${{ matrix.arch }}-${{ matrix.distro }} + name: binaries-${{ matrix.arch }} path: | *.tar.gz *.deb diff --git a/CLAUDE.md b/CLAUDE.md index b0a32d9..bf12c47 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -25,14 +25,15 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co [.gitea/workflows/ci.yaml](.gitea/workflows/ci.yaml) 是 Gitea Actions 流水线: -1. **build-and-test**(矩阵 `arch=[amd64,arm64] × distro=[ubuntu,alpine]`,跑在对应架构的原生 runner 上):用 `docker buildx` 按 `docker/Dockerfile.{distro}` 原生编译 → 打成 tar.gz → 仅 ubuntu distro 再调 `debian/build-deb.sh` 打 .deb → 上传 artifact。 +1. **build-and-test**(矩阵 `arch=[amd64,arm64]`,跑在对应架构的原生 runner 上):用 `docker buildx` 按 `docker/Dockerfile` 原生编译 → 打成 tar.gz → 调 `debian/build-deb.sh` 打 .deb → 上传 artifact。 2. **release**(仅 tag 触发):下载 artifact,上传 tar.gz 到 Generic Package Registry、上传 .deb 到 Debian Registry(stable/main),并创建 Gitea Release。 关键点: - 版本号**硬编码**在 ci.yaml 的 `PACKAGE_VERSION: "6.26.0"`(纯数字,符合 Debian 版本规范),发版改这里。**关键分界**:上游源码 git tag 带 `v`(CI 用 `XXXIG_VERSION=v${PACKAGE_VERSION}` 检出 `v6.26.0`),而 tar.gz/deb/registry 路径等包版本一律用数字;release job 用 `VERSION="${TAG#v}"` 归一,install 脚本下载时同样 `${version#v}`。 -- 编译选项(两个 Dockerfile 一致):`-DWITH_CC_CLIENT=ON -DWITH_CC_SERVER=ON -DBUILD_STATIC=ON -DWITH_OPENCL=OFF -DWITH_CUDA=OFF`,即 CPU-only 静态构建。arm64/arm 走交叉编译并设 `-DARM_TARGET=8/7`。 +- 编译选项(`docker/Dockerfile`,musl 全静态):`-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_EBUSY` → `DNS error: "resource busy or locked"`)。musl 的 `getaddrinfo` 自带实现,全静态也能正常解析。曾用的 glibc(ubuntu) 构建线已删除。 - 架构名映射:`x86_64→amd64`、`aarch64→arm64`。 -- tar.gz 下载 URL 形如 `https://gitea.bcde.io/api/packages/wangdefa/generic/xxxig/{version}/xxxig-{arch}-{os}-{version}.tar.gz`。 +- tar.gz 下载 URL 形如 `https://gitea.bcde.io/api/packages/wangdefa/generic/xxxig/{version}/xxxig-{arch}-linux-static-{version}.tar.gz`。 ## 本地常用命令 @@ -41,10 +42,10 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co docker buildx build --platform linux/amd64 \ --build-arg XXXIG_VERSION=v6.26.0 \ --output type=local,dest=./output \ - -f docker/Dockerfile.ubuntu . + -f docker/Dockerfile . # 用已有 tar.gz 打 .deb 包 -./debian/build-deb.sh amd64 6.26.0 xxxig-amd64-ubuntu-6.26.0.tar.gz +./debian/build-deb.sh amd64 6.26.0 xxxig-amd64-linux-static-6.26.0.tar.gz # 改 shell 脚本后做静态检查(仓库未配置,需自行安装 shellcheck) shellcheck script/*.sh debian/*.sh diff --git a/README.md b/README.md index cc9e11f..76db490 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ XXXig 是 [XMRig](https://github.com/xmrig/xmrig) 的定制构建——带 CC( ## 产物 -每次构建产出三个可执行文件(CPU-only,静态链接 libuv/OpenSSL/hwloc,运行时仅依赖 glibc): +每次构建产出三个可执行文件(CPU-only,musl 全静态,含 libuv/OpenSSL/hwloc,无外部动态库依赖,任意 Linux 发行版可跑): | 二进制 | 作用 | |---|---| @@ -14,7 +14,7 @@ XXXig 是 [XMRig](https://github.com/xmrig/xmrig) 的定制构建——带 CC( | `xxxigDaemon` | 守护进程,控制矿机并通过 cc-client 连接中心服务器;安装后作为主服务运行 | | `xxxigServer` | 中心控制服务器,带 Web UI | -支持架构 `amd64` / `arm64`,发行版 Ubuntu/Debian、Alpine。 +支持架构 `amd64` / `arm64`;musl 全静态,任意 Linux 发行版(Debian/Ubuntu/Alpine/CentOS 等)开箱即跑。 ## 安装 @@ -48,7 +48,7 @@ sudo bash <(wget --no-check-certificate -qO- 'https://gitea.bcde.io/wangdefa/xxx CI 定义于 [.gitea/workflows/ci.yaml](.gitea/workflows/ci.yaml): -- **push 到 `main`/`develop`**:矩阵 `arch=[amd64,arm64] × distro=[ubuntu,alpine]`,在原生 runner 上用 Docker 编译为 tar.gz,ubuntu 再打 `.deb`。 +- **push 到 `main`/`develop`**:矩阵 `arch=[amd64,arm64]`,在原生 runner 上用 Docker(musl 全静态)编译为 tar.gz 并打 `.deb`。 - **打 tag**:产物上传到 Generic / Debian 包仓库并创建 Release。 本地构建: @@ -58,10 +58,10 @@ CI 定义于 [.gitea/workflows/ci.yaml](.gitea/workflows/ci.yaml): docker buildx build --platform linux/amd64 \ --build-arg XXXIG_VERSION=v6.26.0 \ --output type=local,dest=./output \ - -f docker/Dockerfile.ubuntu . + -f docker/Dockerfile . # 用产物 tar.gz 打 .deb -./debian/build-deb.sh amd64 6.26.0 xxxig-amd64-ubuntu-6.26.0.tar.gz +./debian/build-deb.sh amd64 6.26.0 xxxig-amd64-linux-static-6.26.0.tar.gz ``` ## 版本号约定 @@ -75,7 +75,7 @@ docker buildx build --platform linux/amd64 \ ``` .gitea/workflows/ CI 流水线 -docker/ 各发行版 Dockerfile(从上游源码编译) +docker/ Dockerfile(musl 全静态,从上游源码编译) debian/ .deb 打包:control 模板、维护脚本、systemd 服务 script/ 安装/卸载脚本 + 详细文档 ``` diff --git a/debian/build-deb.sh b/debian/build-deb.sh index d250766..32a2459 100755 --- a/debian/build-deb.sh +++ b/debian/build-deb.sh @@ -4,7 +4,7 @@ set -e # 参数检查 if [ $# -ne 3 ]; then echo "Usage: $0 " - echo "Example: $0 amd64 6.26.0 xxxig-amd64-ubuntu-6.26.0.tar.gz" + echo "Example: $0 amd64 6.26.0 xxxig-amd64-linux-static-6.26.0.tar.gz" exit 1 fi diff --git a/docker/Dockerfile.alpine b/docker/Dockerfile similarity index 100% rename from docker/Dockerfile.alpine rename to docker/Dockerfile diff --git a/docker/Dockerfile.ubuntu b/docker/Dockerfile.ubuntu deleted file mode 100644 index 2f67dd2..0000000 --- a/docker/Dockerfile.ubuntu +++ /dev/null @@ -1,86 +0,0 @@ -FROM ubuntu:20.04 AS base - -ARG TARGETARCH -ARG BUILDPLATFORM - -ENV DEBIAN_FRONTEND=noninteractive - -# 根据目标架构安装相应的交叉编译工具链 -RUN apt-get update && apt-get install -y \ - git \ - wget \ - build-essential \ - cmake \ - libuv1-dev \ - libssl-dev \ - libhwloc-dev \ - && if [ "$TARGETARCH" = "arm64" ] && [ "$BUILDPLATFORM" != "linux/arm64" ]; then \ - apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu; \ - elif [ "$TARGETARCH" = "arm" ] && [ "$BUILDPLATFORM" != "linux/arm/v7" ]; then \ - apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf; \ - fi \ - && rm -rf /var/lib/apt/lists/* - -FROM base AS build - -ARG TARGZ_FILE -ARG TARGET_ARCH -ARG XXXIG_VERSION -ARG TARGETARCH -ARG BUILDPLATFORM -ARG TARGETPLATFORM - -RUN git clone --recursive https://github.com/wangdefaa/xxxig.git && \ - cd xxxig && \ - git checkout ${XXXIG_VERSION} - -WORKDIR /xxxig - -# 根据目标架构设置编译环境和参数 -RUN mkdir build && cd scripts && chmod +x ./*.sh && \ - if [ "$BUILDPLATFORM" != "$TARGETPLATFORM" ]; then \ - MAKE_JOBS="-j2"; \ - else \ - MAKE_JOBS="-j$(nproc)"; \ - fi && \ - echo "Building with parallel jobs: $MAKE_JOBS (cross-compile: $([ "$BUILDPLATFORM" != "$TARGETPLATFORM" ] && echo yes || echo no))" && \ - ./build_deps.sh $MAKE_JOBS && cd ../build && \ - if [ "$TARGETARCH" = "arm64" ] && [ "$BUILDPLATFORM" != "linux/arm64" ]; then \ - export CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++; \ - cmake .. -DWITH_CC_CLIENT=ON \ - -DWITH_CC_SERVER=ON \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \ - -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \ - -DARM_TARGET=8 \ - -DXMRIG_DEPS=scripts/deps \ - -DWITH_ZLIB=ON; \ - elif [ "$TARGETARCH" = "arm" ] && [ "$BUILDPLATFORM" != "linux/arm/v7" ]; then \ - export CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++; \ - cmake .. -DWITH_CC_CLIENT=ON \ - -DWITH_CC_SERVER=ON \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \ - -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ \ - -DARM_TARGET=7 \ - -DXMRIG_DEPS=scripts/deps \ - -DWITH_ZLIB=ON; \ - else \ - cmake .. -DWITH_CC_CLIENT=ON \ - -DWITH_CC_SERVER=ON \ - -DCMAKE_BUILD_TYPE=Release \ - -DXMRIG_DEPS=scripts/deps \ - -DWITH_ZLIB=ON; \ - fi && \ - make $MAKE_JOBS - -FROM scratch - -ARG TARGETARCH - -COPY --from=build /xxxig/build/xxxigDaemon /linux_${TARGETARCH}/xxxigDaemon -COPY --from=build /xxxig/build/xxxig /linux_${TARGETARCH}/xxxig -COPY --from=build /xxxig/build/xxxigServer /linux_${TARGETARCH}/xxxigServer -COPY --from=build /xxxig/src/config_cc.json /linux_${TARGETARCH}/config_cc.json -COPY --from=build /xxxig/src/config.json /linux_${TARGETARCH}/config.json -COPY --from=build /xxxig/index.html /linux_${TARGETARCH}/index.html diff --git a/script/README.md b/script/README.md index 7026b47..60bf99c 100644 --- a/script/README.md +++ b/script/README.md @@ -235,7 +235,7 @@ xxxigDaemon -c /etc/xxxig/config.json curl -I https://gitea.bcde.io # 手动下载测试 -curl -O https://gitea.bcde.io/api/packages/wangdefa/generic/xxxig/6.26.0/xxxig-amd64-ubuntu-6.26.0.tar.gz +curl -O https://gitea.bcde.io/api/packages/wangdefa/generic/xxxig/6.26.0/xxxig-amd64-linux-static-6.26.0.tar.gz ``` **问题: 服务无法启动** diff --git a/script/install.sh b/script/install.sh index 5747a75..bb440a9 100644 --- a/script/install.sh +++ b/script/install.sh @@ -323,7 +323,8 @@ main() { [[ "$version" == "latest" ]] && version=$(get_gitea_latest_version) local pkg_version="${version#v}" # registry 包版本为数字,去掉可能的 v 前缀 - download_url="https://${GITEA_SERVER}/api/packages/${GITEA_OWNER}/generic/${PACKAGE_NAME}/${pkg_version}/${PACKAGE_NAME}-$(get_arch)-$os_type-${pkg_version}.tar.gz" + # 产物统一为 musl 全静态(linux-static),不再区分 distro;os_type 仅用于下方服务管理(OpenRC/systemd) + download_url="https://${GITEA_SERVER}/api/packages/${GITEA_OWNER}/generic/${PACKAGE_NAME}/${pkg_version}/${PACKAGE_NAME}-$(get_arch)-linux-static-${pkg_version}.tar.gz" log "$BLUE" "配置信息:" echo " 版本: $version"