OPC # 0006: OPC Git Trunk-Based management
Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
@@ -17,6 +17,7 @@ public class ReleaseRecord
|
||||
public DateTimeOffset? FinishedAt { get; set; }
|
||||
public List<TenantReleaseResult> Tenants { get; set; } = [];
|
||||
public List<string> OpcNumbers { get; set; } = [];
|
||||
public string? CommitSha { get; set; } // Clarity branch HEAD SHA at release time
|
||||
}
|
||||
|
||||
public class TenantReleaseResult
|
||||
|
||||
@@ -142,13 +142,13 @@ public class BuildHistoryService(NpgsqlDataSource db, ILogger<BuildHistoryServic
|
||||
|
||||
// ── Releases ────────────────────────────────────────────────────────────
|
||||
|
||||
public async Task<ReleaseRecord> CreateReleaseAsync(string environment, string imageName)
|
||||
public async Task<ReleaseRecord> CreateReleaseAsync(string environment, string imageName, string? commitSha = null)
|
||||
{
|
||||
var record = new ReleaseRecord { Environment = environment, ImageName = imageName };
|
||||
var record = new ReleaseRecord { Environment = environment, ImageName = imageName, CommitSha = commitSha };
|
||||
|
||||
await using var cmd = db.CreateCommand("""
|
||||
INSERT INTO release_record (id, environment, image_name, status, started_at, opc_numbers)
|
||||
VALUES ($1, $2, $3, $4, $5, $6)
|
||||
INSERT INTO release_record (id, environment, image_name, status, started_at, opc_numbers, commit_sha)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
||||
""");
|
||||
cmd.Parameters.AddWithValue(record.Id);
|
||||
cmd.Parameters.AddWithValue(record.Environment);
|
||||
@@ -156,6 +156,7 @@ public class BuildHistoryService(NpgsqlDataSource db, ILogger<BuildHistoryServic
|
||||
cmd.Parameters.AddWithValue(record.Status.ToString());
|
||||
cmd.Parameters.AddWithValue(record.StartedAt);
|
||||
cmd.Parameters.Add(new NpgsqlParameter<string[]> { TypedValue = [.. record.OpcNumbers] });
|
||||
cmd.Parameters.AddWithValue((object?)record.CommitSha ?? DBNull.Value);
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
|
||||
return record;
|
||||
@@ -169,12 +170,13 @@ 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, opc_numbers = $4 WHERE id = $1
|
||||
UPDATE release_record SET status = $2, finished_at = $3, opc_numbers = $4, commit_sha = $5 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] });
|
||||
upd.Parameters.AddWithValue((object?)record.CommitSha ?? DBNull.Value);
|
||||
await upd.ExecuteNonQueryAsync();
|
||||
|
||||
// Replace tenant results wholesale on each update
|
||||
@@ -206,7 +208,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, opc_numbers
|
||||
SELECT id, environment, image_name, status, started_at, finished_at, opc_numbers, commit_sha
|
||||
FROM release_record
|
||||
ORDER BY started_at DESC
|
||||
LIMIT 50
|
||||
@@ -224,6 +226,7 @@ public class BuildHistoryService(NpgsqlDataSource db, ILogger<BuildHistoryServic
|
||||
StartedAt = reader.GetFieldValue<DateTimeOffset>(4),
|
||||
FinishedAt = reader.IsDBNull(5) ? null : reader.GetFieldValue<DateTimeOffset>(5),
|
||||
OpcNumbers = reader.IsDBNull(6) ? [] : [.. reader.GetFieldValue<string[]>(6)],
|
||||
CommitSha = reader.IsDBNull(7) ? null : reader.GetString(7),
|
||||
};
|
||||
ordered.Add(r);
|
||||
lookup[r.Id] = r;
|
||||
@@ -254,5 +257,34 @@ public class BuildHistoryService(NpgsqlDataSource db, ILogger<BuildHistoryServic
|
||||
|
||||
return ordered;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the most recent succeeded release for <paramref name="environment"/>, or null if none exists.
|
||||
/// Used to calculate the OPC ticket delta between releases (previousSha..currentSha).
|
||||
/// </summary>
|
||||
public async Task<ReleaseRecord?> GetLastSuccessfulReleaseForEnvAsync(string environment)
|
||||
{
|
||||
await using var cmd = db.CreateCommand("""
|
||||
SELECT id, environment, image_name, status, started_at, finished_at, opc_numbers, commit_sha
|
||||
FROM release_record
|
||||
WHERE environment = $1 AND status = 'Succeeded'
|
||||
ORDER BY started_at DESC
|
||||
LIMIT 1
|
||||
""");
|
||||
cmd.Parameters.AddWithValue(environment);
|
||||
await using var reader = await cmd.ExecuteReaderAsync();
|
||||
if (!await reader.ReadAsync()) return null;
|
||||
return new ReleaseRecord
|
||||
{
|
||||
Id = reader.GetString(0),
|
||||
Environment = reader.GetString(1),
|
||||
ImageName = reader.GetString(2),
|
||||
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)],
|
||||
CommitSha = reader.IsDBNull(7) ? null : reader.GetString(7),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user