diff --git a/.changeset/fresh-bats-travel.md b/.changeset/fresh-bats-travel.md new file mode 100644 index 0000000000..ebfda64542 --- /dev/null +++ b/.changeset/fresh-bats-travel.md @@ -0,0 +1,6 @@ +--- +"trigger.dev": minor +"@trigger.dev/build": minor +--- + +Added support for the secret flag on variables in the syncEnvVars extension diff --git a/apps/webapp/app/routes/api.v1.projects.$projectRef.envvars.$slug.import.ts b/apps/webapp/app/routes/api.v1.projects.$projectRef.envvars.$slug.import.ts index ad2372a654..f55fc88e8b 100644 --- a/apps/webapp/app/routes/api.v1.projects.$projectRef.envvars.$slug.import.ts +++ b/apps/webapp/app/routes/api.v1.projects.$projectRef.envvars.$slug.import.ts @@ -44,6 +44,7 @@ export async function action({ params, request }: ActionFunctionArgs) { variables: Object.entries(body.variables).map(([key, value]) => ({ key, value, + isSecret: body.secrets?.[key] ?? false, })), }); @@ -55,6 +56,7 @@ export async function action({ params, request }: ActionFunctionArgs) { variables: Object.entries(body.parentVariables).map(([key, value]) => ({ key, value, + isSecret: body.parentSecrets?.[key] ?? false, })), }); diff --git a/packages/build/src/extensions/core/syncEnvVars.ts b/packages/build/src/extensions/core/syncEnvVars.ts index 4b43783561..f84b40dd90 100644 --- a/packages/build/src/extensions/core/syncEnvVars.ts +++ b/packages/build/src/extensions/core/syncEnvVars.ts @@ -2,7 +2,7 @@ import { BuildContext, BuildExtension } from "@trigger.dev/core/v3/build"; export type SyncEnvVarsBody = | Record - | Array<{ name: string; value: string; isParentEnv?: boolean }>; + | Array<{ name: string; value: string; isParentEnv?: boolean; isSecret?: boolean }>; export type SyncEnvVarsResult = | SyncEnvVarsBody @@ -151,9 +151,19 @@ async function callSyncEnvVarsFn( environment: string, branch: string | undefined, context: BuildContext -): Promise<{ env: Record; parentEnv?: Record } | undefined> { +): Promise<{ + env: Record; + secrets?: Record; + parentEnv?: Record; + parentSecrets?: Record; +} | undefined> { if (syncEnvVarsFn && typeof syncEnvVarsFn === "function") { - let resolvedEnvVars: { env: Record; parentEnv?: Record } = { + let resolvedEnvVars: { + env: Record; + secrets?: Record; + parentEnv?: Record; + parentSecrets?: Record; + } = { env: {}, }; let result; @@ -186,10 +196,20 @@ async function callSyncEnvVarsFn( if (item.isParentEnv) { if (!resolvedEnvVars.parentEnv) { resolvedEnvVars.parentEnv = {}; + resolvedEnvVars.parentSecrets = {}; } resolvedEnvVars.parentEnv[item.name] = item.value; + if (item.isSecret && resolvedEnvVars.parentSecrets) { + resolvedEnvVars.parentSecrets[item.name] = true; + } } else { resolvedEnvVars.env[item.name] = item.value; + if (item.isSecret) { + if (!resolvedEnvVars.secrets) { + resolvedEnvVars.secrets = {}; + } + resolvedEnvVars.secrets[item.name] = true; + } } } } diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index d8c27a7917..d352eab529 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -382,9 +382,8 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { const version = deployment.version; const rawDeploymentLink = `${authorization.dashboardUrl}/projects/v3/${resolvedConfig.project}/deployments/${deployment.shortCode}`; - const rawTestLink = `${authorization.dashboardUrl}/projects/v3/${ - resolvedConfig.project - }/test?environment=${options.env === "prod" ? "prod" : "stg"}`; + const rawTestLink = `${authorization.dashboardUrl}/projects/v3/${resolvedConfig.project + }/test?environment=${options.env === "prod" ? "prod" : "stg"}`; const deploymentLink = cliLink("View deployment", rawDeploymentLink); const testLink = cliLink("Test tasks", rawTestLink); @@ -563,8 +562,7 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { const taskCount = deploymentWithWorker.worker?.tasks.length ?? 0; outro( - `Version ${version} deployed with ${taskCount} detected task${taskCount === 1 ? "" : "s"} ${ - isLinksSupported ? `| ${deploymentLink} | ${testLink}` : "" + `Version ${version} deployed with ${taskCount} detected task${taskCount === 1 ? "" : "s"} ${isLinksSupported ? `| ${deploymentLink} | ${testLink}` : "" }` ); @@ -587,18 +585,16 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { TRIGGER_VERSION: version, TRIGGER_DEPLOYMENT_SHORT_CODE: deployment.shortCode, TRIGGER_DEPLOYMENT_URL: `${authorization.dashboardUrl}/projects/v3/${resolvedConfig.project}/deployments/${deployment.shortCode}`, - TRIGGER_TEST_URL: `${authorization.dashboardUrl}/projects/v3/${ - resolvedConfig.project - }/test?environment=${options.env === "prod" ? "prod" : "stg"}`, + TRIGGER_TEST_URL: `${authorization.dashboardUrl}/projects/v3/${resolvedConfig.project + }/test?environment=${options.env === "prod" ? "prod" : "stg"}`, }, outputs: { deploymentVersion: version, workerVersion: version, deploymentShortCode: deployment.shortCode, deploymentUrl: `${authorization.dashboardUrl}/projects/v3/${resolvedConfig.project}/deployments/${deployment.shortCode}`, - testUrl: `${authorization.dashboardUrl}/projects/v3/${ - resolvedConfig.project - }/test?environment=${options.env === "prod" ? "prod" : "stg"}`, + testUrl: `${authorization.dashboardUrl}/projects/v3/${resolvedConfig.project + }/test?environment=${options.env === "prod" ? "prod" : "stg"}`, needsPromotion: options.skipPromotion ? "true" : "false", }, }); @@ -609,11 +605,15 @@ export async function syncEnvVarsWithServer( projectRef: string, environmentSlug: string, envVars: Record, - parentEnvVars?: Record + parentEnvVars?: Record, + secrets?: Record, + parentSecrets?: Record ) { return await apiClient.importEnvVars(projectRef, environmentSlug, { variables: envVars, parentVariables: parentEnvVars, + secrets, + parentSecrets, override: true, }); } @@ -641,8 +641,7 @@ async function failDeploy( checkLogsForErrors(logs); outro( - `${chalkError(`${prefix}:`)} ${ - error.message + `${chalkError(`${prefix}:`)} ${error.message }. Full build logs have been saved to ${logPath}` ); diff --git a/packages/core/src/v3/apiClient/types.ts b/packages/core/src/v3/apiClient/types.ts index 79baaf74ef..6a5f3c3c5a 100644 --- a/packages/core/src/v3/apiClient/types.ts +++ b/packages/core/src/v3/apiClient/types.ts @@ -13,6 +13,18 @@ export interface ImportEnvironmentVariablesParams { * To specify the variables, you can pass them in as a record of key-value pairs. e.g. `{ "key1": "value1", "key2": "value2" }` */ variables: Record; + /** + * Optional parent variables to be imported. These are used when dealing with branch environments. + */ + parentVariables?: Record; + /** + * Optional map of which variables should be marked as secrets. The keys should match the keys in `variables`. + */ + secrets?: Record; + /** + * Optional map of which parent variables should be marked as secrets. The keys should match the keys in `parentVariables`. + */ + parentSecrets?: Record; override?: boolean; } diff --git a/packages/core/src/v3/schemas/api.ts b/packages/core/src/v3/schemas/api.ts index f8e12f62cc..9e920782f9 100644 --- a/packages/core/src/v3/schemas/api.ts +++ b/packages/core/src/v3/schemas/api.ts @@ -885,6 +885,8 @@ export type UpdateEnvironmentVariableRequestBody = z.infer< export const ImportEnvironmentVariablesRequestBody = z.object({ variables: z.record(z.string()), parentVariables: z.record(z.string()).optional(), + secrets: z.record(z.boolean()).optional(), + parentSecrets: z.record(z.boolean()).optional(), override: z.boolean().optional(), });