diff --git a/agent/build_rk3588.bat b/agent/build_rk3588.bat index 0f5c067..04905e8 100644 --- a/agent/build_rk3588.bat +++ b/agent/build_rk3588.bat @@ -20,6 +20,12 @@ set "CGO_ENABLED=0" set "VERSION=%~1" if "%VERSION%"=="" set "VERSION=0.0.0-dev" +set "BUILDTYPE=%~3" +if "%BUILDTYPE%"=="" set "BUILDTYPE=release" + +for /f %%i in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMdd.HHmmss"') do set "BUILDID=%%i" +if "%BUILDID%"=="" set "BUILDID=unknown" + set "GITSHA=unknown" for /f %%i in ('git rev-parse --short HEAD 2^>nul') do set "GITSHA=%%i" @@ -29,11 +35,11 @@ if not exist "%OUTDIR%" mkdir "%OUTDIR%" >nul set "OUT=%OUTDIR%\rk3588-agent_linux_arm64" if not "%~2"=="" set "OUT=%OUTDIR%\%~2" -set "LDFLAGS=-s -w -X main.Version=%VERSION% -X main.GitSHA=%GITSHA%" +set "LDFLAGS=-s -w -X main.Version=%VERSION% -X main.BuildID=%BUILDID% -X main.BuildType=%BUILDTYPE% -X main.GitSHA=%GITSHA%" echo Building: %OUT% echo GOOS=%GOOS% GOARCH=%GOARCH% CGO_ENABLED=%CGO_ENABLED% -echo Version=%VERSION% GitSHA=%GITSHA% +echo Version=%VERSION% BuildID=%BUILDID% BuildType=%BUILDTYPE% GitSHA=%GITSHA% go mod download if errorlevel 1 ( diff --git a/agent/cmd/rk3588-agent/main.go b/agent/cmd/rk3588-agent/main.go index bc8cb77..9d4217b 100644 --- a/agent/cmd/rk3588-agent/main.go +++ b/agent/cmd/rk3588-agent/main.go @@ -26,6 +26,8 @@ import ( ) var Version = "0.0.0-dev" +var BuildID = "dev" +var BuildType = "dev" var GitSHA = "" func main() { @@ -71,7 +73,8 @@ func main() { baseDir = filepath.Dir(abs) } - h := httpapi.New(cfg.Agent, baseDir, ms, store, deviceID, agentPort, mediaPort, Version, GitSHA) + h := httpapi.New(cfg.Agent, baseDir, ms, store, deviceID, agentPort, mediaPort, Version, BuildID, BuildType, GitSHA) + log.Info("rk3588-agent version=" + Version + " build_id=" + BuildID + " build_type=" + BuildType + " git_sha=" + GitSHA) httpSrv := &http.Server{ Addr: cfg.Agent.Listen, @@ -117,6 +120,8 @@ func main() { AgentPort: agentPort, MediaPort: mediaPort, Version: Version, + BuildID: BuildID, + BuildType: BuildType, GitSHA: GitSHA, } log.Info("udp discovery listening on :" + strconv.Itoa(cfg.Agent.DiscoveryPort)) diff --git a/agent/internal/discovery/discovery.go b/agent/internal/discovery/discovery.go index 8736a65..a977dd9 100644 --- a/agent/internal/discovery/discovery.go +++ b/agent/internal/discovery/discovery.go @@ -22,6 +22,8 @@ type Responder struct { AgentPort int MediaPort int Version string + BuildID string + BuildType string GitSHA string } @@ -41,6 +43,8 @@ type discoverReply struct { AgentPort int `json:"agent_port"` MediaPort int `json:"media_port"` Version string `json:"version"` + BuildID string `json:"build_id"` + BuildType string `json:"build_type"` GitSHA string `json:"git_sha"` UptimeSec int64 `json:"uptime_sec"` } @@ -101,6 +105,8 @@ func (r *Responder) Run(ctx context.Context) error { AgentPort: r.AgentPort, MediaPort: r.MediaPort, Version: r.Version, + BuildID: r.BuildID, + BuildType: r.BuildType, GitSHA: r.GitSHA, UptimeSec: sysinfo.UptimeSec(), } diff --git a/agent/internal/httpapi/extras.go b/agent/internal/httpapi/extras.go index a761c7b..73f101b 100644 --- a/agent/internal/httpapi/extras.go +++ b/agent/internal/httpapi/extras.go @@ -128,7 +128,12 @@ func (s *Server) handleVersions(w http.ResponseWriter, r *http.Request) { resp := map[string]any{} - agentInfo := map[string]any{"version": s.version, "git_sha": s.gitSHA} + agentInfo := map[string]any{ + "version": s.version, + "build_id": s.buildID, + "build_type": s.buildType, + "git_sha": s.gitSHA, + } if bin, err := assets.ExecutableInfo(); err == nil { agentInfo["binary"] = bin } else { diff --git a/agent/internal/httpapi/server.go b/agent/internal/httpapi/server.go index 521ad57..078b41f 100644 --- a/agent/internal/httpapi/server.go +++ b/agent/internal/httpapi/server.go @@ -42,6 +42,8 @@ type Server struct { agentPort int mediaPort int version string + buildID string + buildType string gitSHA string cpuMu sync.Mutex lastCPU metrics.CPUStat @@ -62,13 +64,15 @@ type InfoResponse struct { AgentPort int `json:"agent_port"` MediaPort int `json:"media_port"` Version string `json:"version"` + BuildID string `json:"build_id"` + BuildType string `json:"build_type"` GitSHA string `json:"git_sha"` ConfigPath string `json:"config_path"` LastGoodPath string `json:"last_good_path"` UptimeSec int64 `json:"uptime_sec"` } -func New(agentCfg config.AgentConfig, baseDir string, ms *mediaserver.Client, store *modelstore.Store, deviceID string, agentPort int, mediaPort int, version, gitSHA string) *Server { +func New(agentCfg config.AgentConfig, baseDir string, ms *mediaserver.Client, store *modelstore.Store, deviceID string, agentPort int, mediaPort int, version, buildID, buildType, gitSHA string) *Server { var pc procctl.ProcessController if agentCfg.MediaServerProcess.Enable { // 使用传统的 fork/exec 模式 @@ -97,6 +101,8 @@ func New(agentCfg config.AgentConfig, baseDir string, ms *mediaserver.Client, st agentPort: agentPort, mediaPort: mediaPort, version: version, + buildID: buildID, + buildType: buildType, gitSHA: gitSHA, } @@ -152,6 +158,8 @@ func (s *Server) handleInfo(w http.ResponseWriter, r *http.Request) { AgentPort: s.agentPort, MediaPort: s.mediaPort, Version: s.version, + BuildID: s.buildID, + BuildType: s.buildType, GitSHA: s.gitSHA, ConfigPath: s.agentCfg.ConfigPath, LastGoodPath: s.agentCfg.ConfigPath + ".last_good.json", diff --git a/docs/API_Device_RemoteMgmt_InterfaceTable.md b/docs/API_Device_RemoteMgmt_InterfaceTable.md index 75bcd3a..c6e853d 100644 --- a/docs/API_Device_RemoteMgmt_InterfaceTable.md +++ b/docs/API_Device_RemoteMgmt_InterfaceTable.md @@ -87,6 +87,8 @@ Line2(JSON): "agent_port":9100, "media_port":9000, "version":"0.0.0-dev", + "build_id":"20260418.141245", + "build_type":"release", "git_sha":"e5894c2", "uptime_sec":12345 } @@ -117,6 +119,8 @@ Response 200: "agent_port":9100, "media_port":9000, "version":"0.0.0-dev", + "build_id":"20260418.141245", + "build_type":"release", "git_sha":"e5894c2", "config_path":"/etc/rk3588sys/config.json", "last_good_path":"/etc/rk3588sys/config.json.last_good.json", diff --git a/docs/Agent_API_Extensions.md b/docs/Agent_API_Extensions.md index 82dcf46..0de3782 100644 --- a/docs/Agent_API_Extensions.md +++ b/docs/Agent_API_Extensions.md @@ -34,6 +34,8 @@ { "agent": { "version": "0.0.0-dev", + "build_id": "20260418.141245", + "build_type": "release", "git_sha": "...", "binary": {"path": "...", "sha256": "...", "size": 123, "mtime_ms": 1710000000000} }, diff --git a/docs/design/PRD_01_Device_MediaServer_RemoteMgmt.md b/docs/design/PRD_01_Device_MediaServer_RemoteMgmt.md index 98189d0..9c195cf 100644 --- a/docs/design/PRD_01_Device_MediaServer_RemoteMgmt.md +++ b/docs/design/PRD_01_Device_MediaServer_RemoteMgmt.md @@ -234,7 +234,7 @@ agent 只调用 media-server 的既有接口(对内 base URL = `media_server_b ## 8. 验收标准(Acceptance Criteria) -1. 同网段 10 台设备,管理端 Search(UDP broadcast)在 1 秒内都能发现;列表包含 `device_id/ip/agent_port/media_port/version/git_sha`。 +1. 同网段 10 台设备,管理端 Search(UDP broadcast)在 1 秒内都能发现;列表包含 `device_id/ip/agent_port/media_port/version/build_id/build_type/git_sha`。 2. agent `PUT /v1/config`: - 发送合法 config,设备写盘并触发 `media-server` reload 成功,graphs 状态正常。 - 发送非法 config,agent 返回 400;或 reload 失败则 agent 自动 rollback 并返回 500(错误信息可定位)。 diff --git a/docs/design/PRD_03_Manager_Backend_Go.md b/docs/design/PRD_03_Manager_Backend_Go.md index 2c296c3..48386ba 100644 --- a/docs/design/PRD_03_Manager_Backend_Go.md +++ b/docs/design/PRD_03_Manager_Backend_Go.md @@ -26,7 +26,7 @@ ### 3.2 Device Registry - 内存缓存: - - `device_id -> {ip, agent_port, media_port, device_name, version, git_sha, last_seen_ms, online}` + - `device_id -> {ip, agent_port, media_port, device_name, version, build_id, build_type, git_sha, last_seen_ms, online}` - 定时刷新(可配置间隔):对 online 设备拉取 `GET /v1/graphs`(agent 代理),更新摘要。 - Offline 规则:超过 `offline_after_ms`(如 10000ms)未见到,则标记离线。 @@ -71,7 +71,7 @@ Request: Response: ```json -{ "items": [ {"device_id":"...","ip":"...","agent_port":9100,"media_port":9000,"device_name":"...","version":"...","git_sha":"..."} ] } +{ "items": [ {"device_id":"...","ip":"...","agent_port":9100,"media_port":9000,"device_name":"...","version":"...","build_id":"...","build_type":"release","git_sha":"..."} ] } ``` ### 4.2 Devices @@ -81,7 +81,7 @@ Response: Response: ```json -{ "items": [ {"device_id":"...","online":true,"last_seen_ms":0,"ip":"...","agent_port":9100,"media_port":9000,"device_name":"...","version":"...","git_sha":"...","graphs":[...]} ] } +{ "items": [ {"device_id":"...","online":true,"last_seen_ms":0,"ip":"...","agent_port":9100,"media_port":9000,"device_name":"...","version":"...","build_id":"...","build_type":"release","git_sha":"...","graphs":[...]} ] } ``` #### `GET /api/devices/:id` diff --git a/docs/命令.md b/docs/命令.md index 8dd15e2..255f0c6 100644 --- a/docs/命令.md +++ b/docs/命令.md @@ -46,8 +46,10 @@ cd /d D:\App\C++\Rk3588Sys\agent $env:GOARCH="arm64" $env:CGO_ENABLED="0" $VERSION="0.0.0-dev" + $BUILDID=Get-Date -Format "yyyyMMdd.HHmmss" + $BUILDTYPE="release" $GITSHA="dev" - go build -trimpath -buildvcs=false -ldflags "-s -w -X main.Version=$VERSION -X main.GitSHA=$GITSHA" -o ".\rk3588-agent" ".\cmd\rk3588-agent" + go build -trimpath -buildvcs=false -ldflags "-s -w -X main.Version=$VERSION -X main.BuildID=$BUILDID -X main.BuildType=$BUILDTYPE -X main.GitSHA=$GITSHA" -o ".\rk3588-agent" ".\cmd\rk3588-agent" go version -m .\rk3588-agent ls -l ./rk3588-agent_linux_arm64