Compare commits

..

3 Commits

Author SHA1 Message Date
kjh2064 6d9937c590 fix(web): calculate correct Hangfire job StartedAt using TotalDuration metadata
Validators (Pushes and Pull Requests) / validate-ui-and-storage (push) Successful in 16s
Validators (Pushes and Pull Requests) / validate-core (push) Successful in 1m46s
2026-07-12 14:15:46 +09:00
kjh2064 ef6f9c74f6 fix(web): define explicit action endpoint with handler query for operations manual trigger form
Validators (Pushes and Pull Requests) / validate-ui-and-storage (push) Successful in 15s
Validators (Pushes and Pull Requests) / validate-core (push) Successful in 1m45s
2026-07-12 14:10:40 +09:00
kjh2064 24ec410f3d feat(web): publish version.txt in build pipeline for deterministic live server versioning
Validators (Pushes and Pull Requests) / validate-ui-and-storage (push) Successful in 16s
Validators (Pushes and Pull Requests) / validate-core (push) Successful in 1m46s
2026-07-12 14:05:10 +09:00
5 changed files with 55 additions and 13 deletions
+4
View File
@@ -96,6 +96,10 @@ jobs:
--no-restore \
--no-build
- name: Write Version Text
run: |
echo "${{ steps.metadata.outputs.version }}" > ./publish/version.txt
- name: Write Production Config
run: |
mkdir -p ./publish
@@ -22,6 +22,20 @@ public class LoginModel : PageModel
{
get
{
// 1. Try reading version.txt from application base directory
try
{
var txtPath = Path.Combine(AppContext.BaseDirectory, "version.txt");
if (System.IO.File.Exists(txtPath))
{
var txtVersion = System.IO.File.ReadAllText(txtPath).Trim();
if (!string.IsNullOrEmpty(txtVersion))
return txtVersion;
}
}
catch {}
// 2. Try reading raw assembly version
var rawVersion = Assembly.GetEntryAssembly()
?.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
?.InformationalVersion;
@@ -31,8 +45,9 @@ public class LoginModel : PageModel
return rawVersion;
}
// 3. Fallback to dynamic local Git parsing if available
var dateStr = DateTime.UtcNow.AddHours(9).ToString("yyyyMMdd");
string gitHash = "c6f269e";
string gitHash = "024122d";
try
{
var baseDir = AppContext.BaseDirectory;
@@ -23,6 +23,20 @@ public class IndexModel : PageModel
{
get
{
// 1. Try reading version.txt from application base directory
try
{
var txtPath = Path.Combine(AppContext.BaseDirectory, "version.txt");
if (System.IO.File.Exists(txtPath))
{
var txtVersion = System.IO.File.ReadAllText(txtPath).Trim();
if (!string.IsNullOrEmpty(txtVersion))
return txtVersion;
}
}
catch {}
// 2. Try reading raw assembly version
var rawVersion = Assembly.GetEntryAssembly()
?.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
?.InformationalVersion;
@@ -32,8 +46,9 @@ public class IndexModel : PageModel
return rawVersion;
}
// 3. Fallback to dynamic local Git parsing if available
var dateStr = DateTime.UtcNow.AddHours(9).ToString("yyyyMMdd");
string gitHash = "c6f269e";
string gitHash = "024122d";
try
{
var baseDir = AppContext.BaseDirectory;
@@ -68,7 +68,7 @@
}
</td>
<td>
<form method="post" asp-page-handler="TriggerJob" class="d-inline">
<form method="post" action="/Admin/Operations?handler=TriggerJob" class="d-inline">
@Html.AntiForgeryToken()
<input type="hidden" name="jobId" value="@job.JobId" />
<button type="submit" class="btn btn-sm btn-success text-white">즉시 실행</button>
@@ -87,18 +87,26 @@ public class IndexModel : PageModel
InactiveJobsCount = TotalJobsCount - ActiveJobsCount;
var succeeded = monitoringApi.SucceededJobs(0, 10)
.Select(kv => new JobExecutionInfo(
kv.Value.Job?.Method.Name ?? kv.Key,
kv.Value.SucceededAt ?? DateTime.UtcNow,
kv.Value.SucceededAt,
true));
.Select(kv => {
var succeededAt = kv.Value.SucceededAt ?? DateTime.UtcNow;
var durationMs = kv.Value.TotalDuration ?? 0;
var startedAt = succeededAt.AddMilliseconds(-durationMs);
return new JobExecutionInfo(
kv.Value.Job?.Method.Name ?? kv.Key,
startedAt,
succeededAt,
true);
});
var failed = monitoringApi.FailedJobs(0, 10)
.Select(kv => new JobExecutionInfo(
kv.Value.Job?.Method.Name ?? kv.Key,
kv.Value.FailedAt ?? DateTime.UtcNow,
kv.Value.FailedAt,
false));
.Select(kv => {
var failedAt = kv.Value.FailedAt ?? DateTime.UtcNow;
return new JobExecutionInfo(
kv.Value.Job?.Method.Name ?? kv.Key,
failedAt,
failedAt,
false);
});
RecentExecutions = succeeded.Concat(failed)
.OrderByDescending(e => e.StartedAt)