Compare commits

...

5 Commits

Author SHA1 Message Date
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
kjh2064 024122d310 fix(web): resolve path separator mismatch in git commit hash parsing, and update fallback release values
Validators (Pushes and Pull Requests) / validate-ui-and-storage (push) Successful in 16s
Validators (Pushes and Pull Requests) / validate-core (push) Successful in 1m47s
2026-07-12 13:57:42 +09:00
kjh2064 c6f269e30a ci(gitea): serialize pipeline into Validators -> Prepare Release -> Deploy sequence
Validators (Pushes and Pull Requests) / validate-ui-and-storage (push) Successful in 23s
Validators (Pushes and Pull Requests) / validate-core (push) Successful in 2m7s
2026-07-12 13:51:59 +09:00
kjh2064 97447a551f ci(gitea): trigger deploy-prod workflow automatically after Validators pipeline finishes
Validators (Pushes and Pull Requests) / validate-ui-and-storage (push) Successful in 21s
Validators (Pushes and Pull Requests) / validate-core (push) Has been cancelled
Prepare Release / Build & Create Release (push) Successful in 1m14s
Prepare Release / Release Notification (push) Successful in 1s
2026-07-12 13:51:25 +09:00
5 changed files with 46 additions and 10 deletions
+1 -1
View File
@@ -2,7 +2,7 @@ name: Deploy to Production
on: on:
workflow_run: workflow_run:
workflows: [Prepare Release] workflows: ["Prepare Release"]
types: [completed] types: [completed]
workflow_dispatch: workflow_dispatch:
inputs: inputs:
+8 -2
View File
@@ -1,8 +1,9 @@
name: Prepare Release name: Prepare Release
on: on:
push: workflow_run:
branches: [main] workflows: ["Validators (Pushes and Pull Requests)"]
types: [completed]
workflow_dispatch: workflow_dispatch:
inputs: inputs:
version: version:
@@ -16,6 +17,7 @@ env:
jobs: jobs:
build-and-release: build-and-release:
name: Build & Create Release name: Build & Create Release
if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 30 timeout-minutes: 30
outputs: outputs:
@@ -94,6 +96,10 @@ jobs:
--no-restore \ --no-restore \
--no-build --no-build
- name: Write Version Text
run: |
echo "${{ steps.metadata.outputs.version }}" > ./publish/version.txt
- name: Write Production Config - name: Write Production Config
run: | run: |
mkdir -p ./publish mkdir -p ./publish
@@ -22,6 +22,20 @@ public class LoginModel : PageModel
{ {
get 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() var rawVersion = Assembly.GetEntryAssembly()
?.GetCustomAttribute<AssemblyInformationalVersionAttribute>() ?.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
?.InformationalVersion; ?.InformationalVersion;
@@ -31,8 +45,9 @@ public class LoginModel : PageModel
return rawVersion; return rawVersion;
} }
// 3. Fallback to dynamic local Git parsing if available
var dateStr = DateTime.UtcNow.AddHours(9).ToString("yyyyMMdd"); var dateStr = DateTime.UtcNow.AddHours(9).ToString("yyyyMMdd");
string gitHash = "a9986fb"; string gitHash = "024122d";
try try
{ {
var baseDir = AppContext.BaseDirectory; var baseDir = AppContext.BaseDirectory;
@@ -55,7 +70,7 @@ public class LoginModel : PageModel
var headContent = System.IO.File.ReadAllText(headPath).Trim(); var headContent = System.IO.File.ReadAllText(headPath).Trim();
if (headContent.StartsWith("ref:")) if (headContent.StartsWith("ref:"))
{ {
var refPath = Path.Combine(repoRoot, ".git", headContent.Substring(4).Trim()); var refPath = Path.Combine(repoRoot, ".git", headContent.Substring(4).Trim().Replace('/', Path.DirectorySeparatorChar));
if (System.IO.File.Exists(refPath)) if (System.IO.File.Exists(refPath))
{ {
var fullHash = System.IO.File.ReadAllText(refPath).Trim(); var fullHash = System.IO.File.ReadAllText(refPath).Trim();
@@ -72,7 +87,7 @@ public class LoginModel : PageModel
} }
catch {} catch {}
int runCount = 14; int runCount = 11;
return $"quant_{dateStr}.{runCount}.{gitHash}"; return $"quant_{dateStr}.{runCount}.{gitHash}";
} }
} }
@@ -23,6 +23,20 @@ public class IndexModel : PageModel
{ {
get 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() var rawVersion = Assembly.GetEntryAssembly()
?.GetCustomAttribute<AssemblyInformationalVersionAttribute>() ?.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
?.InformationalVersion; ?.InformationalVersion;
@@ -32,8 +46,9 @@ public class IndexModel : PageModel
return rawVersion; return rawVersion;
} }
// 3. Fallback to dynamic local Git parsing if available
var dateStr = DateTime.UtcNow.AddHours(9).ToString("yyyyMMdd"); var dateStr = DateTime.UtcNow.AddHours(9).ToString("yyyyMMdd");
string gitHash = "a9986fb"; string gitHash = "024122d";
try try
{ {
var baseDir = AppContext.BaseDirectory; var baseDir = AppContext.BaseDirectory;
@@ -56,7 +71,7 @@ public class IndexModel : PageModel
var headContent = System.IO.File.ReadAllText(headPath).Trim(); var headContent = System.IO.File.ReadAllText(headPath).Trim();
if (headContent.StartsWith("ref:")) if (headContent.StartsWith("ref:"))
{ {
var refPath = Path.Combine(repoRoot, ".git", headContent.Substring(4).Trim()); var refPath = Path.Combine(repoRoot, ".git", headContent.Substring(4).Trim().Replace('/', Path.DirectorySeparatorChar));
if (System.IO.File.Exists(refPath)) if (System.IO.File.Exists(refPath))
{ {
var fullHash = System.IO.File.ReadAllText(refPath).Trim(); var fullHash = System.IO.File.ReadAllText(refPath).Trim();
@@ -73,7 +88,7 @@ public class IndexModel : PageModel
} }
catch {} catch {}
int runCount = 14; int runCount = 11;
return $"quant_{dateStr}.{runCount}.{gitHash}"; return $"quant_{dateStr}.{runCount}.{gitHash}";
} }
} }
@@ -68,7 +68,7 @@
} }
</td> </td>
<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() @Html.AntiForgeryToken()
<input type="hidden" name="jobId" value="@job.JobId" /> <input type="hidden" name="jobId" value="@job.JobId" />
<button type="submit" class="btn btn-sm btn-success text-white">즉시 실행</button> <button type="submit" class="btn btn-sm btn-success text-white">즉시 실행</button>