fix(health): report configured application version
/health read the APP_VERSION environment variable directly, but docker-compose passes App__Version, which binds to the App:Version configuration key. The variable under that name never existed in the container, so the endpoint always reported "unknown". Read App:Version through IConfiguration, the approach AdminSystemController already used for the same value. The resolution rule (configured version, else assembly version) moves to a shared BuildMetadata helper rather than being written twice; AdminSystemController now calls it, so the admin page and /health cannot drift apart. Local development is unaffected: nothing sets App:Version there, and the assembly-version fallback still applies. Tests pin the configuration KEY, not just the behaviour, including that an App__Version environment variable binds to App:Version. The original bug failed silently, so a behavioural test alone would not have caught it. Verified against a running backend: App__Version=9.9.9-test reports 9.9.9-test; unset reports the assembly version rather than "unknown". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
using JobTrackerApi.Data;
|
||||
using JobTrackerApi.Services;
|
||||
@@ -50,20 +49,8 @@ public sealed class AdminSystemController : ControllerBase
|
||||
AiServiceMetrics Ai
|
||||
);
|
||||
|
||||
private static string? NormalizeBuildMetadata(string? value)
|
||||
{
|
||||
var trimmed = (value ?? string.Empty).Trim();
|
||||
if (string.IsNullOrWhiteSpace(trimmed)) return null;
|
||||
|
||||
// Ignore unresolved shell/compose placeholders that would otherwise leak
|
||||
// directly into the admin UI, e.g. $(git rev-parse --short HEAD) or ${APP_COMMIT_SHA}.
|
||||
if ((trimmed.StartsWith("$(") && trimmed.EndsWith(")")) || (trimmed.StartsWith("${") && trimmed.EndsWith("}")))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return trimmed;
|
||||
}
|
||||
// Shared with the /health endpoint so both report the same version from the same key.
|
||||
private static string? NormalizeBuildMetadata(string? value) => BuildMetadata.Normalize(value);
|
||||
|
||||
private EmailSettingsSnapshot BuildFallbackEmailSettingsSnapshot()
|
||||
{
|
||||
@@ -221,11 +208,7 @@ public sealed class AdminSystemController : ControllerBase
|
||||
LastError: ex.Message);
|
||||
}
|
||||
|
||||
var version = NormalizeBuildMetadata(_cfg["App:Version"]);
|
||||
if (string.IsNullOrWhiteSpace(version))
|
||||
{
|
||||
version = Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "unknown";
|
||||
}
|
||||
var version = BuildMetadata.ResolveVersion(_cfg);
|
||||
|
||||
var commitSha = NormalizeBuildMetadata(_cfg["App:CommitSha"]);
|
||||
var buildStamp = NormalizeBuildMetadata(_cfg["App:BuildStamp"]);
|
||||
|
||||
Reference in New Issue
Block a user