#!/bin/bash # 多平台构建脚本 # 用法: ./scripts/build.sh [版本号] [平台] set -e # 默认值 VERSION=${1:-"v1.1.0"} PLATFORM=${2:-"all"} # 配置 APP_NAME="wormhole-server" BUILD_TIME=$(date -u '+%Y-%m-%d_%H:%M:%S') GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 支持的平台列表 SUPPORTED_PLATFORMS=( "linux-amd64:linux:amd64:" "linux-arm64:linux:arm64:" "linux-386:linux:386:" "linux-arm:linux:arm:" "darwin-amd64:darwin:amd64:" "darwin-arm64:darwin:arm64:" "windows-amd64:windows:amd64:.exe" "windows-386:windows:386:.exe" "windows-arm64:windows:arm64:.exe" "freebsd-amd64:freebsd:amd64:" "freebsd-arm64:freebsd:arm64:" ) # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 获取平台信息 get_platform_info() { local platform=$1 for entry in "${SUPPORTED_PLATFORMS[@]}"; do IFS=':' read -ra parts <<< "$entry" if [[ "${parts[0]}" == "$platform" ]]; then echo "${parts[1]} ${parts[2]} ${parts[3]}" return 0 fi done return 1 } # 显示帮助信息 show_help() { echo "多平台构建脚本 - Wormhole Server" echo "" echo "用法:" echo " $0 [版本号] [平台]" echo "" echo "参数:" echo " 版本号 构建版本 (默认: v1.1.0)" echo " 平台 目标平台 (默认: all)" echo "" echo "支持的平台:" for entry in "${SUPPORTED_PLATFORMS[@]}"; do IFS=':' read -ra parts <<< "$entry" echo " ${parts[0]} - ${parts[1]} ${parts[2]}" done echo " all - 构建所有平台" echo "" echo "示例:" echo " $0 # 构建所有平台,版本 v1.1.0" echo " $0 v1.2.0 # 构建所有平台,版本 v1.2.0" echo " $0 v1.2.0 linux-amd64 # 构建 Linux AMD64 版本" echo " $0 v1.2.0 darwin-arm64 # 构建 macOS ARM64 版本" } # 检查依赖 check_dependencies() { log_info "检查构建依赖..." if ! command -v go &> /dev/null; then log_error "Go 未安装或不在 PATH 中" exit 1 fi GO_VERSION=$(go version | cut -d' ' -f3) log_info "Go 版本: $GO_VERSION" if ! command -v git &> /dev/null; then log_warn "Git 未安装,将使用默认提交哈希" fi } # 构建单个平台 build_platform() { local platform=$1 local platform_info=$(get_platform_info "$platform") if [[ $? -ne 0 ]]; then log_error "不支持的平台: $platform" return 1 fi IFS=' ' read -ra parts <<< "$platform_info" local goos=${parts[0]} local goarch=${parts[1]} local ext=${parts[2]:-""} local binary_name="${APP_NAME}-${VERSION}-${platform}${ext}" local output_path="dist/${binary_name}" log_info "构建 ${platform} (${goos}/${goarch})..." # 创建输出目录 mkdir -p dist # 设置环境变量并构建 GOOS=$goos GOARCH=$goarch go build \ -ldflags "-X main.version=${VERSION} -X main.buildTime=${BUILD_TIME} -X main.gitCommit=${GIT_COMMIT} -s -w" \ -o "$output_path" \ cmd/wormhole-server/main.go if [[ $? -eq 0 ]]; then local size=$(du -h "$output_path" | cut -f1) log_success "构建完成: $output_path ($size)" return 0 else log_error "构建失败: $platform" return 1 fi } # 构建所有平台 build_all() { log_info "开始构建所有平台..." local success_count=0 local total_count=${#SUPPORTED_PLATFORMS[@]} for entry in "${SUPPORTED_PLATFORMS[@]}"; do IFS=':' read -ra parts <<< "$entry" local platform=${parts[0]} if build_platform "$platform"; then ((success_count++)) fi echo "" done log_info "构建统计: $success_count/$total_count 成功" if [[ $success_count -eq $total_count ]]; then log_success "所有平台构建成功!" return 0 else log_warn "部分平台构建失败" return 1 fi } # 创建发布包 create_release_packages() { log_info "创建发布包..." cd dist for file in ${APP_NAME}-${VERSION}-*; do if [[ -f "$file" ]]; then if [[ "$file" == *.exe ]]; then # Windows 平台使用 zip platform=$(echo "$file" | sed "s/${APP_NAME}-${VERSION}-//; s/.exe$//") if command -v zip &> /dev/null; then zip -q "${APP_NAME}-${VERSION}-${platform}.zip" "$file" ../configs/server.yaml ../README.md log_success "创建包: ${APP_NAME}-${VERSION}-${platform}.zip" else log_warn "zip 命令未找到,跳过 Windows 包创建" fi else # 其他平台使用 tar.gz platform=$(echo "$file" | sed "s/${APP_NAME}-${VERSION}-//") tar -czf "${APP_NAME}-${VERSION}-${platform}.tar.gz" "$file" -C .. configs/server.yaml README.md log_success "创建包: ${APP_NAME}-${VERSION}-${platform}.tar.gz" fi fi done # 创建校验和文件 if ls ${APP_NAME}-${VERSION}-*.{tar.gz,zip} 1> /dev/null 2>&1; then sha256sum ${APP_NAME}-${VERSION}-*.{tar.gz,zip} 2>/dev/null > ${APP_NAME}-${VERSION}-checksums.txt || \ shasum -a 256 ${APP_NAME}-${VERSION}-*.{tar.gz,zip} > ${APP_NAME}-${VERSION}-checksums.txt log_success "创建校验和文件: ${APP_NAME}-${VERSION}-checksums.txt" fi cd .. } # 显示构建结果 show_results() { log_info "构建结果:" if [[ -d "dist" ]]; then echo "" ls -lh dist/ | grep -E "(${APP_NAME}|总计|total)" echo "" log_info "要运行本地版本,使用:" if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then echo " .\\dist\\${APP_NAME}-${VERSION}-windows-amd64.exe -config configs\\server.yaml" elif [[ "$OSTYPE" == "darwin"* ]]; then if [[ $(uname -m) == "arm64" ]]; then echo " ./dist/${APP_NAME}-${VERSION}-darwin-arm64 -config configs/server.yaml" else echo " ./dist/${APP_NAME}-${VERSION}-darwin-amd64 -config configs/server.yaml" fi else echo " ./dist/${APP_NAME}-${VERSION}-linux-amd64 -config configs/server.yaml" fi fi } # 主函数 main() { echo "==============================================" echo " Wormhole Server 多平台构建脚本" echo "==============================================" echo "" # 处理帮助参数 if [[ "$1" == "-h" || "$1" == "--help" ]]; then show_help exit 0 fi log_info "构建版本: $VERSION" log_info "目标平台: $PLATFORM" log_info "构建时间: $BUILD_TIME" log_info "Git 提交: $GIT_COMMIT" echo "" # 检查依赖 check_dependencies echo "" # 下载依赖 log_info "下载 Go 模块依赖..." go mod download go mod tidy echo "" # 执行构建 local build_success=false if [[ "$PLATFORM" == "all" ]]; then if build_all; then build_success=true fi else if build_platform "$PLATFORM"; then build_success=true fi fi # 创建发布包 (仅在构建成功时) if [[ "$build_success" == true && "$PLATFORM" == "all" ]]; then echo "" create_release_packages fi echo "" show_results if [[ "$build_success" == true ]]; then log_success "构建完成!" exit 0 else log_error "构建失败!" exit 1 fi } # 运行主函数 main "$@"