diff --git a/.docker/compose/docker-compose.cluster.yaml b/.docker/compose/docker-compose.cluster.yaml index 135997c8..0613dee2 100644 --- a/.docker/compose/docker-compose.cluster.yaml +++ b/.docker/compose/docker-compose.cluster.yaml @@ -27,7 +27,7 @@ services: ports: - "9000:9000" # Map port 9001 of the host to port 9000 of the container volumes: - - ../../target/x86_64-unknown-linux-musl/release/rustfs:/app/rustfs + - ../../target/x86_64-unknown-linux-gnu/release/rustfs:/app/rustfs command: "/app/rustfs" node1: @@ -44,7 +44,7 @@ services: ports: - "9001:9000" # Map port 9002 of the host to port 9000 of the container volumes: - - ../../target/x86_64-unknown-linux-musl/release/rustfs:/app/rustfs + - ../../target/x86_64-unknown-linux-gnu/release/rustfs:/app/rustfs command: "/app/rustfs" node2: @@ -61,7 +61,7 @@ services: ports: - "9002:9000" # Map port 9003 of the host to port 9000 of the container volumes: - - ../../target/x86_64-unknown-linux-musl/release/rustfs:/app/rustfs + - ../../target/x86_64-unknown-linux-gnu/release/rustfs:/app/rustfs command: "/app/rustfs" node3: @@ -78,5 +78,5 @@ services: ports: - "9003:9000" # Map port 9004 of the host to port 9000 of the container volumes: - - ../../target/x86_64-unknown-linux-musl/release/rustfs:/app/rustfs + - ../../target/x86_64-unknown-linux-gnu/release/rustfs:/app/rustfs command: "/app/rustfs" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1884314e..3d29792e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,8 +28,8 @@ name: Build and Release on: push: - tags: [ "*.*.*" ] - branches: [ main ] + tags: ["*.*.*"] + branches: [main] paths-ignore: - "**.md" - "**.txt" @@ -45,7 +45,7 @@ on: - ".gitignore" - ".dockerignore" pull_request: - branches: [ main ] + branches: [main] paths-ignore: - "**.md" - "**.txt" @@ -153,7 +153,7 @@ jobs: # Build RustFS binaries build-rustfs: name: Build RustFS - needs: [ build-check ] + needs: [build-check] if: needs.build-check.outputs.should_build == 'true' runs-on: ${{ matrix.os }} timeout-minutes: 60 @@ -172,14 +172,14 @@ jobs: target: aarch64-unknown-linux-musl cross: true platform: linux - #- os: ubuntu-latest - # target: x86_64-unknown-linux-gnu - # cross: false - # platform: linux - #- os: ubuntu-latest - # target: aarch64-unknown-linux-gnu - # cross: true - # platform: linux + - os: ubuntu-latest + target: x86_64-unknown-linux-gnu + cross: false + platform: linux + - os: ubuntu-latest + target: aarch64-unknown-linux-gnu + cross: true + platform: linux # macOS builds - os: macos-latest target: aarch64-apple-darwin @@ -270,30 +270,55 @@ jobs: # Extract platform and arch from target TARGET="${{ matrix.target }}" PLATFORM="${{ matrix.platform }}" - - # Map target to architecture + # Map target to architecture and variant case "$TARGET" in + *x86_64*musl*) + ARCH="x86_64" + VARIANT="musl" + ;; + *x86_64*gnu*) + ARCH="x86_64" + VARIANT="gnu" + ;; *x86_64*) ARCH="x86_64" + VARIANT="" + ;; + *aarch64*musl*|*arm64*musl*) + ARCH="aarch64" + VARIANT="musl" + ;; + *aarch64*gnu*|*arm64*gnu*) + ARCH="aarch64" + VARIANT="gnu" ;; *aarch64*|*arm64*) ARCH="aarch64" + VARIANT="" ;; *armv7*) ARCH="armv7" + VARIANT="" ;; *) ARCH="unknown" + VARIANT="" ;; esac # Generate package name based on build type - if [[ "$BUILD_TYPE" == "development" ]]; then - # Development build: rustfs-${platform}-${arch}-dev-${short_sha}.zip - PACKAGE_NAME="rustfs-${PLATFORM}-${ARCH}-dev-${SHORT_SHA}" + if [[ -n "$VARIANT" ]]; then + ARCH_WITH_VARIANT="${ARCH}-${VARIANT}" else - # Release/Prerelease build: rustfs-${platform}-${arch}-v${version}.zip - PACKAGE_NAME="rustfs-${PLATFORM}-${ARCH}-v${VERSION}" + ARCH_WITH_VARIANT="${ARCH}" + fi + + if [[ "$BUILD_TYPE" == "development" ]]; then + # Development build: rustfs-${platform}-${arch}-${variant}-dev-${short_sha}.zip + PACKAGE_NAME="rustfs-${PLATFORM}-${ARCH_WITH_VARIANT}-dev-${SHORT_SHA}" + else + # Release/Prerelease build: rustfs-${platform}-${arch}-${variant}-v${version}.zip + PACKAGE_NAME="rustfs-${PLATFORM}-${ARCH_WITH_VARIANT}-v${VERSION}" fi # Create zip packages for all platforms @@ -303,7 +328,7 @@ jobs: sudo apt-get update && sudo apt-get install -y zip fi fi - + cd target/${{ matrix.target }}/release # Determine the binary name based on platform if [[ "${{ matrix.platform }}" == "windows" ]]; then @@ -311,7 +336,7 @@ jobs: else BINARY_NAME="rustfs" fi - + # Verify the binary exists before packaging if [[ ! -f "$BINARY_NAME" ]]; then echo "❌ Binary $BINARY_NAME not found in $(pwd)" @@ -322,24 +347,29 @@ jobs: fi exit 1 fi - - # 通用打包函数 + + # Universal packaging function package_zip() { local src=$1 local dst=$2 - if command -v zip &> /dev/null; then + if [[ "${{ matrix.platform }}" == "windows" ]]; then + # Windows uses PowerShell Compress-Archive + powershell -Command "Compress-Archive -Path '$src' -DestinationPath '$dst' -Force" + elif command -v zip &> /dev/null; then + # Unix systems use zip command zip "$dst" "$src" else - powershell -Command "Compress-Archive -Path $src -DestinationPath $dst" + echo "❌ No zip utility available" + exit 1 fi } - + # Create the zip package echo "Start packaging: $BINARY_NAME -> ../../../${PACKAGE_NAME}.zip" package_zip "$BINARY_NAME" "../../../${PACKAGE_NAME}.zip" - + cd ../../.. - + # Verify the package was created if [[ -f "${PACKAGE_NAME}.zip" ]]; then echo "✅ Package created successfully: ${PACKAGE_NAME}.zip" @@ -415,6 +445,16 @@ jobs: chmod +x /usr/local/bin/ossutil OSSUTIL_BIN=ossutil ;; + windows) + OSSUTIL_ZIP="ossutil-${OSSUTIL_VERSION}-windows-amd64.zip" + OSSUTIL_DIR="ossutil-${OSSUTIL_VERSION}-windows-amd64" + + curl -o "$OSSUTIL_ZIP" "https://gosspublic.alicdn.com/ossutil/v2/${OSSUTIL_VERSION}/${OSSUTIL_ZIP}" + unzip "$OSSUTIL_ZIP" + mv "${OSSUTIL_DIR}/ossutil.exe" ./ossutil.exe + rm -rf "$OSSUTIL_DIR" "$OSSUTIL_ZIP" + OSSUTIL_BIN=./ossutil.exe + ;; esac # Determine upload path based on build type @@ -484,7 +524,8 @@ jobs: # Also create a generic main-latest for Docker builds if [[ "${{ matrix.platform }}" == "linux" ]]; then - DOCKER_MAIN_LATEST_FILE="rustfs-linux-${{ matrix.target == 'x86_64-unknown-linux-musl' && 'x86_64' || 'aarch64' }}-main-latest.zip" + # Use the same ARCH_WITH_VARIANT logic for Docker files + DOCKER_MAIN_LATEST_FILE="rustfs-linux-${ARCH_WITH_VARIANT}-main-latest.zip" cp "${{ steps.package.outputs.package_file }}" "$DOCKER_MAIN_LATEST_FILE" $OSSUTIL_BIN cp "$DOCKER_MAIN_LATEST_FILE" "$OSS_PATH" --force @@ -498,7 +539,7 @@ jobs: # Build summary build-summary: name: Build Summary - needs: [ build-check, build-rustfs ] + needs: [build-check, build-rustfs] if: always() && needs.build-check.outputs.should_build == 'true' runs-on: ubuntu-latest steps: @@ -550,7 +591,7 @@ jobs: # Create GitHub Release (only for tag pushes) create-release: name: Create GitHub Release - needs: [ build-check, build-rustfs ] + needs: [build-check, build-rustfs] if: startsWith(github.ref, 'refs/tags/') && needs.build-check.outputs.build_type != 'development' runs-on: ubuntu-latest permissions: @@ -636,7 +677,7 @@ jobs: # Prepare and upload release assets upload-release-assets: name: Upload Release Assets - needs: [ build-check, build-rustfs, create-release ] + needs: [build-check, build-rustfs, create-release] if: startsWith(github.ref, 'refs/tags/') && needs.build-check.outputs.build_type != 'development' runs-on: ubuntu-latest permissions: @@ -717,7 +758,7 @@ jobs: # Update latest.json for stable releases only update-latest-version: name: Update Latest Version - needs: [ build-check, upload-release-assets ] + needs: [build-check, upload-release-assets] if: startsWith(github.ref, 'refs/tags/') runs-on: ubuntu-latest steps: @@ -767,7 +808,7 @@ jobs: # Publish release (remove draft status) publish-release: name: Publish Release - needs: [ build-check, create-release, upload-release-assets ] + needs: [build-check, create-release, upload-release-assets] if: startsWith(github.ref, 'refs/tags/') && needs.build-check.outputs.build_type != 'development' runs-on: ubuntu-latest permissions: diff --git a/Dockerfile b/Dockerfile index 3ba1ac67..e212a7a6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,12 +13,18 @@ RUN apk add --no-cache ca-certificates curl unzip # Create build directory WORKDIR /build -# Detect architecture and download corresponding binary -RUN case "${TARGETARCH}" in \ - amd64) ARCH="x86_64" ;; \ - arm64) ARCH="aarch64" ;; \ - *) echo "Unsupported architecture: ${TARGETARCH}" >&2 && exit 1 ;; \ - esac && \ +# Set architecture-specific variables +RUN if [ "$TARGETARCH" = "amd64" ]; then \ + echo "x86_64-gnu" > /tmp/arch; \ + elif [ "$TARGETARCH" = "arm64" ]; then \ + echo "aarch64-gnu" > /tmp/arch; \ + else \ + echo "unsupported" > /tmp/arch; \ + fi +RUN ARCH=$(cat /tmp/arch) && \ + if [ "$ARCH" = "unsupported" ]; then \ + echo "Unsupported architecture: $TARGETARCH" && exit 1; \ + fi && \ if [ "${RELEASE}" = "latest" ]; then \ VERSION="latest"; \ else \ diff --git a/Makefile b/Makefile index f4fd9d79..6f8eb6cd 100644 --- a/Makefile +++ b/Makefile @@ -90,6 +90,18 @@ build-gnu: @echo "💡 On macOS/Windows, use 'make build-docker' or 'make docker-dev' instead" ./build-rustfs.sh --platform x86_64-unknown-linux-gnu +.PHONY: build-musl-arm64 +build-musl-arm64: + @echo "🔨 Building rustfs for aarch64-unknown-linux-musl..." + @echo "💡 On macOS/Windows, use 'make build-docker' or 'make docker-dev' instead" + ./build-rustfs.sh --platform aarch64-unknown-linux-musl + +.PHONY: build-gnu-arm64 +build-gnu-arm64: + @echo "🔨 Building rustfs for aarch64-unknown-linux-gnu..." + @echo "💡 On macOS/Windows, use 'make build-docker' or 'make docker-dev' instead" + ./build-rustfs.sh --platform aarch64-unknown-linux-gnu + .PHONY: deploy-dev deploy-dev: build-musl @echo "🚀 Deploying to dev server: $${IP}" @@ -248,10 +260,14 @@ build-cross-all: @echo "💡 On macOS/Windows, use 'make docker-dev' for reliable multi-arch builds" @echo "🔨 Generating protobuf code..." cargo run --bin gproto || true - @echo "🔨 Building x86_64-unknown-linux-musl..." - ./build-rustfs.sh --platform x86_64-unknown-linux-musl + @echo "🔨 Building x86_64-unknown-linux-gnu..." + ./build-rustfs.sh --platform x86_64-unknown-linux-gnu @echo "🔨 Building aarch64-unknown-linux-gnu..." ./build-rustfs.sh --platform aarch64-unknown-linux-gnu + @echo "🔨 Building x86_64-unknown-linux-musl..." + ./build-rustfs.sh --platform x86_64-unknown-linux-musl + @echo "🔨 Building aarch64-unknown-linux-musl..." + ./build-rustfs.sh --platform aarch64-unknown-linux-musl @echo "✅ All architectures built successfully!" # ======================================================================================== @@ -265,8 +281,10 @@ help-build: @echo "🚀 本地构建 (推荐使用):" @echo " make build # 构建 RustFS 二进制文件 (默认包含 console)" @echo " make build-dev # 开发模式构建" - @echo " make build-musl # 构建 musl 版本" - @echo " make build-gnu # 构建 GNU 版本" + @echo " make build-musl # 构建 x86_64 musl 版本" + @echo " make build-gnu # 构建 x86_64 GNU 版本" + @echo " make build-musl-arm64 # 构建 aarch64 musl 版本" + @echo " make build-gnu-arm64 # 构建 aarch64 GNU 版本" @echo "" @echo "🐳 Docker 构建:" @echo " make build-docker # 使用 Docker 容器构建" @@ -281,7 +299,7 @@ help-build: @echo " ./build-rustfs.sh --force-console-update # 强制更新 console 资源" @echo " ./build-rustfs.sh --dev # 开发模式构建" @echo " ./build-rustfs.sh --sign # 签名二进制文件" - @echo " ./build-rustfs.sh --platform x86_64-unknown-linux-musl # 指定目标平台" + @echo " ./build-rustfs.sh --platform x86_64-unknown-linux-gnu # 指定目标平台" @echo " ./build-rustfs.sh --skip-verification # 跳过二进制验证" @echo "" @echo "💡 build-rustfs.sh 脚本提供了更多选项、智能检测和二进制验证功能" diff --git a/build-rustfs.sh b/build-rustfs.sh index 2e23aa4e..0a024449 100755 --- a/build-rustfs.sh +++ b/build-rustfs.sh @@ -21,13 +21,14 @@ detect_platform() { "linux") case "$arch" in "x86_64") - echo "x86_64-unknown-linux-musl" + # Default to GNU for better compatibility + echo "x86_64-unknown-linux-gnu" ;; "aarch64"|"arm64") - echo "aarch64-unknown-linux-musl" + echo "aarch64-unknown-linux-gnu" ;; "armv7l") - echo "armv7-unknown-linux-musleabihf" + echo "armv7-unknown-linux-gnueabihf" ;; *) echo "unknown-platform" @@ -119,6 +120,17 @@ usage() { echo " -o, --output-dir DIR Output directory (default: target/release)" echo " -b, --binary-name NAME Binary name (default: rustfs)" echo " -p, --platform TARGET Target platform (default: auto-detect)" + echo " Supported platforms:" + echo " x86_64-unknown-linux-gnu" + echo " aarch64-unknown-linux-gnu" + echo " armv7-unknown-linux-gnueabihf" + echo " x86_64-unknown-linux-musl" + echo " aarch64-unknown-linux-musl" + echo " armv7-unknown-linux-musleabihf" + echo " x86_64-apple-darwin" + echo " aarch64-apple-darwin" + echo " x86_64-pc-windows-msvc" + echo " aarch64-pc-windows-msvc" echo " --dev Build in dev mode" echo " --sign Sign binaries after build" echo " --with-console Download console static assets (default)" diff --git a/scripts/dev_deploy.sh b/scripts/dev_deploy.sh index c8d74625..617e1660 100755 --- a/scripts/dev_deploy.sh +++ b/scripts/dev_deploy.sh @@ -16,12 +16,12 @@ # 脚本名称:scp_to_servers.sh -rm ./target/x86_64-unknown-linux-musl/release/rustfs.zip -# 压缩./target/x86_64-unknown-linux-musl/release/rustfs -zip -j ./target/x86_64-unknown-linux-musl/release/rustfs.zip ./target/x86_64-unknown-linux-musl/release/rustfs +rm ./target/x86_64-unknown-linux-gnu/release/rustfs.zip +# 压缩./target/x86_64-unknown-linux-gnu/release/rustfs +zip -j ./target/x86_64-unknown-linux-gnu/release/rustfs.zip ./target/x86_64-unknown-linux-gnu/release/rustfs -# 本地文件路径 -LOCAL_FILE="./target/x86_64-unknown-linux-musl/release/rustfs.zip" +# 上传到服务器 +LOCAL_FILE="./target/x86_64-unknown-linux-gnu/release/rustfs.zip" REMOTE_PATH="~" # 必须传入IP参数,否则报错退出 diff --git a/scripts/setup-test-binaries.sh b/scripts/setup-test-binaries.sh index 38d281bc..f3f01662 100755 --- a/scripts/setup-test-binaries.sh +++ b/scripts/setup-test-binaries.sh @@ -8,7 +8,7 @@ set -e echo "Setting up test binaries for Docker build..." # Create temporary rustfs binary -./build-rustfs.sh -p x86_64-unknown-linux-musl +./build-rustfs.sh -p x86_64-unknown-linux-gnu # Create test directory structure mkdir -p test-releases/server/rustfs/release/linux-amd64/archive @@ -18,16 +18,16 @@ mkdir -p test-releases/server/rustfs/release/linux-arm64/archive VERSION=$(git describe --abbrev=0 --tags 2>/dev/null || git rev-parse --short HEAD) # Copy binaries -cp target/release/x86_64-unknown-linux-musl/rustfs test-releases/server/rustfs/release/linux-amd64/archive/rustfs.${VERSION} -cp target/release/x86_64-unknown-linux-musl/rustfs.sha256sum test-releases/server/rustfs/release/linux-amd64/archive/rustfs.${VERSION}.sha256sum +cp target/x86_64-unknown-linux-gnu/release/rustfs test-releases/server/rustfs/release/linux-amd64/archive/rustfs.${VERSION} +cp target/x86_64-unknown-linux-gnu/release/rustfs.sha256sum test-releases/server/rustfs/release/linux-amd64/archive/rustfs.${VERSION}.sha256sum # Create dummy signatures echo "dummy signature" > test-releases/server/rustfs/release/linux-amd64/archive/rustfs.${VERSION}.minisig echo "dummy signature" > test-releases/server/rustfs/release/linux-arm64/archive/rustfs.${VERSION}.minisig # Also copy for arm64 (using same binary for testing) -cp target/release/x86_64-unknown-linux-musl/rustfs test-releases/server/rustfs/release/linux-arm64/archive/rustfs.${VERSION} -cp target/release/x86_64-unknown-linux-musl/rustfs.sha256sum test-releases/server/rustfs/release/linux-arm64/archive/rustfs.${VERSION}.sha256sum +cp target/aarch64-unknown-linux-gnu/release/rustfs test-releases/server/rustfs/release/linux-arm64/archive/rustfs.${VERSION} +cp target/aarch64-unknown-linux-gnu/release/rustfs.sha256sum test-releases/server/rustfs/release/linux-arm64/archive/rustfs.${VERSION}.sha256sum echo "Test binaries created for version: ${VERSION}" echo "You can now test Docker builds with these local binaries"