@@ -204,41 +198,39 @@ export default function () {
>;
}
-export function prebuildStatusLabel(status: PrebuiltWorkspaceState | undefined) {
- switch (status) {
- case "aborted":
+export function prebuildStatusLabel(prebuild?: PrebuildWithStatus) {
+ if (prebuild?.error) {
+ return (
failed );
+ }
+ switch (prebuild?.status) {
+ case undefined: // Fall through
+ case "queued":
+ return (
pending );
+ case "building":
+ return (
running );
+ case "aborted": // Fall through
+ case "timeout":
return (
failed );
case "available":
return (
ready );
- case "building":
- return (
running );
- case "queued":
- return (
pending );
- default:
- break;
}
}
-export function prebuildStatusIcon(status: PrebuiltWorkspaceState | undefined) {
- switch (status) {
- case "aborted":
- return (
-
- )
- case "available":
- return (
-
- );
- case "building":
- return (
-
- );
+export function prebuildStatusIcon(prebuild?: PrebuildWithStatus) {
+ if (prebuild?.error) {
+ return
;
+ }
+ switch (prebuild?.status) {
+ case undefined: // Fall through
case "queued":
- return (
-
- );
- default:
- break;
+ return
;
+ case "building":
+ return
;
+ case "aborted": // Fall through
+ case "timeout":
+ return
;
+ case "available":
+ return
;
}
}
@@ -262,7 +254,8 @@ export function PrebuildInstanceStatus(props: { prebuildInstance?: WorkspaceInst
case 'creating': // Fall through
case 'initializing': // Fall through
case 'running': // Fall through
- case 'interrupted':
+ case 'interrupted': // Fall through
+ case 'stopping':
status =
RUNNING
@@ -272,7 +265,6 @@ export function PrebuildInstanceStatus(props: { prebuildInstance?: WorkspaceInst
Prebuild in progress ...
;
break;
- case 'stopping': // Fall through
case 'stopped':
status =
@@ -286,7 +278,7 @@ export function PrebuildInstanceStatus(props: { prebuildInstance?: WorkspaceInst
;
break;
}
- if (props.prebuildInstance?.status.conditions.failed) {
+ if (props.prebuildInstance?.status.conditions.failed || props.prebuildInstance?.status.conditions.headlessTaskFailed) {
status =
FAILED
diff --git a/components/dashboard/src/projects/Project.tsx b/components/dashboard/src/projects/Project.tsx
index 18796e06c7e80d..9b95e5a9b8541e 100644
--- a/components/dashboard/src/projects/Project.tsx
+++ b/components/dashboard/src/projects/Project.tsx
@@ -13,7 +13,6 @@ import { ItemsList, Item, ItemField, ItemFieldContextMenu } from "../components/
import { getGitpodService, gitpodHostUrl } from "../service/service";
import { TeamsContext, getCurrentTeam } from "../teams/teams-context";
import { prebuildStatusIcon, prebuildStatusLabel } from "./Prebuilds";
-import { ContextMenuEntry } from "../components/ContextMenu";
import { shortCommitMessage, toRemoteURL } from "./render-utils";
import Spinner from "../icons/Spinner.svg";
import NoAccess from "../icons/NoAccess.svg";
@@ -120,15 +119,6 @@ export default function () {
});
};
- const branchContextMenu = (branch: Project.BranchDetails) => {
- const entries: ContextMenuEntry[] = [];
- entries.push({
- title: "Rerun Prebuild",
- onClick: () => triggerPrebuild(branch),
- });
- return entries;
- }
-
const lastPrebuild = (branch: Project.BranchDetails) => {
const lastPrebuild = lastPrebuilds.get(branch.name);
if (!lastPrebuild) {
@@ -203,7 +193,6 @@ export default function () {
Prebuild
-
{isLoadingBranches &&
@@ -212,18 +201,17 @@ export default function () {
}
{branches.filter(filter).slice(0, 10).map((branch, index) => {
- const branchName = branch.name;
const prebuild = lastPrebuild(branch); // this might lazily trigger fetching of prebuild details
const avatar = branch.changeAuthorAvatar &&
;
- const statusIcon = prebuildStatusIcon(prebuild?.status);
- const status = prebuildStatusLabel(prebuild?.status);
+ const statusIcon = prebuildStatusIcon(prebuild);
+ const status = prebuildStatusLabel(prebuild);
- return
-
+ return
-
@@ -242,7 +230,12 @@ export default function () {
New Workspace
-
+ triggerPrebuild(branch),
+ }]
+ : []} />
}
diff --git a/components/dashboard/src/projects/Projects.tsx b/components/dashboard/src/projects/Projects.tsx
index 0c36782c37f4f4..cd0112a79454dd 100644
--- a/components/dashboard/src/projects/Projects.tsx
+++ b/components/dashboard/src/projects/Projects.tsx
@@ -14,13 +14,10 @@ import { useContext, useEffect, useState } from "react";
import { getGitpodService } from "../service/service";
import { getCurrentTeam, TeamsContext } from "../teams/teams-context";
import { ThemeContext } from "../theme-context";
-import { PrebuildWithStatus, PrebuiltWorkspaceState, Project } from "@gitpod/gitpod-protocol";
+import { PrebuildWithStatus, Project } from "@gitpod/gitpod-protocol";
import { toRemoteURL } from "./render-utils";
import ContextMenu from "../components/ContextMenu";
-import StatusDone from "../icons/StatusDone.svg";
-import StatusPaused from "../icons/StatusPaused.svg";
-import StatusRunning from "../icons/StatusRunning.svg";
-import StatusFailed from "../icons/StatusFailed.svg";
+import { prebuildStatusIcon } from "./Prebuilds";
export default function () {
const location = useLocation();
@@ -78,21 +75,6 @@ export default function () {
const teamOrUserSlug = !!team ? 't/'+team.slug : 'projects';
- const getPrebuildStatusIcon = (status: PrebuiltWorkspaceState) => {
- switch (status) {
- case undefined: // Fall through
- case "queued":
- return StatusPaused;
- case "building":
- return StatusRunning;
- case "aborted": // Fall through
- case "timeout":
- return StatusFailed;
- case "available":
- return StatusDone;
- }
- }
-
return <>
{projects.length === 0 && (
@@ -160,11 +142,11 @@ export default function () {
{lastPrebuilds.get(p.id)
? (
-
-
-
{lastPrebuilds.get(p.id)?.info?.branch}
-
·
-
{moment(lastPrebuilds.get(p.id)?.info?.startedAt, "YYYYMMDD").fromNow()}
+
+ {prebuildStatusIcon(lastPrebuilds.get(p.id))}
+
{lastPrebuilds.get(p.id)?.info?.branch}
+
·
+
{moment(lastPrebuilds.get(p.id)?.info?.startedAt, "YYYYMMDD").fromNow()}
View All →
diff --git a/components/dashboard/src/settings/EnvironmentVariables.tsx b/components/dashboard/src/settings/EnvironmentVariables.tsx
index 96775c887885a3..b0e1f4c3078bb7 100644
--- a/components/dashboard/src/settings/EnvironmentVariables.tsx
+++ b/components/dashboard/src/settings/EnvironmentVariables.tsx
@@ -216,7 +216,6 @@ export default function EnvVars() {
-
Name
Scope
-
{envVars.map(variable => {
return
-
diff --git a/components/dashboard/src/teams/Members.tsx b/components/dashboard/src/teams/Members.tsx
index c57902714eed2b..28c47e02c39c5a 100644
--- a/components/dashboard/src/teams/Members.tsx
+++ b/components/dashboard/src/teams/Members.tsx
@@ -151,7 +151,6 @@ export default function() {
Role
-
{filteredMembers.length === 0
@@ -190,7 +189,7 @@ export default function() {
customFontStyle: 'text-red-600 dark:text-red-400 hover:text-red-800 dark:hover:text-red-300',
onClick: () => removeTeamMember(m.userId)
}]
- : undefined)} />
+ : [])} />
)}
diff --git a/components/ee/db-sync/src/tests/basic-replication.spec.db.ts b/components/ee/db-sync/src/tests/basic-replication.spec.db.ts
index 5bdbe5591dc0b1..4d05717ea9d987 100644
--- a/components/ee/db-sync/src/tests/basic-replication.spec.db.ts
+++ b/components/ee/db-sync/src/tests/basic-replication.spec.db.ts
@@ -64,7 +64,8 @@ describe('Basic unidirectional replication', () => {
]);
})
- it('Should replicate with a start date', async () => {
+ it('Should replicate with a start date', async function () {
+ this.timeout(10000);
await query(source, `INSERT INTO names VALUES ("9fa18735-c43b-4651-81c5-ddfbdee1035c", "Foo", "1970-01-01 00:00:01.001", 0)`)
await query(source, `INSERT INTO names VALUES ("9fa18735-c43b-4651-81c5-ddfbdee1035d", "Bar", "1980-01-01 00:00:01.001", 0)`)
diff --git a/components/gitpod-db/src/typeorm/workspace-db-impl.ts b/components/gitpod-db/src/typeorm/workspace-db-impl.ts
index 0a4047bcde513a..c870dc10fe692e 100644
--- a/components/gitpod-db/src/typeorm/workspace-db-impl.ts
+++ b/components/gitpod-db/src/typeorm/workspace-db-impl.ts
@@ -567,6 +567,7 @@ export abstract class AbstractTypeORMWorkspaceDBImpl implements WorkspaceDB {
return await repo.save(pws as DBPrebuiltWorkspace);
}
+ // Find the (last triggered) prebuild for a given commit
public async findPrebuiltWorkspaceByCommit(cloneURL: string, commit: string): Promise
{
if (!commit || !cloneURL) {
return undefined;
diff --git a/components/gitpod-protocol/src/teams-projects-protocol.ts b/components/gitpod-protocol/src/teams-projects-protocol.ts
index b96f800512047f..345d4b5495393d 100644
--- a/components/gitpod-protocol/src/teams-projects-protocol.ts
+++ b/components/gitpod-protocol/src/teams-projects-protocol.ts
@@ -57,6 +57,7 @@ export namespace Project {
export interface PrebuildWithStatus {
info: PrebuildInfo;
status: PrebuiltWorkspaceState;
+ error?: string;
}
export interface PrebuildInfo {
@@ -93,7 +94,6 @@ export namespace PrebuildInfo {
export interface StartPrebuildResult {
wsid: string;
done: boolean;
- didFinish?: boolean;
}
export interface Team {
diff --git a/components/server/ee/src/prebuilds/prebuild-manager.ts b/components/server/ee/src/prebuilds/prebuild-manager.ts
index 60e5a38bf2f873..ea4bc56d75a3f3 100644
--- a/components/server/ee/src/prebuilds/prebuild-manager.ts
+++ b/components/server/ee/src/prebuilds/prebuild-manager.ts
@@ -67,7 +67,10 @@ export class PrebuildManager {
try {
const existingPB = await this.workspaceDB.trace({ span }).findPrebuiltWorkspaceByCommit(cloneURL, commit);
if (!!existingPB) {
- return { wsid: existingPB.buildWorkspaceId, done: true, didFinish: existingPB.state === 'available' };
+ // If the prebuild is failed, we want to retrigger it.
+ if (existingPB.state !== 'aborted' && existingPB.state !== 'timeout' && !existingPB.error) {
+ return { wsid: existingPB.buildWorkspaceId, done: true };
+ }
}
const contextParser = this.getContextParserFor(contextURL);
diff --git a/components/server/ee/src/workspace/gitpod-server-impl.ts b/components/server/ee/src/workspace/gitpod-server-impl.ts
index e9e310bf76cc8a..8c742bf4a40ae9 100644
--- a/components/server/ee/src/workspace/gitpod-server-impl.ts
+++ b/components/server/ee/src/workspace/gitpod-server-impl.ts
@@ -694,6 +694,7 @@ export class GitpodServerEEImpl extends GitpodServerImpl p.id)]);
- result.push(...infos.map(info => ({ info, status: prebuilds.find(p => p.id === info.id)?.state! })));
+ result.push(...infos.map(info => {
+ const p = prebuilds.find(p => p.id === info.id)!;
+ const r: PrebuildWithStatus = { info, status: p.state };
+ if (p.error) {
+ r.error = p.error;
+ }
+ return r;
+ }));
}
return result;
}