Skip to content

Commit b0048ae

Browse files
committed
feat(webapp): Vercel integration - disable auto promotions
1 parent 7fdb2c4 commit b0048ae

File tree

3 files changed

+56
-3
lines changed

3 files changed

+56
-3
lines changed

apps/webapp/app/components/integrations/VercelBuildSettings.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ type BuildSettingsFieldsProps = {
2121
envVarsConfigLink?: string;
2222
/** Slugs that should be forced off and disabled, with tooltip reason. */
2323
disabledEnvSlugs?: Partial<Record<EnvSlug, string>>;
24+
autoPromote?: boolean;
25+
onAutoPromoteChange?: (value: boolean) => void;
2426
};
2527

2628
export function BuildSettingsFields({
@@ -33,6 +35,8 @@ export function BuildSettingsFields({
3335
onAtomicBuildsChange,
3436
envVarsConfigLink,
3537
disabledEnvSlugs,
38+
autoPromote,
39+
onAutoPromoteChange,
3640
}: BuildSettingsFieldsProps) {
3741
const isSlugDisabled = (slug: EnvSlug) => !!disabledEnvSlugs?.[slug];
3842
const enabledSlugs = availableEnvSlugs.filter((s) => !isSlugDisabled(s));
@@ -202,6 +206,25 @@ export function BuildSettingsFields({
202206
.
203207
</Hint>
204208
</div>
209+
210+
{/* Auto promotion — only visible when atomic deployments are on */}
211+
{atomicBuilds.includes("prod") && onAutoPromoteChange !== undefined && (
212+
<div>
213+
<div className="flex items-center justify-between">
214+
<Label>Auto promotion</Label>
215+
<Switch
216+
variant="small"
217+
checked={autoPromote ?? true}
218+
onCheckedChange={onAutoPromoteChange}
219+
/>
220+
</div>
221+
<Hint className="pr-6">
222+
When enabled, the integration automatically promotes the Vercel deployment after
223+
the Trigger.dev build completes. Turn off to manually promote from your Vercel
224+
dashboard — Trigger.dev will then promote automatically once you do.
225+
</Hint>
226+
</div>
227+
)}
205228
</>
206229
);
207230
}

apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel.tsx

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ const UpdateVercelConfigFormSchema = z.object({
9898
pullEnvVarsBeforeBuild: envSlugArrayField,
9999
discoverEnvVars: envSlugArrayField,
100100
vercelStagingEnvironment: z.string().nullable().optional(),
101+
autoPromote: z.string().optional().transform((val) => val !== "false"),
101102
});
102103

103104
const DisconnectVercelFormSchema = z.object({
@@ -241,6 +242,7 @@ export async function action({ request, params }: ActionFunctionArgs) {
241242
pullEnvVarsBeforeBuild,
242243
discoverEnvVars,
243244
vercelStagingEnvironment,
245+
autoPromote,
244246
} = submission.value;
245247

246248
const parsedStagingEnv = parseVercelStagingEnvironment(vercelStagingEnvironment);
@@ -256,6 +258,7 @@ export async function action({ request, params }: ActionFunctionArgs) {
256258
pullEnvVarsBeforeBuild,
257259
discoverEnvVars,
258260
vercelStagingEnvironment: parsedStagingEnv,
261+
autoPromote,
259262
});
260263

261264
if (result) {
@@ -593,12 +596,14 @@ function ConnectedVercelProjectForm({
593596
discoverEnvVars: connectedProject.integrationData.config.discoverEnvVars ?? [],
594597
vercelStagingEnvironment:
595598
connectedProject.integrationData.config.vercelStagingEnvironment ?? null,
599+
autoPromote: connectedProject.integrationData.config.autoPromote ?? true,
596600
});
597601

598602
const originalAtomicBuilds = connectedProject.integrationData.config.atomicBuilds ?? [];
599603
const originalPullEnvVars = connectedProject.integrationData.config.pullEnvVarsBeforeBuild ?? [];
600604
const originalDiscoverEnvVars = connectedProject.integrationData.config.discoverEnvVars ?? [];
601605
const originalStagingEnv = connectedProject.integrationData.config.vercelStagingEnvironment ?? null;
606+
const originalAutoPromote = connectedProject.integrationData.config.autoPromote ?? true;
602607

603608
useEffect(() => {
604609
const atomicBuildsChanged =
@@ -611,9 +616,23 @@ function ConnectedVercelProjectForm({
611616
JSON.stringify([...configValues.discoverEnvVars].sort()) !==
612617
JSON.stringify([...originalDiscoverEnvVars].sort());
613618
const stagingEnvChanged = configValues.vercelStagingEnvironment?.environmentId !== originalStagingEnv?.environmentId;
614-
615-
setHasConfigChanges(atomicBuildsChanged || pullEnvVarsChanged || discoverEnvVarsChanged || stagingEnvChanged);
616-
}, [configValues, originalAtomicBuilds, originalPullEnvVars, originalDiscoverEnvVars, originalStagingEnv]);
619+
const autoPromoteChanged = configValues.autoPromote !== originalAutoPromote;
620+
621+
setHasConfigChanges(
622+
atomicBuildsChanged ||
623+
pullEnvVarsChanged ||
624+
discoverEnvVarsChanged ||
625+
stagingEnvChanged ||
626+
autoPromoteChanged
627+
);
628+
}, [
629+
configValues,
630+
originalAtomicBuilds,
631+
originalPullEnvVars,
632+
originalDiscoverEnvVars,
633+
originalStagingEnv,
634+
originalAutoPromote,
635+
]);
617636

618637
const [configForm, fields] = useForm({
619638
id: "update-vercel-config",
@@ -718,6 +737,11 @@ function ConnectedVercelProjectForm({
718737
name="vercelStagingEnvironment"
719738
value={configValues.vercelStagingEnvironment ? JSON.stringify(configValues.vercelStagingEnvironment) : ""}
720739
/>
740+
<input
741+
type="hidden"
742+
name="autoPromote"
743+
value={String(configValues.autoPromote)}
744+
/>
721745

722746
<Fieldset>
723747
<InputGroup fullWidth>
@@ -791,6 +815,10 @@ function ConnectedVercelProjectForm({
791815
}
792816
envVarsConfigLink={`/orgs/${organizationSlug}/projects/${projectSlug}/env/${environmentSlug}/environment-variables`}
793817
disabledEnvSlugs={disabledEnvSlugsForBuildSettings}
818+
autoPromote={configValues.autoPromote}
819+
onAutoPromoteChange={(value) =>
820+
setConfigValues((prev) => ({ ...prev, autoPromote: value }))
821+
}
794822
/>
795823

796824
{/* Warning: autoAssignCustomDomains must be disabled for atomic deployments */}

apps/webapp/app/v3/vercel/vercelProjectIntegrationSchema.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export const VercelIntegrationConfigSchema = z.object({
4848
displayName: z.string(),
4949
}).nullable().optional(),
5050
discoverEnvVars: z.array(EnvSlugSchema).nullable().optional(),
51+
autoPromote: z.boolean().optional().default(true),
5152
});
5253

5354
export type VercelIntegrationConfig = z.infer<typeof VercelIntegrationConfigSchema>;
@@ -89,6 +90,7 @@ export function createDefaultVercelIntegrationData(
8990
pullEnvVarsBeforeBuild: ["prod", "preview"],
9091
discoverEnvVars: ["prod", "preview"],
9192
vercelStagingEnvironment: null,
93+
autoPromote: true,
9294
},
9395
syncEnvVarsMapping: {},
9496
vercelProjectId,

0 commit comments

Comments
 (0)