#!/bin/bash # dashGO 完整编译脚本 # 用于在 Linux 上编译 Dashboard 和全架构的 Agent # # 前置要求: # - Go >= 1.22 (用于编译 Server 和 Agent) # - Node.js >= 18.0.0 (用于编译前端) # - npm (随 Node.js 安装) # - Docker (可选,用于交叉编译支持 SQLite 的 Server) # # 使用方法: # ./build-all.sh all # 构建所有组件 # ./build-all.sh frontend # 仅构建前端 # RUN_TESTS=true ./build-all.sh # 构建前运行测试 # # 详细文档: # - 前端测试设置: web/TESTING_SETUP.md # - 构建文档: BUILD.md set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 版本信息 VERSION=${VERSION:-"1.0.0"} BUILD_TIME=$(date -u '+%Y-%m-%d_%H:%M:%S') GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") # 输出目录 OUTPUT_DIR="dist" AGENT_OUTPUT_DIR="${OUTPUT_DIR}/agent" SERVER_OUTPUT_DIR="${OUTPUT_DIR}/server" WEB_OUTPUT_DIR="${OUTPUT_DIR}/web" echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}dashGO 完整编译脚本${NC}" echo -e "${GREEN}版本: ${VERSION}${NC}" echo -e "${GREEN}构建时间: ${BUILD_TIME}${NC}" echo -e "${GREEN}Git Commit: ${GIT_COMMIT}${NC}" echo -e "${GREEN}========================================${NC}" # 清理旧的构建文件 clean() { echo -e "${YELLOW}清理旧的构建文件...${NC}" rm -rf ${OUTPUT_DIR} mkdir -p ${AGENT_OUTPUT_DIR} mkdir -p ${SERVER_OUTPUT_DIR} mkdir -p ${WEB_OUTPUT_DIR} echo -e "${GREEN}✓ 清理完成${NC}" } # 构建前端 build_frontend() { echo -e "${YELLOW}开始构建前端...${NC}" # 检查 Node.js 是否安装 if ! command -v node &>/dev/null; then echo -e "${RED}错误: 未安装 Node.js${NC}" echo -e "${YELLOW}请访问 https://nodejs.org/ 安装 Node.js (>= 18.0.0)${NC}" echo -e "${YELLOW}或参考 web/TESTING_SETUP.md 获取详细安装指南${NC}" return 1 fi # 检查 Node.js 版本 NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1) if [ "$NODE_VERSION" -lt 18 ]; then echo -e "${YELLOW}警告: Node.js 版本过低 (当前: $(node -v), 推荐: >= 18.0.0)${NC}" echo -e "${YELLOW}可能会遇到兼容性问题${NC}" fi # 检查并安装依赖 if [ ! -d "web/node_modules" ]; then echo -e "${YELLOW}安装前端依赖...${NC}" cd web npm install || { echo -e "${RED}依赖安装失败${NC}" cd .. return 1 } cd .. echo -e "${GREEN}✓ 依赖安装完成${NC}" else echo -e "${GREEN}✓ 依赖已存在,跳过安装${NC}" fi # 运行类型检查(可选) if [ "${RUN_TYPE_CHECK}" = "true" ]; then echo -e "${YELLOW}运行 TypeScript 类型检查...${NC}" cd web npm run build:check || { echo -e "${YELLOW}警告: 类型检查失败,但继续构建${NC}" } cd .. fi # 运行测试(可选) if [ "${RUN_TESTS}" = "true" ]; then echo -e "${YELLOW}运行前端测试...${NC}" cd web npm run test:run || { echo -e "${YELLOW}警告: 测试失败,但继续构建${NC}" } cd .. fi # 构建前端 echo -e "${YELLOW}构建前端应用...${NC}" cd web npm run build || { echo -e "${RED}前端构建失败${NC}" cd .. return 1 } cd .. # 复制构建产物 if [ -d "web/dist" ]; then cp -r web/dist ${WEB_OUTPUT_DIR}/ echo -e "${GREEN}✓ 前端构建完成${NC}" # 显示构建产物大小 DIST_SIZE=$(du -sh web/dist | cut -f1) echo -e "${GREEN} 构建产物大小: ${DIST_SIZE}${NC}" else echo -e "${RED}错误: 构建产物目录不存在${NC}" return 1 fi } # 使用 Docker 构建 Server (支持交叉编译 + SQLite) build_server_docker() { echo -e "${YELLOW}使用 Docker 构建 Server (支持 SQLite)...${NC}" if ! command -v docker &>/dev/null; then echo -e "${RED}错误: 未安装 Docker${NC}" echo -e "${YELLOW}请使用 'build_server' 函数进行本地编译${NC}" return 1 fi # 构建 Linux amd64 echo -e "${YELLOW}构建 Server (Linux amd64 with SQLite)...${NC}" docker run --rm --platform linux/amd64 \ -v "$PWD":/app -w /app \ golang:1.22-alpine sh -c " apk add --no-cache gcc musl-dev && \ CGO_ENABLED=1 go build -trimpath -ldflags='-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}' \ -o dashgo-server-linux-amd64 ./cmd/server " mv dashgo-server-linux-amd64 ${SERVER_OUTPUT_DIR}/ echo -e "${GREEN}✓ amd64 完成${NC}" # 构建 Linux arm64 echo -e "${YELLOW}构建 Server (Linux arm64 with SQLite)...${NC}" docker run --rm --platform linux/arm64 \ -v "$PWD":/app -w /app \ golang:1.22-alpine sh -c " apk add --no-cache gcc musl-dev && \ CGO_ENABLED=1 go build -trimpath -ldflags='-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}' \ -o dashgo-server-linux-arm64 ./cmd/server " mv dashgo-server-linux-arm64 ${SERVER_OUTPUT_DIR}/ echo -e "${GREEN}✓ arm64 完成${NC}" echo -e "${GREEN}✓ Server 构建完成 (Docker 模式,支持 SQLite)${NC}" } # 构建 Server (Dashboard) - 本地编译 build_server() { echo -e "${YELLOW}开始构建 Server (本地编译)...${NC}" # 检测当前架构 CURRENT_ARCH=$(uname -m) # 构建 Linux amd64 echo -e "${YELLOW}构建 Server (Linux amd64)...${NC}" if [ "$CURRENT_ARCH" = "x86_64" ]; then # 本地架构,启用 CGO 支持 SQLite echo -e "${GREEN} → 启用 CGO (支持 SQLite)${NC}" CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ${SERVER_OUTPUT_DIR}/dashgo-server-linux-amd64 \ ./cmd/server else # 交叉编译,禁用 CGO(仅支持 MySQL) echo -e "${YELLOW} → 交叉编译,禁用 CGO (仅支持 MySQL)${NC}" CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ${SERVER_OUTPUT_DIR}/dashgo-server-linux-amd64 \ ./cmd/server fi # 构建 Linux arm64 echo -e "${YELLOW}构建 Server (Linux arm64)...${NC}" if [ "$CURRENT_ARCH" = "aarch64" ] || [ "$CURRENT_ARCH" = "arm64" ]; then # 本地架构,启用 CGO 支持 SQLite echo -e "${GREEN} → 启用 CGO (支持 SQLite)${NC}" CGO_ENABLED=1 GOOS=linux GOARCH=arm64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ${SERVER_OUTPUT_DIR}/dashgo-server-linux-arm64 \ ./cmd/server else # 交叉编译,禁用 CGO(仅支持 MySQL) echo -e "${YELLOW} → 交叉编译,禁用 CGO (仅支持 MySQL)${NC}" CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ${SERVER_OUTPUT_DIR}/dashgo-server-linux-arm64 \ ./cmd/server fi # 构建 Windows amd64 echo -e "${YELLOW}构建 Server (Windows amd64)...${NC}" CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ${SERVER_OUTPUT_DIR}/dashgo-server-windows-amd64.exe \ ./cmd/server # 构建 macOS amd64 echo -e "${YELLOW}构建 Server (macOS amd64)...${NC}" CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ${SERVER_OUTPUT_DIR}/dashgo-server-darwin-amd64 \ ./cmd/server # 构建 macOS arm64 (Apple Silicon) echo -e "${YELLOW}构建 Server (macOS arm64)...${NC}" CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ${SERVER_OUTPUT_DIR}/dashgo-server-darwin-arm64 \ ./cmd/server echo -e "${GREEN}✓ Server 构建完成${NC}" } # 构建 Agent (全架构) build_agent() { echo -e "${YELLOW}开始构建 Agent (全架构)...${NC}" cd agent # Linux amd64 echo -e "${YELLOW}构建 Agent (Linux amd64)...${NC}" CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ../${AGENT_OUTPUT_DIR}/dashgo-agent-linux-amd64 . # Linux arm64 echo -e "${YELLOW}构建 Agent (Linux arm64)...${NC}" CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ../${AGENT_OUTPUT_DIR}/dashgo-agent-linux-arm64 . # Linux 386 echo -e "${YELLOW}构建 Agent (Linux 386)...${NC}" CGO_ENABLED=0 GOOS=linux GOARCH=386 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ../${AGENT_OUTPUT_DIR}/dashgo-agent-linux-386 . # Windows amd64 echo -e "${YELLOW}构建 Agent (Windows amd64)...${NC}" CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ../${AGENT_OUTPUT_DIR}/dashgo-agent-windows-amd64.exe . # Windows 386 echo -e "${YELLOW}构建 Agent (Windows 386)...${NC}" CGO_ENABLED=0 GOOS=windows GOARCH=386 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ../${AGENT_OUTPUT_DIR}/dashgo-agent-windows-386.exe . # macOS amd64 echo -e "${YELLOW}构建 Agent (macOS amd64)...${NC}" CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ../${AGENT_OUTPUT_DIR}/dashgo-agent-darwin-amd64 . # macOS arm64 (Apple Silicon) echo -e "${YELLOW}构建 Agent (macOS arm64)...${NC}" CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ../${AGENT_OUTPUT_DIR}/dashgo-agent-darwin-arm64 . # FreeBSD amd64 echo -e "${YELLOW}构建 Agent (FreeBSD amd64)...${NC}" CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ../${AGENT_OUTPUT_DIR}/dashgo-agent-freebsd-amd64 . cd .. echo -e "${GREEN}✓ Agent 构建完成${NC}" } # 构建 Alpine 调试版本 Agent build_agent_debug() { echo -e "${YELLOW}开始构建 Alpine 调试版本 Agent...${NC}" cd agent # Linux amd64 调试版本 echo -e "${YELLOW}构建 Agent Debug (Linux amd64)...${NC}" CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ../${AGENT_OUTPUT_DIR}/dashgo-agent-debug-linux-amd64 \ main_debug.go debug_logger.go alpine_types.go alpine_system_checker.go \ alpine_system_checker_unix.go alpine_error_handler.go diagnostic_tool.go version.go \ update_checker.go security.go security_unix.go security_unix.go # Linux arm64 调试版本 echo -e "${YELLOW}构建 Agent Debug (Linux arm64)...${NC}" CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ../${AGENT_OUTPUT_DIR}/dashgo-agent-debug-linux-arm64 \ main_debug.go debug_logger.go alpine_types.go alpine_system_checker.go \ alpine_system_checker_unix.go alpine_error_handler.go diagnostic_tool.go version.go \ update_checker.go security.go security_unix.go security_unix.go # Linux 386 调试版本 echo -e "${YELLOW}构建 Agent Debug (Linux 386)...${NC}" CGO_ENABLED=0 GOOS=linux GOARCH=386 go build \ -trimpath -ldflags="-s -w -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \ -o ../${AGENT_OUTPUT_DIR}/dashgo-agent-debug-linux-386 \ main_debug.go debug_logger.go alpine_types.go alpine_system_checker.go \ alpine_system_checker_unix.go alpine_error_handler.go diagnostic_tool.go version.go \ update_checker.go security.go security_unix.go security_unix.go # 复制诊断脚本 echo -e "${YELLOW}复制诊断脚本...${NC}" cp debug-alpine.sh ../${AGENT_OUTPUT_DIR}/ chmod +x ../${AGENT_OUTPUT_DIR}/debug-alpine.sh cd .. echo -e "${GREEN}✓ Alpine 调试版本 Agent 构建完成${NC}" } # 构建 Migrate 工具 build_migrate() { echo -e "${YELLOW}开始构建 Migrate 工具...${NC}" # Linux amd64 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ -trimpath -ldflags="-s -w" \ -o ${SERVER_OUTPUT_DIR}/migrate-linux-amd64 \ ./cmd/migrate # Linux arm64 CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build \ -trimpath -ldflags="-s -w" \ -o ${SERVER_OUTPUT_DIR}/migrate-linux-arm64 \ ./cmd/migrate echo -e "${GREEN}✓ Migrate 工具构建完成${NC}" } # 生成校验和 generate_checksums() { echo -e "${YELLOW}生成校验和文件...${NC}" cd ${OUTPUT_DIR} # Agent 校验和 cd agent sha256sum * > SHA256SUMS cd .. # Server 校验和 cd server sha256sum * > SHA256SUMS cd .. cd .. echo -e "${GREEN}✓ 校验和文件生成完成${NC}" } # 创建版本信息文件 create_version_info() { echo -e "${YELLOW}创建版本信息文件...${NC}" cat > ${OUTPUT_DIR}/VERSION.txt << EOF dashGO Build Information ======================== Version: ${VERSION} Build Time: ${BUILD_TIME} Git Commit: ${GIT_COMMIT} Server Binaries: - dashgo-server-linux-amd64 - dashgo-server-linux-arm64 - dashgo-server-windows-amd64.exe - dashgo-server-darwin-amd64 - dashgo-server-darwin-arm64 Agent Binaries: - dashgo-agent-linux-amd64 - dashgo-agent-linux-arm64 - dashgo-agent-linux-386 - dashgo-agent-windows-amd64.exe - dashgo-agent-windows-386.exe - dashgo-agent-darwin-amd64 - dashgo-agent-darwin-arm64 - dashgo-agent-freebsd-amd64 Alpine Debug Agent Binaries: - dashgo-agent-debug-linux-amd64 - dashgo-agent-debug-linux-arm64 - dashgo-agent-debug-linux-386 - debug-alpine.sh (diagnostic script) Tools: - migrate-linux-amd64 - migrate-linux-arm64 Frontend: - web/dist (Vue.js build) EOF echo -e "${GREEN}✓ 版本信息文件创建完成${NC}" } # 显示构建结果 show_results() { echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}构建完成!${NC}" echo -e "${GREEN}========================================${NC}" echo "" echo -e "${YELLOW}构建产物位置: ${OUTPUT_DIR}/${NC}" echo "" echo -e "${YELLOW}文件大小:${NC}" du -sh ${OUTPUT_DIR}/* echo "" echo -e "${YELLOW}Agent 文件:${NC}" ls -lh ${AGENT_OUTPUT_DIR}/ echo "" echo -e "${YELLOW}Server 文件:${NC}" ls -lh ${SERVER_OUTPUT_DIR}/ echo "" echo -e "${GREEN}所有二进制文件已生成到 ${OUTPUT_DIR} 目录${NC}" } # 主函数 main() { # 检查参数 case "${1}" in clean) clean ;; frontend) clean build_frontend ;; server) clean build_server build_migrate ;; server-docker) clean build_server_docker build_migrate ;; agent) clean build_agent ;; agent-debug) clean build_agent_debug ;; all|"") clean build_frontend build_server build_agent build_migrate generate_checksums create_version_info show_results ;; all-debug) clean build_frontend build_server build_agent build_agent_debug build_migrate generate_checksums create_version_info show_results ;; all-docker) clean build_frontend build_server_docker build_agent build_migrate generate_checksums create_version_info show_results ;; *) echo -e "${RED}未知参数: ${1}${NC}" echo "" echo "用法: $0 [clean|frontend|server|server-docker|agent|agent-debug|all|all-debug|all-docker]" echo "" echo " clean - 仅清理构建文件" echo " frontend - 仅构建前端" echo " server - 仅构建 Server (本地编译,当前架构支持 SQLite)" echo " server-docker - 仅构建 Server (Docker 编译,所有架构支持 SQLite)" echo " agent - 仅构建 Agent (全架构)" echo " agent-debug - 仅构建 Alpine 调试版本 Agent" echo " all - 构建所有组件 (默认,本地编译)" echo " all-debug - 构建所有组件 + Alpine 调试版本" echo " all-docker - 构建所有组件 (Docker 编译,推荐)" echo "" echo "环境变量:" echo " VERSION - 设置版本号 (默认: 1.0.0)" echo " RUN_TESTS - 构建前运行前端测试 (设置为 'true' 启用)" echo " RUN_TYPE_CHECK - 构建前运行 TypeScript 类型检查 (设置为 'true' 启用)" echo "" echo "示例:" echo " $0 all # 构建所有组件" echo " VERSION=2.0.0 $0 all # 指定版本号构建" echo " RUN_TESTS=true $0 all # 构建前运行测试" echo " RUN_TYPE_CHECK=true $0 frontend # 构建前端并进行类型检查" exit 1 ;; esac } # 执行主函数 main "$@"