feat: 编译时嵌入版本信息

- 添加版本显示功能 (--version 参数)
- 编译时注入 Version、BuildTime、GitCommit、GoVersion、BuildEnv
- 更新 Makefile 支持自动获取版本信息
- 添加 release-full 命令支持完整发布流程
- 启动时显示构建信息
This commit is contained in:
OpenClaw Agent
2026-02-08 19:20:24 +08:00
parent 28f2c2aec7
commit d34d1119dd
2 changed files with 110 additions and 2 deletions

View File

@@ -1,9 +1,16 @@
.PHONY: all build clean run test docker-build docker-run install-dev help
.PHONY: all build clean run test docker-build docker-run install-dev help release
# 应用名称
APP_NAME := sms-receiver-v2
MAIN_FILE := main.go
# 版本信息
VERSION := v2.0.0
BUILD_TIME := $(shell date +%Y-%m-%d\ %H:%M:%S)
GIT_COMMIT := $(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown")
GO_VERSION := $(shell go version | awk '{print $$3}')
BUILD_ENV := prod
# Go 配置
GO := go
GOFMT := gofmt
@@ -12,7 +19,7 @@ GOTEST := go test
# 构建配置
BUILD_DIR := ./build
LDFLAGS := -ldflags="-w -s"
LDFLAGS := -ldflags="-X 'main.Version=$(VERSION)' -X 'main.BuildTime=$(BUILD_TIME)' -X 'main.GitCommit=$(GIT_COMMIT)' -X 'main.GoVersion=$(GO_VERSION)' -X 'main.BuildEnv=$(BUILD_ENV)' -w -s"
# Docker 配置
DOCKER_IMAGE := sms-receiver-go
@@ -110,3 +117,52 @@ init:
else \
echo "config.yaml 已存在"; \
fi
## release: 发布版本(创建 tag、推送到远程、上传二进制文件
release: clean build
@echo "正在发布版本: $(VERSION)"
@if [ -z "$(VERSION)" ]; then \
echo "错误: 请指定 VERSION例如: make release VERSION=v2.0.0"; \
exit 1; \
fi
@git tag -a $(VERSION) -m "Release $(VERSION)" || echo "Tag 已存在,继续..."
@git push origin $(VERSION) || echo "Tag 已推送"
@echo "请在 Gitea 上手动上传二进制文件到 Release: $(VERSION)"
@echo "或者使用: make release-upload VERSION=$(VERSION)"
## release-upload: 上传二进制文件到 Gitea Release
release-upload:
@echo "上传二进制文件到 Gitea Release: $(VERSION)"
@if [ ! -f $(APP_NAME) ]; then \
echo "错误: 找不到编译文件 $(APP_NAME),请先运行 make build"; \
exit 1; \
fi
@if [ -z "$(GITEA_TOKEN)" ]; then \
echo "错误: 请设置环境变量 GITEA_TOKEN"; \
echo "用法: make release-upload VERSION=v2.0.0 GITEA_TOKEN=your_token"; \
exit 1; \
fi
@echo "正在上传 $(APP_NAME) 到 Gitea..."
@curl -X POST \
-H "Authorization: token $(GITEA_TOKEN)" \
-F "attachment=@$(APP_NAME)" \
"https://gitea.king.nyc.mn/api/v1/repos/openclaw/SmsReceiver-go/releases/$(VERSION)/assets" \
2>&1 | grep -E "(name|size|browser_download_url)" || echo "上传完成"
@echo "✅ 上传完成!"
## release-full: 完整发布流程编译、tag、推送、上传
release-full: clean build
@echo "完整发布流程: $(VERSION)"
@if [ -z "$(VERSION)" ] || [ -z "$(GITEA_TOKEN)" ]; then \
echo "用法: make release-full VERSION=v2.0.0 GITEA_TOKEN=your_token"; \
exit 1; \
fi
@echo "1. 创建并推送 Git tag..."
@git tag -a $(VERSION) -m "Release $(VERSION)"
@git push origin $(VERSION)
@echo "2. 上传二进制文件到 Gitea Release..."
@curl -X POST \
-H "Authorization: token $(GITEA_TOKEN)" \
-F "attachment=@$(APP_NAME)" \
"https://gitea.king.nyc.mn/api/v1/repos/openclaw/SmsReceiver-go/releases/$(VERSION)/assets"
@echo "✅ 发布完成!访问: https://gitea.king.nyc.mn/openclaw/SmsReceiver-go/releases/tag/$(VERSION)"

52
main.go
View File

@@ -2,6 +2,7 @@ package main
import (
"flag"
"fmt"
"log"
"net/http"
"os"
@@ -18,10 +19,61 @@ import (
"github.com/robfig/cron/v3"
)
// 编译时注入的版本信息
var (
Version = "dev" // 版本号
BuildTime = "unknown" // 构建时间
GitCommit = "unknown" // Git commit hash
GoVersion = "unknown" // Go 版本
BuildEnv = "dev" // 构建环境dev/prod
)
func printVersion() {
fmt.Printf("SmsReceiver-go %s\n", Version)
fmt.Printf(" Version: %s\n", Version)
fmt.Printf(" Build Env: %s\n", BuildEnv)
fmt.Printf(" Build Time: %s\n", BuildTime)
fmt.Printf(" Git Commit: %s\n", GitCommit)
fmt.Printf(" Go Version: %s\n", GoVersion)
fmt.Printf(" Repository: https://gitea.king.nyc.mn/openclaw/SmsReceiver-go\n")
}
func main() {
// 检查是否请求版本信息(需要在 flag.Parse 之前)
for _, arg := range os.Args[1:] {
if arg == "--version" || arg == "-v" {
printVersion()
os.Exit(0)
} else if arg == "--help" || arg == "-h" {
fmt.Println("SmsReceiver-go - 短信转发接收端 Go 版本")
fmt.Println()
fmt.Println("Usage:")
fmt.Println(" sms-receiver-v2 [options]")
fmt.Println()
fmt.Println("Options:")
flag.PrintDefaults()
fmt.Println()
fmt.Println("Additional Options:")
fmt.Println(" -v, --version 显示版本信息")
fmt.Println(" -h, --help 显示帮助信息")
os.Exit(0)
}
}
// 记录启动时间
startTime := time.Now()
// 打印启动信息
log.Printf("========================================")
log.Printf("SmsReceiver-go v%s (%s)", Version, BuildEnv)
log.Printf("========================================")
log.Printf("Version: %s", Version)
log.Printf("Build Env: %s", BuildEnv)
log.Printf("Build Time: %s", BuildTime)
log.Printf("Git Commit: %s", GitCommit)
log.Printf("Go Version: %s", GoVersion)
log.Printf("========================================")
// 命令行参数
configPath := flag.String("config", "config.yaml", "配置文件路径")
templatesPath := flag.String("templates", "templates", "模板目录路径")