feat: release 2.5.1

This commit is contained in:
2026-09-27 10:40:50 +00:00 Unverified
parent 46d97138dc
commit 5f7509a9c5
53 changed files with 2871 additions and 370 deletions
+38
View File
@@ -64,6 +64,7 @@ export interface BuildStore {
createBuild(record: BuildRecord): Promise<CreateBuildResult>;
getBuild(id: string): Promise<BuildRecord | undefined>;
listBuilds(): Promise<BuildRecord[]>;
pruneBuilds?(limit?: number): Promise<void>;
replaceBuild(
record: BuildRecord,
expectedResourceVersion: string,
@@ -258,6 +259,43 @@ export class MemoryBuildStore implements BuildStore {
return [...this.builds.values()].sort(compareBuildRecords).map(clone);
}
async pruneBuilds(limit = 50): Promise<void> {
if (!Number.isSafeInteger(limit) || limit < 0) return;
const records = await this.listBuilds();
let remaining = records.length;
for (const record of records) {
if (remaining <= limit) break;
const current = this.builds.get(record.metadata.name);
if (
!current ||
current.metadata.resourceVersion !== record.metadata.resourceVersion
)
continue;
if (!terminal(current)) continue;
if (
current.status.reconcileLease &&
Date.parse(current.status.reconcileLease.expiresAt) > Date.now()
)
continue;
if (await this.ownsBuild(current.spec.imageKey, current.metadata.name))
continue;
// ownsBuild yields; revalidate after it so a concurrent lease/status
// update cannot slip between the initial check and this synchronous delete.
const latest = this.builds.get(record.metadata.name);
if (
!latest ||
latest.metadata.resourceVersion !== record.metadata.resourceVersion ||
!terminal(latest) ||
(latest.status.reconcileLease &&
Date.parse(latest.status.reconcileLease.expiresAt) > Date.now())
)
continue;
this.builds.delete(latest.metadata.name);
this.byImage.get(latest.spec.imageKey)?.delete(latest.metadata.name);
remaining--;
}
}
async replaceBuild(
record: BuildRecord,
expectedResourceVersion: string,