diff --git a/.gitignore b/.gitignore index 9e8f4ec..179c3b0 100644 --- a/.gitignore +++ b/.gitignore @@ -19,12 +19,14 @@ backend/vendor/ # Compiled binary aiops +aiops.bak.* sqlite3.db sqlite3.db-* redka.db redka.db-* backend/aiops-server backend/aiops +backend/aiops-* backend/data/ # Config (keep backend/config.yaml as default) diff --git a/backend/aiops-cgo b/backend/aiops-cgo deleted file mode 100755 index ad2affe..0000000 Binary files a/backend/aiops-cgo and /dev/null differ diff --git a/backend/main.go b/backend/main.go index 021c7b3..d215e66 100644 --- a/backend/main.go +++ b/backend/main.go @@ -83,16 +83,30 @@ var ( // @name Authorization // @description Type "Bearer" followed by a space and JWT token. +// printVersion 输出编译时注入的版本信息 // Logan.Li +func printVersion() { + fmt.Printf("AIOps 智能运维平台\n") + fmt.Printf(" 版本: %s\n", Version) + fmt.Printf(" 构建: %s\n", BuildTime) + fmt.Printf(" 提交: %s\n", GitCommit) +} + func main() { + // 支持 ./aiops version 子命令(无需启动服务)// Logan.Li + if len(os.Args) > 1 { + switch os.Args[1] { + case "version", "-v", "--version": + printVersion() + os.Exit(0) + } + } + // 解析 CLI 参数 // Logan.Li flag.Parse() // 显示版本信息 // Logan.Li if *flagVersion { - fmt.Printf("AIOps 智能运维平台\n") - fmt.Printf(" 版本: %s\n", Version) - fmt.Printf(" 构建: %s\n", BuildTime) - fmt.Printf(" 提交: %s\n", GitCommit) + printVersion() os.Exit(0) } diff --git a/run.sh b/run.sh index 4eb8eac..ed29152 100755 --- a/run.sh +++ b/run.sh @@ -319,6 +319,7 @@ clean_go_artifacts() { rm -f "$STANDALONE_BIN_PATH" rm -f "$SCRIPT_DIR/$BACKEND_DIR/$STANDALONE_BIN" rm -f "$SCRIPT_DIR/$BACKEND_DIR/$BACKEND_BIN" + rm -f "$SCRIPT_DIR/$BACKEND_DIR"/aiops-* } # 构建前端并同步到 backend/static(二进制 / embed 镜像共用)// Logan.Li @@ -432,23 +433,43 @@ ensure_go_path() { fi } -# 编译独立二进制(含 embed 前端)// Logan.Li +# 解析编译版本号(显式 tag 优先,否则取 git describe)// Logan.Li +resolve_build_version() { + local explicit="${1:-}" + if [ -n "$explicit" ]; then + BUILD_VERSION="$explicit" + elif git describe --tags --always --dirty 2>/dev/null | grep -q .; then + BUILD_VERSION=$(git describe --tags --always --dirty 2>/dev/null) + else + BUILD_VERSION="dev" + fi + BUILD_TIME=$(date -u '+%Y-%m-%dT%H:%M:%SZ') + GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") +} + +# 编译独立二进制(含 embed 前端,输出到项目根目录 ./aiops)// Logan.Li build_standalone_binary() { + local version_tag="${1:-}" ensure_go_path || return 1 build_frontend_embed ensure_binary_config clean_go_artifacts + resolve_build_version "$version_tag" cd "$SCRIPT_DIR/$BACKEND_DIR" - info "编译中..." + info "编译中 (version=$BUILD_VERSION)..." + local ldflags="-w -s" + ldflags+=" -X main.Version=${BUILD_VERSION}" + ldflags+=" -X main.BuildTime=${BUILD_TIME}" + ldflags+=" -X main.GitCommit=${GIT_COMMIT}" CGO_ENABLED=1 GOPROXY=https://goproxy.cn,direct GONOSUMCHECK='*' GOTOOLCHAIN=go1.24.0 \ - go build -ldflags="-w -s" -o "$STANDALONE_BIN_PATH" . + go build -ldflags="$ldflags" -o "$STANDALONE_BIN_PATH" . if [ ! -f "$STANDALONE_BIN_PATH" ]; then error "编译失败" return 1 fi local bin_size bin_size=$(du -h "$STANDALONE_BIN_PATH" | cut -f1) - success "编译完成: ./$STANDALONE_BIN ($bin_size)" + success "编译完成: ./$STANDALONE_BIN ($bin_size, $BUILD_VERSION)" cd "$SCRIPT_DIR" return 0 } @@ -698,10 +719,22 @@ cmd_build() { build_standalone_binary || exit 1 echo "" info "使用方法:" - echo " ./run.sh binary upgrade # 停服重编译并后台启动" - echo " ./$STANDALONE_BIN --port 8080 # 前台启动" - echo " ./$STANDALONE_BIN --mode local # 本地模式 (SQLite + redka)" - echo " ./$STANDALONE_BIN --config config.yaml # 使用配置文件" + echo " ./$STANDALONE_BIN version # 查看版本" + echo " ./run.sh binary upgrade # 停服重编译并后台启动" + echo " ./$STANDALONE_BIN --port 8080 # 前台启动" + echo " ./$STANDALONE_BIN --mode local # 本地模式 (SQLite + redka)" + echo " ./$STANDALONE_BIN --config config.yaml # 使用配置文件" + ;; + tag) + local version_tag=${2:-} + if [ -z "$version_tag" ]; then + error "请指定版本号,例如: ./run.sh build tag v1.0.1" + exit 1 + fi + banner "========== 编译独立二进制 ($version_tag) ==========" + build_standalone_binary "$version_tag" || exit 1 + echo "" + success "版本已写入二进制,验证: ./$STANDALONE_BIN version" ;; agent) banner "========== 编译 Agent ==========" @@ -729,9 +762,10 @@ cmd_build() { ;; help|--help|-h) echo "编译命令:" - echo " ./run.sh build 编译独立二进制 aiops (默认 SQLite)" - echo " ./run.sh build agent 交叉编译 Agent (amd64+arm64)" - echo " ./run.sh build frontend 构建前端生产包" + echo " ./run.sh build 编译独立二进制 ./aiops (输出到项目根目录)" + echo " ./run.sh build tag v1.0.1 指定版本号编译 (./aiops version 可查看)" + echo " ./run.sh build agent 交叉编译 Agent (amd64+arm64)" + echo " ./run.sh build frontend 构建前端生产包" ;; *) error "未知构建目标: $target" @@ -1208,7 +1242,8 @@ cmd_help() { echo " ./run.sh kubernetes build 仅构建 embed 镜像" echo "" echo -e " ${YELLOW}编译 & 独立二进制${NC}" - echo " ./run.sh build 编译独立二进制 ./$STANDALONE_BIN" + echo " ./run.sh build 编译独立二进制 ./$STANDALONE_BIN (仅根目录)" + echo " ./run.sh build tag v1.0.1 指定版本号编译" echo " ./run.sh binary upgrade 停服→清旧→重编译→后台启动(生产升级)" echo " ./run.sh binary start|stop|status 进程管理" echo " ./run.sh binary [args] 前台启动(调试)"