UI work to fill SBOM sourcing management gap. UI planning remaining functionality exposure. Work on CI/Tests stabilization

Introduces CGS determinism test runs to CI workflows for Windows, macOS, Linux, Alpine, and Debian, fulfilling CGS-008 cross-platform requirements. Updates local-ci scripts to support new smoke steps, test timeouts, progress intervals, and project slicing for improved test isolation and diagnostics.
This commit is contained in:
master
2025-12-29 19:12:38 +02:00
parent 41552d26ec
commit a4badc275e
286 changed files with 50918 additions and 992 deletions

View File

@@ -91,6 +91,9 @@ builder.Services.AddSingleton<ISbomLineageGraphService, SbomLineageGraphService>
// LIN-BE-028: Lineage compare service
builder.Services.AddSingleton<ILineageCompareService, LineageCompareService>();
// LIN-010: Lineage export service for evidence packs
builder.Services.AddSingleton<ILineageExportService, LineageExportService>();
// LIN-BE-023: Replay hash service
builder.Services.AddSingleton<IReplayHashService, ReplayHashService>();
@@ -824,6 +827,41 @@ app.MapGet("/api/v1/lineage/{artifactDigest}/parents", async Task<IResult> (
return Results.Ok(new { childDigest = artifactDigest.Trim(), parents });
});
app.MapPost("/api/v1/lineage/export", async Task<IResult> (
[FromServices] ILineageExportService exportService,
[FromBody] LineageExportRequest request,
CancellationToken cancellationToken) =>
{
if (string.IsNullOrWhiteSpace(request.FromDigest) || string.IsNullOrWhiteSpace(request.ToDigest))
{
return Results.BadRequest(new { error = "fromDigest and toDigest are required" });
}
if (string.IsNullOrWhiteSpace(request.TenantId))
{
return Results.BadRequest(new { error = "tenantId is required" });
}
using var activity = SbomTracing.Source.StartActivity("lineage.export", ActivityKind.Server);
activity?.SetTag("tenant", request.TenantId);
activity?.SetTag("from_digest", request.FromDigest);
activity?.SetTag("to_digest", request.ToDigest);
var result = await exportService.ExportAsync(request, cancellationToken);
if (result is null)
{
return Results.StatusCode(500);
}
if (result.SizeBytes > 50 * 1024 * 1024)
{
return Results.StatusCode(413); // Payload Too Large
}
return Results.Ok(result);
});
// -----------------------------------------------------------------------------
// Lineage Compare API (LIN-BE-028)
// Sprint: SPRINT_20251228_007_BE_sbom_lineage_graph_ii