OPC # 0006: OPC Git Trunk-Based management
Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
@@ -104,6 +104,42 @@ public class BuildHistoryService(NpgsqlDataSource db, ILogger<BuildHistoryServic
|
||||
return result;
|
||||
}
|
||||
|
||||
// ── Builds by SHA ────────────────────────────────────────────────────────
|
||||
|
||||
/// <summary>Returns all build records whose <c>commit_sha</c> exactly matches <paramref name="sha"/>.</summary>
|
||||
public async Task<List<BuildRecord>> GetBuildsByShaAsync(string sha)
|
||||
{
|
||||
var result = new List<BuildRecord>();
|
||||
|
||||
await using var cmd = db.CreateCommand("""
|
||||
SELECT id, kind, target, status, started_at, finished_at, duration_ms, image_digest, commit_sha, log
|
||||
FROM build_record
|
||||
WHERE commit_sha = $1
|
||||
ORDER BY started_at DESC
|
||||
""");
|
||||
cmd.Parameters.AddWithValue(sha);
|
||||
await using var reader = await cmd.ExecuteReaderAsync();
|
||||
while (await reader.ReadAsync())
|
||||
{
|
||||
var logText = reader.IsDBNull(9) ? "" : reader.GetString(9);
|
||||
result.Add(new BuildRecord
|
||||
{
|
||||
Id = reader.GetString(0),
|
||||
Kind = Enum.Parse<BuildKind>(reader.GetString(1)),
|
||||
Target = reader.GetString(2),
|
||||
Status = Enum.Parse<BuildStatus>(reader.GetString(3)),
|
||||
StartedAt = reader.GetFieldValue<DateTimeOffset>(4),
|
||||
FinishedAt = reader.IsDBNull(5) ? null : reader.GetFieldValue<DateTimeOffset>(5),
|
||||
DurationMs = reader.IsDBNull(6) ? null : reader.GetInt32(6),
|
||||
ImageDigest = reader.IsDBNull(7) ? null : reader.GetString(7),
|
||||
CommitSha = reader.IsDBNull(8) ? null : reader.GetString(8),
|
||||
Log = logText.Length == 0 ? [] : [.. logText.Split('\n')],
|
||||
});
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// ── Releases ────────────────────────────────────────────────────────────
|
||||
|
||||
public async Task<ReleaseRecord> CreateReleaseAsync(string environment, string imageName)
|
||||
@@ -111,14 +147,15 @@ public class BuildHistoryService(NpgsqlDataSource db, ILogger<BuildHistoryServic
|
||||
var record = new ReleaseRecord { Environment = environment, ImageName = imageName };
|
||||
|
||||
await using var cmd = db.CreateCommand("""
|
||||
INSERT INTO release_record (id, environment, image_name, status, started_at)
|
||||
VALUES ($1, $2, $3, $4, $5)
|
||||
INSERT INTO release_record (id, environment, image_name, status, started_at, opc_numbers)
|
||||
VALUES ($1, $2, $3, $4, $5, $6)
|
||||
""");
|
||||
cmd.Parameters.AddWithValue(record.Id);
|
||||
cmd.Parameters.AddWithValue(record.Environment);
|
||||
cmd.Parameters.AddWithValue(record.ImageName);
|
||||
cmd.Parameters.AddWithValue(record.Status.ToString());
|
||||
cmd.Parameters.AddWithValue(record.StartedAt);
|
||||
cmd.Parameters.Add(new NpgsqlParameter<string[]> { TypedValue = [.. record.OpcNumbers] });
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
|
||||
return record;
|
||||
@@ -132,11 +169,12 @@ public class BuildHistoryService(NpgsqlDataSource db, ILogger<BuildHistoryServic
|
||||
await using var tx = await conn.BeginTransactionAsync();
|
||||
|
||||
await using var upd = new NpgsqlCommand("""
|
||||
UPDATE release_record SET status = $2, finished_at = $3 WHERE id = $1
|
||||
UPDATE release_record SET status = $2, finished_at = $3, opc_numbers = $4 WHERE id = $1
|
||||
""", conn, tx);
|
||||
upd.Parameters.AddWithValue(record.Id);
|
||||
upd.Parameters.AddWithValue(record.Status.ToString());
|
||||
upd.Parameters.AddWithValue(record.FinishedAt!.Value);
|
||||
upd.Parameters.Add(new NpgsqlParameter<string[]> { TypedValue = [.. record.OpcNumbers] });
|
||||
await upd.ExecuteNonQueryAsync();
|
||||
|
||||
// Replace tenant results wholesale on each update
|
||||
@@ -168,7 +206,7 @@ public class BuildHistoryService(NpgsqlDataSource db, ILogger<BuildHistoryServic
|
||||
var lookup = new Dictionary<string, ReleaseRecord>();
|
||||
|
||||
await using var cmd = db.CreateCommand("""
|
||||
SELECT id, environment, image_name, status, started_at, finished_at
|
||||
SELECT id, environment, image_name, status, started_at, finished_at, opc_numbers
|
||||
FROM release_record
|
||||
ORDER BY started_at DESC
|
||||
LIMIT 50
|
||||
@@ -185,6 +223,7 @@ public class BuildHistoryService(NpgsqlDataSource db, ILogger<BuildHistoryServic
|
||||
Status = Enum.Parse<ReleaseStatus>(reader.GetString(3)),
|
||||
StartedAt = reader.GetFieldValue<DateTimeOffset>(4),
|
||||
FinishedAt = reader.IsDBNull(5) ? null : reader.GetFieldValue<DateTimeOffset>(5),
|
||||
OpcNumbers = reader.IsDBNull(6) ? [] : [.. reader.GetFieldValue<string[]>(6)],
|
||||
};
|
||||
ordered.Add(r);
|
||||
lookup[r.Id] = r;
|
||||
|
||||
Reference in New Issue
Block a user