feat(build): 支持 build tag 版本注入并清理历史二进制

- ./run.sh build 仅输出项目根目录 ./aiops,构建前清理 backend/aiops-*
- 新增 ./run.sh build tag v1.0.1,通过 ldflags 注入 Version/BuildTime/GitCommit
- 支持 ./aiops version 子命令查看编译版本
- 删除误提交的 backend/aiops-cgo,gitignore 忽略 backend/aiops-*
This commit is contained in:
Logan.Li committed 2026-06-26 16:27:08 +08:00
1 parent 1fd9a631e5
commit 8be51ac514
4 files changed
+67 -16

No files matched your search

+2
View File
@@ -19,12 +19,14 @@ backend/vendor/
# Compiled binary # Compiled binary
aiops aiops
aiops.bak.*
sqlite3.db sqlite3.db
sqlite3.db-* sqlite3.db-*
redka.db redka.db
redka.db-* redka.db-*
backend/aiops-server backend/aiops-server
backend/aiops backend/aiops
backend/aiops-*
backend/data/ backend/data/
# Config (keep backend/config.yaml as default) # Config (keep backend/config.yaml as default)
BIN
View File
Binary file not shown.
+18 -4
View File
@@ -83,16 +83,30 @@ var (
// @name Authorization // @name Authorization
// @description Type "Bearer" followed by a space and JWT token. // @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() { 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 // 解析 CLI 参数 // Logan.Li
flag.Parse() flag.Parse()
// 显示版本信息 // Logan.Li // 显示版本信息 // Logan.Li
if *flagVersion { if *flagVersion {
fmt.Printf("AIOps 智能运维平台\n") printVersion()
fmt.Printf(" 版本: %s\n", Version)
fmt.Printf(" 构建: %s\n", BuildTime)
fmt.Printf(" 提交: %s\n", GitCommit)
os.Exit(0) os.Exit(0)
} }
+47 -12
View File
@@ -319,6 +319,7 @@ clean_go_artifacts() {
rm -f "$STANDALONE_BIN_PATH" rm -f "$STANDALONE_BIN_PATH"
rm -f "$SCRIPT_DIR/$BACKEND_DIR/$STANDALONE_BIN" rm -f "$SCRIPT_DIR/$BACKEND_DIR/$STANDALONE_BIN"
rm -f "$SCRIPT_DIR/$BACKEND_DIR/$BACKEND_BIN" rm -f "$SCRIPT_DIR/$BACKEND_DIR/$BACKEND_BIN"
rm -f "$SCRIPT_DIR/$BACKEND_DIR"/aiops-*
} }
# 构建前端并同步到 backend/static(二进制 / embed 镜像共用)// Logan.Li # 构建前端并同步到 backend/static(二进制 / embed 镜像共用)// Logan.Li
@@ -432,23 +433,43 @@ ensure_go_path() {
fi 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() { build_standalone_binary() {
local version_tag="${1:-}"
ensure_go_path || return 1 ensure_go_path || return 1
build_frontend_embed build_frontend_embed
ensure_binary_config ensure_binary_config
clean_go_artifacts clean_go_artifacts
resolve_build_version "$version_tag"
cd "$SCRIPT_DIR/$BACKEND_DIR" 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 \ 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 if [ ! -f "$STANDALONE_BIN_PATH" ]; then
error "编译失败" error "编译失败"
return 1 return 1
fi fi
local bin_size local bin_size
bin_size=$(du -h "$STANDALONE_BIN_PATH" | cut -f1) bin_size=$(du -h "$STANDALONE_BIN_PATH" | cut -f1)
success "编译完成: ./$STANDALONE_BIN ($bin_size)" success "编译完成: ./$STANDALONE_BIN ($bin_size, $BUILD_VERSION)"
cd "$SCRIPT_DIR" cd "$SCRIPT_DIR"
return 0 return 0
} }
@@ -698,10 +719,22 @@ cmd_build() {
build_standalone_binary || exit 1 build_standalone_binary || exit 1
echo "" echo ""
info "使用方法:" info "使用方法:"
echo " ./run.sh binary upgrade # 停服重编译并后台启动" echo " ./$STANDALONE_BIN version # 查看版本"
echo " ./$STANDALONE_BIN --port 8080 # 前台启动" echo " ./run.sh binary upgrade # 停服重编译并后台启动"
echo " ./$STANDALONE_BIN --mode local # 本地模式 (SQLite + redka)" echo " ./$STANDALONE_BIN --port 8080 # 前台启动"
echo " ./$STANDALONE_BIN --config config.yaml # 使用配置文件" 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) agent)
banner "========== 编译 Agent ==========" banner "========== 编译 Agent =========="
@@ -729,9 +762,10 @@ cmd_build() {
;; ;;
help|--help|-h) help|--help|-h)
echo "编译命令:" echo "编译命令:"
echo " ./run.sh build 编译独立二进制 aiops (默认 SQLite)" echo " ./run.sh build 编译独立二进制 ./aiops (输出到项目根目录)"
echo " ./run.sh build agent 交叉编译 Agent (amd64+arm64)" echo " ./run.sh build tag v1.0.1 指定版本号编译 (./aiops version 可查看)"
echo " ./run.sh build frontend 构建前端生产包" echo " ./run.sh build agent 交叉编译 Agent (amd64+arm64)"
echo " ./run.sh build frontend 构建前端生产包"
;; ;;
*) *)
error "未知构建目标: $target" error "未知构建目标: $target"
@@ -1208,7 +1242,8 @@ cmd_help() {
echo " ./run.sh kubernetes build 仅构建 embed 镜像" echo " ./run.sh kubernetes build 仅构建 embed 镜像"
echo "" echo ""
echo -e " ${YELLOW}编译 & 独立二进制${NC}" 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 upgrade 停服→清旧→重编译→后台启动(生产升级)"
echo " ./run.sh binary start|stop|status 进程管理" echo " ./run.sh binary start|stop|status 进程管理"
echo " ./run.sh binary [args] 前台启动(调试)" echo " ./run.sh binary [args] 前台启动(调试)"