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
298 lines
7.9 KiB
5 days ago
|
#!/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 "$@"
|