Expose agent build metadata
This commit is contained in:
parent
2bdde181c5
commit
cfe42bdad3
@ -20,6 +20,12 @@ set "CGO_ENABLED=0"
|
|||||||
set "VERSION=%~1"
|
set "VERSION=%~1"
|
||||||
if "%VERSION%"=="" set "VERSION=0.0.0-dev"
|
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"
|
set "GITSHA=unknown"
|
||||||
for /f %%i in ('git rev-parse --short HEAD 2^>nul') do set "GITSHA=%%i"
|
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"
|
set "OUT=%OUTDIR%\rk3588-agent_linux_arm64"
|
||||||
if not "%~2"=="" set "OUT=%OUTDIR%\%~2"
|
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 Building: %OUT%
|
||||||
echo GOOS=%GOOS% GOARCH=%GOARCH% CGO_ENABLED=%CGO_ENABLED%
|
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
|
go mod download
|
||||||
if errorlevel 1 (
|
if errorlevel 1 (
|
||||||
|
|||||||
@ -26,6 +26,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var Version = "0.0.0-dev"
|
var Version = "0.0.0-dev"
|
||||||
|
var BuildID = "dev"
|
||||||
|
var BuildType = "dev"
|
||||||
var GitSHA = ""
|
var GitSHA = ""
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -71,7 +73,8 @@ func main() {
|
|||||||
baseDir = filepath.Dir(abs)
|
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{
|
httpSrv := &http.Server{
|
||||||
Addr: cfg.Agent.Listen,
|
Addr: cfg.Agent.Listen,
|
||||||
@ -117,6 +120,8 @@ func main() {
|
|||||||
AgentPort: agentPort,
|
AgentPort: agentPort,
|
||||||
MediaPort: mediaPort,
|
MediaPort: mediaPort,
|
||||||
Version: Version,
|
Version: Version,
|
||||||
|
BuildID: BuildID,
|
||||||
|
BuildType: BuildType,
|
||||||
GitSHA: GitSHA,
|
GitSHA: GitSHA,
|
||||||
}
|
}
|
||||||
log.Info("udp discovery listening on :" + strconv.Itoa(cfg.Agent.DiscoveryPort))
|
log.Info("udp discovery listening on :" + strconv.Itoa(cfg.Agent.DiscoveryPort))
|
||||||
|
|||||||
@ -22,6 +22,8 @@ type Responder struct {
|
|||||||
AgentPort int
|
AgentPort int
|
||||||
MediaPort int
|
MediaPort int
|
||||||
Version string
|
Version string
|
||||||
|
BuildID string
|
||||||
|
BuildType string
|
||||||
GitSHA string
|
GitSHA string
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,6 +43,8 @@ type discoverReply struct {
|
|||||||
AgentPort int `json:"agent_port"`
|
AgentPort int `json:"agent_port"`
|
||||||
MediaPort int `json:"media_port"`
|
MediaPort int `json:"media_port"`
|
||||||
Version string `json:"version"`
|
Version string `json:"version"`
|
||||||
|
BuildID string `json:"build_id"`
|
||||||
|
BuildType string `json:"build_type"`
|
||||||
GitSHA string `json:"git_sha"`
|
GitSHA string `json:"git_sha"`
|
||||||
UptimeSec int64 `json:"uptime_sec"`
|
UptimeSec int64 `json:"uptime_sec"`
|
||||||
}
|
}
|
||||||
@ -101,6 +105,8 @@ func (r *Responder) Run(ctx context.Context) error {
|
|||||||
AgentPort: r.AgentPort,
|
AgentPort: r.AgentPort,
|
||||||
MediaPort: r.MediaPort,
|
MediaPort: r.MediaPort,
|
||||||
Version: r.Version,
|
Version: r.Version,
|
||||||
|
BuildID: r.BuildID,
|
||||||
|
BuildType: r.BuildType,
|
||||||
GitSHA: r.GitSHA,
|
GitSHA: r.GitSHA,
|
||||||
UptimeSec: sysinfo.UptimeSec(),
|
UptimeSec: sysinfo.UptimeSec(),
|
||||||
}
|
}
|
||||||
|
|||||||
@ -128,7 +128,12 @@ func (s *Server) handleVersions(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
resp := map[string]any{}
|
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 {
|
if bin, err := assets.ExecutableInfo(); err == nil {
|
||||||
agentInfo["binary"] = bin
|
agentInfo["binary"] = bin
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -42,6 +42,8 @@ type Server struct {
|
|||||||
agentPort int
|
agentPort int
|
||||||
mediaPort int
|
mediaPort int
|
||||||
version string
|
version string
|
||||||
|
buildID string
|
||||||
|
buildType string
|
||||||
gitSHA string
|
gitSHA string
|
||||||
cpuMu sync.Mutex
|
cpuMu sync.Mutex
|
||||||
lastCPU metrics.CPUStat
|
lastCPU metrics.CPUStat
|
||||||
@ -62,13 +64,15 @@ type InfoResponse struct {
|
|||||||
AgentPort int `json:"agent_port"`
|
AgentPort int `json:"agent_port"`
|
||||||
MediaPort int `json:"media_port"`
|
MediaPort int `json:"media_port"`
|
||||||
Version string `json:"version"`
|
Version string `json:"version"`
|
||||||
|
BuildID string `json:"build_id"`
|
||||||
|
BuildType string `json:"build_type"`
|
||||||
GitSHA string `json:"git_sha"`
|
GitSHA string `json:"git_sha"`
|
||||||
ConfigPath string `json:"config_path"`
|
ConfigPath string `json:"config_path"`
|
||||||
LastGoodPath string `json:"last_good_path"`
|
LastGoodPath string `json:"last_good_path"`
|
||||||
UptimeSec int64 `json:"uptime_sec"`
|
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
|
var pc procctl.ProcessController
|
||||||
if agentCfg.MediaServerProcess.Enable {
|
if agentCfg.MediaServerProcess.Enable {
|
||||||
// 使用传统的 fork/exec 模式
|
// 使用传统的 fork/exec 模式
|
||||||
@ -97,6 +101,8 @@ func New(agentCfg config.AgentConfig, baseDir string, ms *mediaserver.Client, st
|
|||||||
agentPort: agentPort,
|
agentPort: agentPort,
|
||||||
mediaPort: mediaPort,
|
mediaPort: mediaPort,
|
||||||
version: version,
|
version: version,
|
||||||
|
buildID: buildID,
|
||||||
|
buildType: buildType,
|
||||||
gitSHA: gitSHA,
|
gitSHA: gitSHA,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,6 +158,8 @@ func (s *Server) handleInfo(w http.ResponseWriter, r *http.Request) {
|
|||||||
AgentPort: s.agentPort,
|
AgentPort: s.agentPort,
|
||||||
MediaPort: s.mediaPort,
|
MediaPort: s.mediaPort,
|
||||||
Version: s.version,
|
Version: s.version,
|
||||||
|
BuildID: s.buildID,
|
||||||
|
BuildType: s.buildType,
|
||||||
GitSHA: s.gitSHA,
|
GitSHA: s.gitSHA,
|
||||||
ConfigPath: s.agentCfg.ConfigPath,
|
ConfigPath: s.agentCfg.ConfigPath,
|
||||||
LastGoodPath: s.agentCfg.ConfigPath + ".last_good.json",
|
LastGoodPath: s.agentCfg.ConfigPath + ".last_good.json",
|
||||||
|
|||||||
@ -87,6 +87,8 @@ Line2(JSON):
|
|||||||
"agent_port":9100,
|
"agent_port":9100,
|
||||||
"media_port":9000,
|
"media_port":9000,
|
||||||
"version":"0.0.0-dev",
|
"version":"0.0.0-dev",
|
||||||
|
"build_id":"20260418.141245",
|
||||||
|
"build_type":"release",
|
||||||
"git_sha":"e5894c2",
|
"git_sha":"e5894c2",
|
||||||
"uptime_sec":12345
|
"uptime_sec":12345
|
||||||
}
|
}
|
||||||
@ -117,6 +119,8 @@ Response 200:
|
|||||||
"agent_port":9100,
|
"agent_port":9100,
|
||||||
"media_port":9000,
|
"media_port":9000,
|
||||||
"version":"0.0.0-dev",
|
"version":"0.0.0-dev",
|
||||||
|
"build_id":"20260418.141245",
|
||||||
|
"build_type":"release",
|
||||||
"git_sha":"e5894c2",
|
"git_sha":"e5894c2",
|
||||||
"config_path":"/etc/rk3588sys/config.json",
|
"config_path":"/etc/rk3588sys/config.json",
|
||||||
"last_good_path":"/etc/rk3588sys/config.json.last_good.json",
|
"last_good_path":"/etc/rk3588sys/config.json.last_good.json",
|
||||||
|
|||||||
@ -34,6 +34,8 @@
|
|||||||
{
|
{
|
||||||
"agent": {
|
"agent": {
|
||||||
"version": "0.0.0-dev",
|
"version": "0.0.0-dev",
|
||||||
|
"build_id": "20260418.141245",
|
||||||
|
"build_type": "release",
|
||||||
"git_sha": "...",
|
"git_sha": "...",
|
||||||
"binary": {"path": "...", "sha256": "...", "size": 123, "mtime_ms": 1710000000000}
|
"binary": {"path": "...", "sha256": "...", "size": 123, "mtime_ms": 1710000000000}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -234,7 +234,7 @@ agent 只调用 media-server 的既有接口(对内 base URL = `media_server_b
|
|||||||
|
|
||||||
## 8. 验收标准(Acceptance Criteria)
|
## 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`:
|
2. agent `PUT /v1/config`:
|
||||||
- 发送合法 config,设备写盘并触发 `media-server` reload 成功,graphs 状态正常。
|
- 发送合法 config,设备写盘并触发 `media-server` reload 成功,graphs 状态正常。
|
||||||
- 发送非法 config,agent 返回 400;或 reload 失败则 agent 自动 rollback 并返回 500(错误信息可定位)。
|
- 发送非法 config,agent 返回 400;或 reload 失败则 agent 自动 rollback 并返回 500(错误信息可定位)。
|
||||||
|
|||||||
@ -26,7 +26,7 @@
|
|||||||
### 3.2 Device Registry
|
### 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 代理),更新摘要。
|
- 定时刷新(可配置间隔):对 online 设备拉取 `GET /v1/graphs`(agent 代理),更新摘要。
|
||||||
- Offline 规则:超过 `offline_after_ms`(如 10000ms)未见到,则标记离线。
|
- Offline 规则:超过 `offline_after_ms`(如 10000ms)未见到,则标记离线。
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ Request:
|
|||||||
Response:
|
Response:
|
||||||
|
|
||||||
```json
|
```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
|
### 4.2 Devices
|
||||||
@ -81,7 +81,7 @@ Response:
|
|||||||
Response:
|
Response:
|
||||||
|
|
||||||
```json
|
```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`
|
#### `GET /api/devices/:id`
|
||||||
|
|||||||
@ -46,8 +46,10 @@ cd /d D:\App\C++\Rk3588Sys\agent
|
|||||||
$env:GOARCH="arm64"
|
$env:GOARCH="arm64"
|
||||||
$env:CGO_ENABLED="0"
|
$env:CGO_ENABLED="0"
|
||||||
$VERSION="0.0.0-dev"
|
$VERSION="0.0.0-dev"
|
||||||
|
$BUILDID=Get-Date -Format "yyyyMMdd.HHmmss"
|
||||||
|
$BUILDTYPE="release"
|
||||||
$GITSHA="dev"
|
$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
|
go version -m .\rk3588-agent
|
||||||
|
|
||||||
ls -l ./rk3588-agent_linux_arm64
|
ls -l ./rk3588-agent_linux_arm64
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user