Skip to content

Commit 2d0a277

Browse files
committed
[prebuilds] Introduce 'failed' state for prebuilds
Distinguish between failed tasks but finished prebuilds and fully failed prebuilds (no snapshot) fixes #8592
1 parent 2863582 commit 2d0a277

File tree

7 files changed

+19
-9
lines changed

7 files changed

+19
-9
lines changed

components/dashboard/src/projects/Prebuilds.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,8 @@ export function prebuildStatusLabel(prebuild?: PrebuildWithStatus) {
248248
return (<span className="font-medium text-blue-500 uppercase">running</span>);
249249
case "aborted":
250250
return (<span className="font-medium text-gray-500 uppercase">canceled</span>);
251+
case "failed":
252+
return (<span className="font-medium text-red-500 uppercase">failed</span>);
251253
case "timeout":
252254
return (<span className="font-medium text-red-500 uppercase">failed</span>);
253255
case "available":

components/dashboard/src/projects/Project.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ export default function () {
250250
<a href={gitpodHostUrl.withContext(`${branch.url}`).toString()}>
251251
<button className={`primary mr-2 py-2 opacity-0 group-hover:opacity-100`}>New Workspace</button>
252252
</a>
253-
<ItemFieldContextMenu className="py-0.5" menuEntries={(!prebuild || prebuild.status === 'aborted' || prebuild.status === 'timeout' || !!prebuild.error)
253+
<ItemFieldContextMenu className="py-0.5" menuEntries={(!prebuild || prebuild.status === 'aborted' || prebuild.status === 'failed' || prebuild.status === 'timeout' || !!prebuild.error)
254254
? [{
255255
title: `${prebuild ? 'Rerun' : 'Run'} Prebuild (${branch.name})`,
256256
onClick: () => triggerPrebuild(branch),

components/gitpod-protocol/src/headless-workspace-log.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export enum HeadlessWorkspaceEventType {
1111
FinishedButFailed = "finish-fail",
1212
AbortedTimedOut = "aborted-timeout",
1313
Aborted = "aborted",
14+
Failed = "failed",
1415
Started = "started"
1516
}
1617
export namespace HeadlessWorkspaceEventType {

components/gitpod-protocol/src/protocol.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,9 @@ export type PrebuiltWorkspaceState
650650
// the prebuild timed out
651651
| "timeout"
652652
// the prebuild has finished and a snapshot is available
653-
| "available";
653+
| "available"
654+
//
655+
| "failed";
654656

655657
export interface PrebuiltWorkspace {
656658
id: string;

components/server/ee/src/prebuilds/prebuild-manager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export class PrebuildManager {
7272
}
7373
const existingPB = await this.workspaceDB.trace({ span }).findPrebuiltWorkspaceByCommit(cloneURL, commit);
7474
// If the existing prebuild is failed, we want to retrigger it.
75-
if (!!existingPB && existingPB.state !== 'aborted' && existingPB.state !== 'timeout' && !existingPB.error) {
75+
if (!!existingPB && existingPB.state !== 'aborted' && existingPB.state !== 'failed' && existingPB.state !== 'timeout') {
7676
// If the existing prebuild is based on an outdated project config, we also want to retrigger it.
7777
const existingPBWS = await this.workspaceDB.trace({ span }).findById(existingPB.buildWorkspaceId);
7878
const existingConfig = existingPBWS?.config;

components/server/ee/src/prebuilds/prebuilt-status-maintainer.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,16 +102,18 @@ export class PrebuildStatusMaintainer implements Disposable {
102102
protected getConclusionFromPrebuildState(pws: PrebuiltWorkspace): "error" | "failure" | "pending" | "success" {
103103
if (pws.state === "aborted") {
104104
return "error";
105-
} else if (pws.state === "queued") {
106-
return "pending";
105+
} else if (pws.state === "failed") {
106+
return "error";
107107
} else if (pws.state === "timeout") {
108108
return "error";
109+
} else if (pws.state === "queued") {
110+
return "pending";
111+
} else if (pws.state === "building") {
112+
return "pending";
109113
} else if (pws.state === "available" && !pws.error) {
110114
return "success";
111115
} else if (pws.state === "available" && !!pws.error) {
112116
return "failure";
113-
} else if (pws.state === "building") {
114-
return "pending";
115117
} else {
116118
log.warn("Should have updated prebuilt workspace updatable, but don't know how. Resorting to error conclusion.", { pws });
117119
return "error";

components/ws-manager-bridge/ee/src/bridge.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ export class WorkspaceManagerBridgeEE extends WorkspaceManagerBridge {
7777
prebuild.error = status.conditions!.timeout;
7878
headlessUpdateType = HeadlessWorkspaceEventType.AbortedTimedOut;
7979
} else if (!!status.conditions!.failed) {
80-
prebuild.state = "aborted";
80+
prebuild.state = "failed";
8181
prebuild.error = status.conditions!.failed;
82-
headlessUpdateType = HeadlessWorkspaceEventType.Aborted;
82+
headlessUpdateType = HeadlessWorkspaceEventType.Failed;
8383
} else if (!!status.conditions!.stoppedByRequest) {
8484
prebuild.state = "aborted";
8585
prebuild.error = "Cancelled";
@@ -89,6 +89,9 @@ export class WorkspaceManagerBridgeEE extends WorkspaceManagerBridge {
8989
prebuild.error = status.conditions!.headlessTaskFailed;
9090
prebuild.snapshot = status.conditions!.snapshot;
9191
headlessUpdateType = HeadlessWorkspaceEventType.FinishedButFailed;
92+
} else if (!status.conditions!.snapshot) {
93+
prebuild.state = "failed";
94+
headlessUpdateType = HeadlessWorkspaceEventType.Failed;
9295
} else {
9396
prebuild.state = "available";
9497
prebuild.snapshot = status.conditions!.snapshot;

0 commit comments

Comments
 (0)