From 90f8501d1e20de55437616bc823edb1a41eb1395 Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:15:30 +0100 Subject: [PATCH 1/7] Added vercelSyncEnvVars extension --- .../build/src/extensions/vercelSyncEnvVars.ts | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 packages/build/src/extensions/vercelSyncEnvVars.ts diff --git a/packages/build/src/extensions/vercelSyncEnvVars.ts b/packages/build/src/extensions/vercelSyncEnvVars.ts new file mode 100644 index 0000000000..cc979073af --- /dev/null +++ b/packages/build/src/extensions/vercelSyncEnvVars.ts @@ -0,0 +1,50 @@ +import { BuildExtension } from "@trigger.dev/core/v3/build"; +import { syncEnvVars } from "./core.js"; + +export function vercelSyncEnvVars(): BuildExtension { + const sync = syncEnvVars(async (ctx) => { + const environmentMap = { + prod: "production", + staging: "preview", + dev: "development", + } as const; + + const vercelEnvironment = + environmentMap[ctx.environment as keyof typeof environmentMap]; + + const vercelApiUrl = + `https://api.vercel.com/v8/projects/${process.env.VERCEL_PROJECT_ID}/env?decrypt=true`; + + const response = await fetch(vercelApiUrl, { + headers: { + Authorization: `Bearer ${process.env.VERCEL_ACCESS_TOKEN}`, + }, + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + + const filteredEnvs = data.envs + .filter( + (env: { type: string; value: string; target: string[] }) => + env.type === "encrypted" && env.value && + env.target.includes(vercelEnvironment), + ) + .map((env: { key: string; value: string }) => ({ + name: env.key, + value: env.value, + })); + + return filteredEnvs; + }); + + return { + name: "SyncVercelEnvVarsExtension", + async onBuildComplete(context, manifest) { + await sync.onBuildComplete?.(context, manifest); + }, + }; +} From 5571b06176231cfd86f27aed3f45b8c9b6a72d77 Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Tue, 22 Oct 2024 17:03:40 +0100 Subject: [PATCH 2/7] Updated extension and added try catch --- .../build/src/extensions/vercelSyncEnvVars.ts | 72 +++++++++++++------ 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/packages/build/src/extensions/vercelSyncEnvVars.ts b/packages/build/src/extensions/vercelSyncEnvVars.ts index cc979073af..3f9163ceb7 100644 --- a/packages/build/src/extensions/vercelSyncEnvVars.ts +++ b/packages/build/src/extensions/vercelSyncEnvVars.ts @@ -1,8 +1,28 @@ import { BuildExtension } from "@trigger.dev/core/v3/build"; import { syncEnvVars } from "./core.js"; -export function vercelSyncEnvVars(): BuildExtension { +export function syncVercelEnvVars( + options?: { projectId?: string; vercelAccessToken?: string }, +): BuildExtension { const sync = syncEnvVars(async (ctx) => { + const projectId = options?.projectId ?? process.env.VERCEL_PROJECT_ID ?? + ctx.env.VERCEL_PROJECT_ID; + const vercelAccessToken = options?.vercelAccessToken ?? + process.env.VERCEL_ACCESS_TOKEN ?? + ctx.env.VERCEL_ACCESS_TOKEN; + + if (!projectId) { + throw new Error( + "vercelSyncEnvVars: you did not pass in a projectId or set the VERCEL_PROJECT_ID env var.", + ); + } + + if (!vercelAccessToken) { + throw new Error( + "vercelSyncEnvVars: you did not pass in a vercelAccessToken or set the VERCEL_ACCESS_TOKEN env var.", + ); + } + const environmentMap = { prod: "production", staging: "preview", @@ -13,32 +33,40 @@ export function vercelSyncEnvVars(): BuildExtension { environmentMap[ctx.environment as keyof typeof environmentMap]; const vercelApiUrl = - `https://api.vercel.com/v8/projects/${process.env.VERCEL_PROJECT_ID}/env?decrypt=true`; + `https://api.vercel.com/v8/projects/${projectId}/env?decrypt=true`; - const response = await fetch(vercelApiUrl, { - headers: { - Authorization: `Bearer ${process.env.VERCEL_ACCESS_TOKEN}`, - }, - }); + try { + const response = await fetch(vercelApiUrl, { + headers: { + Authorization: `Bearer ${vercelAccessToken}`, + }, + }); - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } - const data = await response.json(); + const data = await response.json(); - const filteredEnvs = data.envs - .filter( - (env: { type: string; value: string; target: string[] }) => - env.type === "encrypted" && env.value && - env.target.includes(vercelEnvironment), - ) - .map((env: { key: string; value: string }) => ({ - name: env.key, - value: env.value, - })); + const filteredEnvs = data.envs + .filter( + (env: { type: string; value: string; target: string[] }) => + env.type === "encrypted" && env.value && + env.target.includes(vercelEnvironment), + ) + .map((env: { key: string; value: string }) => ({ + name: env.key, + value: env.value, + })); - return filteredEnvs; + return filteredEnvs; + } catch (error) { + console.error( + "Error fetching or processing Vercel environment variables:", + error, + ); + throw error; // Re-throw the error to be handled by the caller + } }); return { From 0a388ced1c3c59632ccfdca9a89cd2c101aefabc Mon Sep 17 00:00:00 2001 From: Matt Aitken Date: Tue, 22 Oct 2024 17:23:49 +0100 Subject: [PATCH 3/7] VercelEnvironment fix Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- packages/build/src/extensions/vercelSyncEnvVars.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/build/src/extensions/vercelSyncEnvVars.ts b/packages/build/src/extensions/vercelSyncEnvVars.ts index 3f9163ceb7..f8b80fd769 100644 --- a/packages/build/src/extensions/vercelSyncEnvVars.ts +++ b/packages/build/src/extensions/vercelSyncEnvVars.ts @@ -32,6 +32,11 @@ export function syncVercelEnvVars( const vercelEnvironment = environmentMap[ctx.environment as keyof typeof environmentMap]; + if (!vercelEnvironment) { + throw new Error( + `Invalid environment '${ctx.environment}'. Expected 'prod', 'staging', or 'dev'.` + ); + } const vercelApiUrl = `https://api.vercel.com/v8/projects/${projectId}/env?decrypt=true`; From 772d7d09f18e2786fe6f3312f12f0f60d7913d25 Mon Sep 17 00:00:00 2001 From: Matt Aitken Date: Tue, 22 Oct 2024 17:25:27 +0100 Subject: [PATCH 4/7] Added changeset --- .changeset/good-ligers-sit.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/good-ligers-sit.md diff --git a/.changeset/good-ligers-sit.md b/.changeset/good-ligers-sit.md new file mode 100644 index 0000000000..1704e72546 --- /dev/null +++ b/.changeset/good-ligers-sit.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/build": patch +--- + +Added a Vercel sync env vars extension. Given a Vercel projectId and access token it will sync Vercel env vars when deploying Trigger.dev tasks. From 2587f5426dd0f3c9c263d3007c7956b2a6ef0c3c Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Wed, 23 Oct 2024 11:05:32 +0100 Subject: [PATCH 5/7] Moved vercelSynvEnvVars to code and updated core.ts --- packages/build/src/extensions/core.ts | 1 + packages/build/src/extensions/{ => core}/vercelSyncEnvVars.ts | 0 2 files changed, 1 insertion(+) rename packages/build/src/extensions/{ => core}/vercelSyncEnvVars.ts (100%) diff --git a/packages/build/src/extensions/core.ts b/packages/build/src/extensions/core.ts index 2adddbaa06..d9ed52b5a0 100644 --- a/packages/build/src/extensions/core.ts +++ b/packages/build/src/extensions/core.ts @@ -3,3 +3,4 @@ export * from "./core/additionalPackages.js"; export * from "./core/syncEnvVars.js"; export * from "./core/aptGet.js"; export * from "./core/ffmpeg.js"; +export * from "./core/vercelSyncEnvVars.js"; diff --git a/packages/build/src/extensions/vercelSyncEnvVars.ts b/packages/build/src/extensions/core/vercelSyncEnvVars.ts similarity index 100% rename from packages/build/src/extensions/vercelSyncEnvVars.ts rename to packages/build/src/extensions/core/vercelSyncEnvVars.ts From c5e24a26a78088ac2978d0923d28fe1a7a06b199 Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Wed, 23 Oct 2024 11:16:47 +0100 Subject: [PATCH 6/7] Fixed import --- packages/build/src/extensions/core/vercelSyncEnvVars.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/build/src/extensions/core/vercelSyncEnvVars.ts b/packages/build/src/extensions/core/vercelSyncEnvVars.ts index f8b80fd769..29239078d7 100644 --- a/packages/build/src/extensions/core/vercelSyncEnvVars.ts +++ b/packages/build/src/extensions/core/vercelSyncEnvVars.ts @@ -1,5 +1,5 @@ import { BuildExtension } from "@trigger.dev/core/v3/build"; -import { syncEnvVars } from "./core.js"; +import { syncEnvVars } from "../core.js"; export function syncVercelEnvVars( options?: { projectId?: string; vercelAccessToken?: string }, @@ -34,7 +34,7 @@ export function syncVercelEnvVars( if (!vercelEnvironment) { throw new Error( - `Invalid environment '${ctx.environment}'. Expected 'prod', 'staging', or 'dev'.` + `Invalid environment '${ctx.environment}'. Expected 'prod', 'staging', or 'dev'.`, ); } const vercelApiUrl = From abf51d1fdacc6f479825ad30cecdeeb233447874 Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Wed, 23 Oct 2024 11:54:07 +0100 Subject: [PATCH 7/7] removed type --- packages/build/src/extensions/core/vercelSyncEnvVars.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/build/src/extensions/core/vercelSyncEnvVars.ts b/packages/build/src/extensions/core/vercelSyncEnvVars.ts index 29239078d7..c6c6f3b11b 100644 --- a/packages/build/src/extensions/core/vercelSyncEnvVars.ts +++ b/packages/build/src/extensions/core/vercelSyncEnvVars.ts @@ -56,7 +56,7 @@ export function syncVercelEnvVars( const filteredEnvs = data.envs .filter( (env: { type: string; value: string; target: string[] }) => - env.type === "encrypted" && env.value && + env.value && env.target.includes(vercelEnvironment), ) .map((env: { key: string; value: string }) => ({