Expose agent build metadata
This commit is contained in:
parent
2bdde181c5
commit
cfe42bdad3
@ -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 (
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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(),
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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}
|
||||
},
|
||||
|
||||
@ -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(错误信息可定位)。
|
||||
|
||||
@ -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`
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user