Skip to content

Commit 8df5d2f

Browse files
Fix incorrect redirects to newer prebuilds (#20047)
1 parent 7fea3a2 commit 8df5d2f

File tree

3 files changed

+68
-56
lines changed

3 files changed

+68
-56
lines changed

components/dashboard/src/data/prebuilds/prebuild-queries.ts

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,14 @@ export function useCancelPrebuildMutation() {
6464
});
6565
}
6666

67-
export function useTriggerPrebuildQuery(configurationId?: string, gitRef?: string) {
68-
// we use useQuery instead of useMutation so that we can get data (prebuildId) directly outside
69-
return useQuery<string, Error, string>(
70-
["prebuild-trigger", configurationId, gitRef],
71-
async () => {
67+
export function useTriggerPrebuildMutation(configurationId?: string, gitRef?: string) {
68+
return useMutation({
69+
mutationFn: async () => {
7270
if (!configurationId) {
7371
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "prebuild configurationId is missing");
7472
}
7573

7674
return prebuildClient.startPrebuild({ configurationId, gitRef }).then((resp) => resp.prebuildId);
7775
},
78-
{
79-
enabled: false,
80-
cacheTime: 0,
81-
retry: false,
82-
},
83-
);
76+
});
8477
}

components/dashboard/src/prebuilds/detail/PrebuildDetailPage.tsx

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ import { Prebuild, PrebuildPhase_Phase, TaskLog } from "@gitpod/public-api/lib/g
88
import { BreadcrumbNav } from "@podkit/breadcrumbs/BreadcrumbNav";
99
import { Button } from "@podkit/buttons/Button";
1010
import { FC, useCallback, useEffect, useMemo, useState } from "react";
11-
import { Redirect, useHistory, useParams } from "react-router";
11+
import { useHistory, useParams } from "react-router";
1212
import dayjs from "dayjs";
1313
import { useToast } from "../../components/toasts/Toasts";
1414
import {
1515
isPrebuildDone,
1616
useCancelPrebuildMutation,
1717
usePrebuildQuery,
18-
useTriggerPrebuildQuery,
18+
useTriggerPrebuildMutation,
1919
watchPrebuild,
2020
} from "../../data/prebuilds/prebuild-queries";
2121
import { LinkButton } from "@podkit/buttons/LinkButton";
@@ -83,16 +83,35 @@ export const PrebuildDetailPage: FC = () => {
8383
return selectedTaskId ?? prebuild?.status?.taskLogs.filter((f) => f.logUrl)[0]?.taskId ?? undefined;
8484
}, [isImageBuild, prebuild, selectedTaskId]);
8585

86-
const {
87-
isFetching: isTriggeringPrebuild,
88-
refetch: triggerPrebuild,
89-
isError: isTriggerError,
90-
error: triggerError,
91-
isRefetching: isTriggeringRefetch,
92-
data: newPrebuildID,
93-
} = useTriggerPrebuildQuery(prebuild?.configurationId, prebuild?.ref);
86+
const triggerPrebuildMutation = useTriggerPrebuildMutation(prebuild?.configurationId, prebuild?.ref);
9487
const cancelPrebuildMutation = useCancelPrebuildMutation();
9588

89+
const [isTriggeringNewPrebuild, setTriggeringNewPrebuild] = useState(false);
90+
const triggerPrebuild = useCallback(async () => {
91+
if (!prebuild) {
92+
return;
93+
}
94+
95+
try {
96+
setTriggeringNewPrebuild(true);
97+
await triggerPrebuildMutation.mutateAsync(undefined, {
98+
onSuccess: (newPrebuildId) => {
99+
history.push(repositoriesRoutes.PrebuildDetail(newPrebuildId));
100+
},
101+
onError: (error) => {
102+
if (error instanceof ApplicationError) {
103+
toast("Failed to trigger prebuild: " + error.message);
104+
}
105+
},
106+
onSettled: () => {
107+
setTriggeringNewPrebuild(false);
108+
},
109+
});
110+
} catch (error) {
111+
console.error("Could not trigger prebuild", error);
112+
}
113+
}, [history, prebuild, toast, triggerPrebuildMutation]);
114+
96115
const triggeredDate = useMemo(() => dayjs(prebuild?.status?.startTime?.toDate()), [prebuild?.status?.startTime]);
97116
const triggeredString = useMemo(() => formatDate(triggeredDate), [triggeredDate]);
98117
const stopDate = useMemo(() => {
@@ -160,12 +179,6 @@ export const PrebuildDetailPage: FC = () => {
160179

161180
const notFoundError = error instanceof ApplicationError && error.code === ErrorCodes.NOT_FOUND;
162181

163-
useEffect(() => {
164-
if (isTriggerError && triggerError?.message) {
165-
toast("Failed to trigger prebuild: " + triggerError.message);
166-
}
167-
}, [isTriggerError, triggerError, toast]);
168-
169182
const cancelPrebuild = useCallback(async () => {
170183
if (!prebuild) {
171184
return;
@@ -178,11 +191,6 @@ export const PrebuildDetailPage: FC = () => {
178191
}
179192
}, [prebuild, cancelPrebuildMutation]);
180193

181-
// For some reason, we sometimes hit a case where the newPrebuildID is actually set without us triggering the query.
182-
if (newPrebuildID && prebuild?.id !== newPrebuildID) {
183-
return <Redirect to={repositoriesRoutes.PrebuildDetail(newPrebuildID)} />;
184-
}
185-
186194
return (
187195
<div className="w-full">
188196
<BreadcrumbNav
@@ -334,9 +342,11 @@ export const PrebuildDetailPage: FC = () => {
334342
</LoadingButton>
335343
) : (
336344
<LoadingButton
337-
loading={isTriggeringRefetch}
345+
loading={isTriggeringNewPrebuild}
338346
disabled={
339-
isTriggeringPrebuild || !prebuild.configurationId || !prebuild.commit?.sha
347+
isTriggeringNewPrebuild ||
348+
!prebuild.configurationId ||
349+
!prebuild.commit?.sha
340350
}
341351
onClick={() => triggerPrebuild()}
342352
>{`Rerun Prebuild (${prebuild.ref})`}</LoadingButton>

components/dashboard/src/prebuilds/list/RunPrebuildModal.tsx

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@ import { InputField } from "../../components/forms/InputField";
1111
import { AuthorizeGit, useNeedsGitAuthorization } from "../../components/AuthorizeGit";
1212
import { LoadingButton } from "@podkit/buttons/LoadingButton";
1313
import { Button } from "@podkit/buttons/Button";
14-
import { useTriggerPrebuildQuery } from "../../data/prebuilds/prebuild-queries";
14+
import { useTriggerPrebuildMutation } from "../../data/prebuilds/prebuild-queries";
1515
import { SuggestedRepository } from "@gitpod/public-api/lib/gitpod/v1/scm_pb";
1616
import { useConfiguration } from "../../data/configurations/configuration-queries";
1717
import { Link } from "react-router-dom";
1818
import { repositoriesRoutes } from "../../repositories/repositories.routes";
1919
import { TextInputField } from "../../components/forms/TextInputField";
20+
import { ApplicationError } from "@gitpod/gitpod-protocol/lib/messaging/error";
2021

2122
type Props = {
2223
defaultRepositoryId?: string;
@@ -34,14 +35,29 @@ export const RunPrebuildModal: FC<Props> = ({ defaultRepositoryId: defaultConfig
3435
[defaultConfigurationId, selectedRepo?.configurationId],
3536
);
3637

37-
const {
38-
isFetching,
39-
refetch: startPrebuild,
40-
isError,
41-
error,
42-
isRefetching,
43-
data: prebuildId,
44-
} = useTriggerPrebuildQuery(configurationId, branchName);
38+
const triggerPrebuildMutation = useTriggerPrebuildMutation(configurationId, branchName);
39+
const [isTriggeringNewPrebuild, setTriggeringNewPrebuild] = useState(false);
40+
const triggerPrebuild = useCallback(async () => {
41+
try {
42+
setTriggeringNewPrebuild(true);
43+
await triggerPrebuildMutation.mutateAsync(undefined, {
44+
onSuccess: (newPrebuildId) => {
45+
onRun(newPrebuildId);
46+
onClose();
47+
},
48+
onError: (error) => {
49+
if (error instanceof ApplicationError) {
50+
setCreateErrorMsg(<>Failed to trigger prebuild: {error.message}</>);
51+
}
52+
},
53+
onSettled: () => {
54+
setTriggeringNewPrebuild(false);
55+
},
56+
});
57+
} catch (error) {
58+
console.error("Could not trigger prebuild", error);
59+
}
60+
}, [onClose, onRun, triggerPrebuildMutation]);
4561

4662
const { data: configuration } = useConfiguration(configurationId);
4763

@@ -65,15 +81,8 @@ export const RunPrebuildModal: FC<Props> = ({ defaultRepositoryId: defaultConfig
6581
return;
6682
}
6783

68-
startPrebuild();
69-
}, [configuration, configurationId, startPrebuild]);
70-
71-
const errorMessage = createErrorMsg || (isError && (error?.message ?? "There was a problem running the prebuild"));
72-
73-
if (prebuildId) {
74-
onRun(prebuildId);
75-
onClose();
76-
}
84+
triggerPrebuild();
85+
}, [configuration, configurationId, triggerPrebuild]);
7786

7887
return (
7988
<Modal visible onClose={onClose} onSubmit={handleSubmit}>
@@ -102,25 +111,25 @@ export const RunPrebuildModal: FC<Props> = ({ defaultRepositoryId: defaultConfig
102111
}
103112
value={branchName}
104113
onChange={setBranchName}
105-
disabled={isFetching || isRefetching}
114+
disabled={isTriggeringNewPrebuild}
106115
/>
107116
</>
108117
)}
109118
</div>
110119
</ModalBody>
111120
<ModalFooter
112121
alert={
113-
errorMessage && (
122+
createErrorMsg && (
114123
<ModalFooterAlert type="danger" onClose={() => setCreateErrorMsg(undefined)}>
115-
{errorMessage}
124+
{createErrorMsg}
116125
</ModalFooterAlert>
117126
)
118127
}
119128
>
120129
<Button variant="secondary" onClick={onClose}>
121130
Cancel
122131
</Button>
123-
<LoadingButton type="submit" loading={isFetching || isRefetching}>
132+
<LoadingButton type="submit" loading={isTriggeringNewPrebuild}>
124133
Run prebuild
125134
</LoadingButton>
126135
</ModalFooter>

0 commit comments

Comments
 (0)