You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

298 lines
7.9 KiB

#!/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 "$@"