统一 musl 全静态构建,规范 Dockerfile 与产物命名
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

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 10:12:08 +08:00
co-authored by Claude Opus 4.8
parent 69a9404a97
commit 491c9e0bc3
8 changed files with 21 additions and 107 deletions
+5 -7
View File
@@ -18,7 +18,6 @@ jobs:
strategy: strategy:
matrix: matrix:
arch: [amd64, arm64] arch: [amd64, arm64]
distro: [ubuntu, alpine]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -39,7 +38,7 @@ jobs:
PLATFORM="linux/${{ matrix.arch }}" PLATFORM="linux/${{ matrix.arch }}"
echo "🏗️ Building ${PLATFORM} on native ${{ matrix.arch }} runner" echo "🏗️ Building ${PLATFORM} on native ${{ matrix.arch }} runner"
echo "📦 Distribution: ${{ matrix.distro }}" echo "📦 Build: musl 全静态 (docker/Dockerfile, 基于 alpine)"
# 设置 BuildKit 优化参数 # 设置 BuildKit 优化参数
export BUILDKIT_PROGRESS=plain export BUILDKIT_PROGRESS=plain
@@ -48,7 +47,7 @@ jobs:
--platform ${PLATFORM} \ --platform ${PLATFORM} \
--build-arg XXXIG_VERSION=${XXXIG_VERSION} \ --build-arg XXXIG_VERSION=${XXXIG_VERSION} \
--output type=local,dest=./output \ --output type=local,dest=./output \
-f docker/Dockerfile.${{ matrix.distro }} . -f docker/Dockerfile .
- name: Package and test - name: Package and test
run: | run: |
@@ -59,7 +58,7 @@ jobs:
exit 1 exit 1
fi 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" . tar -czf "${TARGZ}" -C "$DIR" .
echo "📦 Created package: ${TARGZ}" echo "📦 Created package: ${TARGZ}"
@@ -71,12 +70,11 @@ jobs:
rm -rf test rm -rf test
- name: Build Debian package - name: Build Debian package
if: matrix.distro == 'ubuntu'
run: | run: |
# 安装 dpkg-deb(如果需要) # 安装 dpkg-deb(如果需要)
sudo apt-get update && sudo apt-get install -y dpkg-dev 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 }}..." echo "📦 Building Debian package for ${{ matrix.arch }}..."
chmod +x debian/build-deb.sh chmod +x debian/build-deb.sh
@@ -86,7 +84,7 @@ jobs:
- uses: https://github.com/ChristopherHX/gitea-upload-artifact@v4 - uses: https://github.com/ChristopherHX/gitea-upload-artifact@v4
with: with:
name: binaries-${{ matrix.arch }}-${{ matrix.distro }} name: binaries-${{ matrix.arch }}
path: | path: |
*.tar.gz *.tar.gz
*.deb *.deb
+6 -5
View File
@@ -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 流水线: [.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 Registrystable/main),并创建 Gitea Release。 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 带 `v`CI 用 `XXXIG_VERSION=v${PACKAGE_VERSION}` 检出 `v6.26.0`),而 tar.gz/deb/registry 路径等包版本一律用数字;release job 用 `VERSION="${TAG#v}"` 归一,install 脚本下载时同样 `${version#v}` - 版本号**硬编码**在 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` - 架构名映射:`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 \ docker buildx build --platform linux/amd64 \
--build-arg XXXIG_VERSION=v6.26.0 \ --build-arg XXXIG_VERSION=v6.26.0 \
--output type=local,dest=./output \ --output type=local,dest=./output \
-f docker/Dockerfile.ubuntu . -f docker/Dockerfile .
# 用已有 tar.gz 打 .deb 包 # 用已有 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) # 改 shell 脚本后做静态检查(仓库未配置,需自行安装 shellcheck)
shellcheck script/*.sh debian/*.sh shellcheck script/*.sh debian/*.sh
+6 -6
View File
@@ -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 连接中心服务器;安装后作为主服务运行 | | `xxxigDaemon` | 守护进程,控制矿机并通过 cc-client 连接中心服务器;安装后作为主服务运行 |
| `xxxigServer` | 中心控制服务器,带 Web UI | | `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) CI 定义于 [.gitea/workflows/ci.yaml](.gitea/workflows/ci.yaml)
- **push 到 `main`/`develop`**:矩阵 `arch=[amd64,arm64] × distro=[ubuntu,alpine]`,在原生 runner 上用 Docker 编译为 tar.gzubuntu 再`.deb` - **push 到 `main`/`develop`**:矩阵 `arch=[amd64,arm64]`,在原生 runner 上用 Dockermusl 全静态)编译为 tar.gz`.deb`
- **打 tag**:产物上传到 Generic / Debian 包仓库并创建 Release。 - **打 tag**:产物上传到 Generic / Debian 包仓库并创建 Release。
本地构建: 本地构建:
@@ -58,10 +58,10 @@ CI 定义于 [.gitea/workflows/ci.yaml](.gitea/workflows/ci.yaml)
docker buildx build --platform linux/amd64 \ docker buildx build --platform linux/amd64 \
--build-arg XXXIG_VERSION=v6.26.0 \ --build-arg XXXIG_VERSION=v6.26.0 \
--output type=local,dest=./output \ --output type=local,dest=./output \
-f docker/Dockerfile.ubuntu . -f docker/Dockerfile .
# 用产物 tar.gz 打 .deb # 用产物 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 流水线 .gitea/workflows/ CI 流水线
docker/ 各发行版 Dockerfile(从上游源码编译) docker/ Dockerfilemusl 全静态,从上游源码编译)
debian/ .deb 打包:control 模板、维护脚本、systemd 服务 debian/ .deb 打包:control 模板、维护脚本、systemd 服务
script/ 安装/卸载脚本 + 详细文档 script/ 安装/卸载脚本 + 详细文档
``` ```
+1 -1
View File
@@ -4,7 +4,7 @@ set -e
# 参数检查 # 参数检查
if [ $# -ne 3 ]; then if [ $# -ne 3 ]; then
echo "Usage: $0 <ARCH> <VERSION> <TARGZ_FILE>" echo "Usage: $0 <ARCH> <VERSION> <TARGZ_FILE>"
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 exit 1
fi fi
-86
View File
@@ -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
+1 -1
View File
@@ -235,7 +235,7 @@ xxxigDaemon -c /etc/xxxig/config.json
curl -I https://gitea.bcde.io 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
``` ```
**问题: 服务无法启动** **问题: 服务无法启动**
+2 -1
View File
@@ -323,7 +323,8 @@ main() {
[[ "$version" == "latest" ]] && version=$(get_gitea_latest_version) [[ "$version" == "latest" ]] && version=$(get_gitea_latest_version)
local pkg_version="${version#v}" # registry 包版本为数字,去掉可能的 v 前缀 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),不再区分 distroos_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" "配置信息:" log "$BLUE" "配置信息:"
echo " 版本: $version" echo " 版本: $version"