From 7ff0d0f4e6149c358b78fc12786dcff2ef03b999 Mon Sep 17 00:00:00 2001 From: JustMe Date: Fri, 9 Oct 2026 13:20:30 +0800 Subject: [PATCH] feat: print build info at startup; version placeholders filled in by CI [CI SKIP] --- backend/Directory.Build.props | 2 +- backend/agent/src/MoShiro.Agent/AgentApp.cs | 1 + backend/probe/src/MoShiro.Probe/ProbeApp.cs | 1 + .../MoShiro.Protocol/BuildInfo.Summary.cs | 19 +++++++++++++++++++ .../MoShiro.Protocol/MoShiro.Protocol.csproj | 2 +- backend/src/MoShiro.Backend/Program.cs | 9 ++++++++- packaging/compose/agent/compose.yaml | 2 +- packaging/compose/probe/compose.yaml | 2 +- packaging/quadlet/moshiro-agent.container | 2 +- packaging/quadlet/moshiro-probe.container | 2 +- web/admin/package.json | 2 +- web/display/package.json | 2 +- web/package-lock.json | 8 ++++---- web/package.json | 2 +- 14 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 backend/shared/MoShiro.Protocol/BuildInfo.Summary.cs diff --git a/backend/Directory.Build.props b/backend/Directory.Build.props index acfc230..21418f8 100644 --- a/backend/Directory.Build.props +++ b/backend/Directory.Build.props @@ -13,7 +13,7 @@ true $(MSBuildThisFileDirectory)artifacts true - 0.4.0 + 0.0.0-dev false diff --git a/backend/agent/src/MoShiro.Agent/AgentApp.cs b/backend/agent/src/MoShiro.Agent/AgentApp.cs index ba74b8e..d0e61d4 100644 --- a/backend/agent/src/MoShiro.Agent/AgentApp.cs +++ b/backend/agent/src/MoShiro.Agent/AgentApp.cs @@ -143,6 +143,7 @@ public sealed class AgentApp : IDisposable public async Task RunAsync(CancellationToken ct) { + _log.Info("moshiro agent starting", MoShiro.Protocol.BuildInfo.Fields); using CancellationTokenSource linked = CancellationTokenSource.CreateLinkedTokenSource(ct); // 数据面和控制端口先开始监听,再连接 Backend:hello 里上报的是实际端口 _udp.Bind(); diff --git a/backend/probe/src/MoShiro.Probe/ProbeApp.cs b/backend/probe/src/MoShiro.Probe/ProbeApp.cs index 5cc7f9c..fd8aee5 100644 --- a/backend/probe/src/MoShiro.Probe/ProbeApp.cs +++ b/backend/probe/src/MoShiro.Probe/ProbeApp.cs @@ -103,6 +103,7 @@ public sealed class ProbeApp : IDisposable public async Task RunAsync(CancellationToken ct) { + _log.Info("moshiro probe starting", MoShiro.Protocol.BuildInfo.Fields); if (_env.Directory.Agents.Count == 0) { _log.Info("no agents known yet, waiting for the panel to send the list"); diff --git a/backend/shared/MoShiro.Protocol/BuildInfo.Summary.cs b/backend/shared/MoShiro.Protocol/BuildInfo.Summary.cs new file mode 100644 index 0000000..0e3c85c --- /dev/null +++ b/backend/shared/MoShiro.Protocol/BuildInfo.Summary.cs @@ -0,0 +1,19 @@ +namespace MoShiro.Protocol; + +/// 构建信息的人能读的形式(启动时打进日志);常量部分由 MoShiro.Protocol.csproj 的 WriteBuildInfo 在构建时生成。 +public static partial class BuildInfo +{ + /// 版本、tag、提交、构建时间的字段,没有的(本地构建不设环境变量)写 unknown。 + public static (string Key, object? Value)[] Fields { get; } = + [ + ("version", Or(Version)), + ("tag", Or(Tag)), + ("commit", Or(Commit)), + ("built_at", Or(BuiltAt)), + ]; + + /// 一行摘要,例如:0.4.1-dev.2-a3338e1 (tag v0.4.1-dev.2-a3338e1, commit a3338e1b2c, built 2026-10-09T03:00:00Z)。 + public static string Summary => $"{Or(Version)} (tag {Or(Tag)}, commit {Or(Commit)}, built {Or(BuiltAt)})"; + + private static string Or(string value) => string.IsNullOrWhiteSpace(value) ? "unknown" : value; +} diff --git a/backend/shared/MoShiro.Protocol/MoShiro.Protocol.csproj b/backend/shared/MoShiro.Protocol/MoShiro.Protocol.csproj index 5eb7cd2..6405701 100644 --- a/backend/shared/MoShiro.Protocol/MoShiro.Protocol.csproj +++ b/backend/shared/MoShiro.Protocol/MoShiro.Protocol.csproj @@ -18,7 +18,7 @@ - + diff --git a/backend/src/MoShiro.Backend/Program.cs b/backend/src/MoShiro.Backend/Program.cs index 2d22be8..3cb6164 100644 --- a/backend/src/MoShiro.Backend/Program.cs +++ b/backend/src/MoShiro.Backend/Program.cs @@ -1,3 +1,10 @@ using MoShiro.Backend; -await BackendHost.Build(args).RunAsync(); +WebApplication app = BackendHost.Build(args); +// 启动时打一行构建信息:版本、tag、提交、构建时间(和 Agent、Probe 启动时打的是同一组) +if (app.Logger.IsEnabled(LogLevel.Information)) +{ + app.Logger.LogInformation("moshiro backend starting: version {BuildInfo}", MoShiro.Protocol.BuildInfo.Summary); +} + +await app.RunAsync(); diff --git a/packaging/compose/agent/compose.yaml b/packaging/compose/agent/compose.yaml index 021d989..5b35034 100644 --- a/packaging/compose/agent/compose.yaml +++ b/packaging/compose/agent/compose.yaml @@ -5,7 +5,7 @@ # 把面板给的 .env 内容存成 .env,再下载本文件为 compose.yaml # podman compose up -d # Docker 用 docker compose # 更新:podman compose pull && podman compose up -d (身份和配置在命名卷里,不会动) -# 固定版本:在 .env 里写 MOSHIRO_VERSION=0.3.3;想要更严,写成 MOSHIRO_VERSION=0.3.3@sha256:。 +# 固定版本:在 .env 里写 MOSHIRO_VERSION=<版本号>;想要更严,写成 MOSHIRO_VERSION=<版本号>@sha256:。 # .env 里的 MOSHIRO_SERVER、MOSHIRO_JOIN(只在第一次启动用来注册,之后可以删掉)、MOSHIRO_GENESIS、MOSHIRO_CONTROLLERS、MOSHIRO_NAME 原样传进容器。 # 说明见 docs/ops/deployment.md。 services: diff --git a/packaging/compose/probe/compose.yaml b/packaging/compose/probe/compose.yaml index 5aaf9d1..cd7e27b 100644 --- a/packaging/compose/probe/compose.yaml +++ b/packaging/compose/probe/compose.yaml @@ -5,7 +5,7 @@ # 把面板给的 .env 内容存成 .env,再下载本文件为 compose.yaml # podman compose up -d # Docker 用 docker compose # 更新:podman compose pull && podman compose up -d (身份和配置在命名卷里,不会动) -# 固定版本:在 .env 里写 MOSHIRO_VERSION=0.3.3;想要更严,写成 MOSHIRO_VERSION=0.3.3@sha256:。 +# 固定版本:在 .env 里写 MOSHIRO_VERSION=<版本号>;想要更严,写成 MOSHIRO_VERSION=<版本号>@sha256:。 # macOS、Windows 的 Docker Desktop 没有宿主网络:面板给的 .env 里已经写了 MOSHIRO_NETWORK_MODE=bridge。 # .env 里的 MOSHIRO_SERVER、MOSHIRO_JOIN(只在第一次启动用来注册,之后可以删掉)、MOSHIRO_GENESIS、MOSHIRO_CONTROLLERS、MOSHIRO_NAME 原样传进容器。 # 说明见 docs/ops/deployment.md。 diff --git a/packaging/quadlet/moshiro-agent.container b/packaging/quadlet/moshiro-agent.container index f6cee5e..d8b36cf 100644 --- a/packaging/quadlet/moshiro-agent.container +++ b/packaging/quadlet/moshiro-agent.container @@ -10,7 +10,7 @@ # loginctl enable-linger $USER # 退出登录后继续运行(需要管理员执行一次) # rootful:本文件放进 /etc/containers/systemd/,.env 内容存成 /etc/moshiro/agent.env,把下面的 EnvironmentFile 改成这个路径、 # WantedBy 改成 multi-user.target,用 systemctl(不加 --user)。 -# 开发通道:把 Image 的 moshiro 换成 moshiro-dev。固定版本:把 :latest 换成 :0.3.3(固定之后更新不会换版本)。 +# 开发通道:把 Image 的 moshiro 换成 moshiro-dev。固定版本:把 :latest 换成 :<版本号>(固定之后更新不会换版本)。 # 想要完全自动、不用在管理端点:另外启用 podman-auto-update.timer,并在 [Container] 里加 AutoUpdate=registry(Pull=always 也保留)。 # 说明见 docs/ops/deployment.md。 [Unit] diff --git a/packaging/quadlet/moshiro-probe.container b/packaging/quadlet/moshiro-probe.container index 3be36f4..5391d70 100644 --- a/packaging/quadlet/moshiro-probe.container +++ b/packaging/quadlet/moshiro-probe.container @@ -10,7 +10,7 @@ # loginctl enable-linger $USER # 退出登录后继续运行(需要管理员执行一次) # rootful:本文件放进 /etc/containers/systemd/,.env 内容存成 /etc/moshiro/probe.env,把下面的 EnvironmentFile 改成这个路径、 # WantedBy 改成 multi-user.target,用 systemctl(不加 --user)。 -# 开发通道:把 Image 的 moshiro 换成 moshiro-dev。固定版本:把 :latest 换成 :0.3.3(固定之后更新不会换版本)。 +# 开发通道:把 Image 的 moshiro 换成 moshiro-dev。固定版本:把 :latest 换成 :<版本号>(固定之后更新不会换版本)。 # 想要完全自动、不用在管理端点:另外启用 podman-auto-update.timer,并在 [Container] 里加 AutoUpdate=registry(Pull=always 也保留)。 # 说明见 docs/ops/deployment.md。 [Unit] diff --git a/web/admin/package.json b/web/admin/package.json index a5f8ab4..ba0703f 100644 --- a/web/admin/package.json +++ b/web/admin/package.json @@ -1,7 +1,7 @@ { "name": "moshiro-admin", "private": true, - "version": "0.1.0", + "version": "0.0.0-dev", "type": "module", "scripts": { "dev": "vite", diff --git a/web/display/package.json b/web/display/package.json index 0a9dab1..327f110 100644 --- a/web/display/package.json +++ b/web/display/package.json @@ -1,7 +1,7 @@ { "name": "moshiro-display", "private": true, - "version": "0.1.0", + "version": "0.0.0-dev", "type": "module", "scripts": { "dev": "vite", diff --git a/web/package-lock.json b/web/package-lock.json index 39dbfa3..970db28 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "moshiro-web", - "version": "0.4.0", + "version": "0.0.0-dev", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "moshiro-web", - "version": "0.4.0", + "version": "0.0.0-dev", "workspaces": [ "display", "admin" @@ -18,7 +18,7 @@ }, "admin": { "name": "moshiro-admin", - "version": "0.1.0", + "version": "0.0.0-dev", "dependencies": { "lucide-react": "^0.468.0", "react": "^19.2.8", @@ -38,7 +38,7 @@ }, "display": { "name": "moshiro-display", - "version": "0.1.0", + "version": "0.0.0-dev", "dependencies": { "lucide-react": "^0.468.0", "react": "^19.2.8", diff --git a/web/package.json b/web/package.json index 0586fbe..df4c8dc 100644 --- a/web/package.json +++ b/web/package.json @@ -1,7 +1,7 @@ { "name": "moshiro-web", "private": true, - "version": "0.4.0", + "version": "0.0.0-dev", "workspaces": [ "display", "admin"