统一 musl 全静态构建,规范 Dockerfile 与产物命名
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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/ 安装/卸载脚本 + 详细文档
|
||||
```
|
||||
|
||||
Vendored
+1
-1
@@ -4,7 +4,7 @@ set -e
|
||||
# 参数检查
|
||||
if [ $# -ne 3 ]; then
|
||||
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
|
||||
fi
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
```
|
||||
|
||||
**问题: 服务无法启动**
|
||||
|
||||
+2
-1
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user