From ac6f2567ebb4cdcf56ed50c2a73f8fdb4152cb57 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 16 Jan 2023 10:42:23 +0100 Subject: [PATCH] fix: build env variables with docker compose --- apps/api/src/lib/buildPacks/compose.ts | 14 ++++++++++++++ apps/api/src/lib/common.ts | 11 ++++++----- apps/server/src/lib/buildPacks/compose.ts | 13 +++++++++++++ apps/server/src/lib/common.ts | 11 ++++++----- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/apps/api/src/lib/buildPacks/compose.ts b/apps/api/src/lib/buildPacks/compose.ts index 4e11168f6..6a13c124c 100644 --- a/apps/api/src/lib/buildPacks/compose.ts +++ b/apps/api/src/lib/buildPacks/compose.ts @@ -26,8 +26,10 @@ export default async function (data) { throw 'No Services found in docker-compose file.'; } let envs = []; + let buildEnvs = []; if (secrets.length > 0) { envs = [...envs, ...generateSecrets(secrets, pullmergeRequestId, false, null)]; + buildEnvs = [...buildEnvs, ...generateSecrets(secrets, pullmergeRequestId, true, null, true)]; } const composeVolumes = []; @@ -43,11 +45,22 @@ export default async function (data) { let networks = {}; for (let [key, value] of Object.entries(dockerComposeYaml.services)) { value['container_name'] = `${applicationId}-${key}`; + let environment = typeof value['environment'] === 'undefined' ? [] : value['environment']; if (Object.keys(environment).length > 0) { environment = Object.entries(environment).map(([key, value]) => `${key}=${value}`); } value['environment'] = [...environment, ...envs]; + + let build = typeof value['build'] === 'undefined' ? [] : value['build']; + if (Object.keys(build).length > 0) { + build = Object.entries(build).map(([key, value]) => `${key}=${value}`); + } + value['build'] = { + ...build, + args: [...(build?.args || []), ...buildEnvs] + }; + value['labels'] = labels; // TODO: If we support separated volume for each service, we need to add it here if (value['volumes']?.length > 0) { @@ -93,6 +106,7 @@ export default async function (data) { dockerComposeYaml['networks'] = Object.assign({ ...networks }, { [network]: { external: true } }); await fs.writeFile(fileYaml, yaml.dump(dockerComposeYaml)); + console.log(yaml.dump(dockerComposeYaml)); await executeCommand({ debug, buildId, diff --git a/apps/api/src/lib/common.ts b/apps/api/src/lib/common.ts index 41a8704cd..b692cc5fe 100644 --- a/apps/api/src/lib/common.ts +++ b/apps/api/src/lib/common.ts @@ -1912,27 +1912,28 @@ export function generateSecrets( secrets: Array, pullmergeRequestId: string, isBuild = false, - port = null + port = null, + compose = false ): Array { const envs = []; const isPRMRSecret = secrets.filter((s) => s.isPRMRSecret); const normalSecrets = secrets.filter((s) => !s.isPRMRSecret); if (pullmergeRequestId && isPRMRSecret.length > 0) { isPRMRSecret.forEach((secret) => { - if (isBuild && !secret.isBuildSecret) { + if ((isBuild && !secret.isBuildSecret) || (!isBuild && secret.isBuildSecret)) { return; } const build = isBuild && secret.isBuildSecret; - envs.push(parseSecret(secret, build)); + envs.push(parseSecret(secret, compose ? false : build)); }); } if (!pullmergeRequestId && normalSecrets.length > 0) { normalSecrets.forEach((secret) => { - if (isBuild && !secret.isBuildSecret) { + if ((isBuild && !secret.isBuildSecret) || (!isBuild && secret.isBuildSecret)) { return; } const build = isBuild && secret.isBuildSecret; - envs.push(parseSecret(secret, build)); + envs.push(parseSecret(secret, compose ? false : build)); }); } const portFound = envs.filter((env) => env.startsWith('PORT')); diff --git a/apps/server/src/lib/buildPacks/compose.ts b/apps/server/src/lib/buildPacks/compose.ts index 9aa2d7b79..6b137c968 100644 --- a/apps/server/src/lib/buildPacks/compose.ts +++ b/apps/server/src/lib/buildPacks/compose.ts @@ -28,8 +28,10 @@ export default async function (data) { throw 'No Services found in docker-compose file.'; } let envs = []; + let buildEnvs = []; if (secrets.length > 0) { envs = [...envs, ...generateSecrets(secrets, pullmergeRequestId, false, null)]; + buildEnvs = [...buildEnvs, ...generateSecrets(secrets, pullmergeRequestId, true, null, true)]; } const composeVolumes = []; @@ -45,11 +47,22 @@ export default async function (data) { let networks = {}; for (let [key, value] of Object.entries(dockerComposeYaml.services)) { value['container_name'] = `${applicationId}-${key}`; + let environment = typeof value['environment'] === 'undefined' ? [] : value['environment']; if (Object.keys(environment).length > 0) { environment = Object.entries(environment).map(([key, value]) => `${key}=${value}`); } value['environment'] = [...environment, ...envs]; + + let build = typeof value['build'] === 'undefined' ? [] : value['build']; + if (Object.keys(build).length > 0) { + build = Object.entries(build).map(([key, value]) => `${key}=${value}`); + } + value['build'] = { + ...build, + args: [...(build?.args || []), ...buildEnvs] + }; + value['labels'] = labels; // TODO: If we support separated volume for each service, we need to add it here if (value['volumes']?.length > 0) { diff --git a/apps/server/src/lib/common.ts b/apps/server/src/lib/common.ts index c55e59533..70893ff3b 100644 --- a/apps/server/src/lib/common.ts +++ b/apps/server/src/lib/common.ts @@ -603,27 +603,28 @@ export function generateSecrets( secrets: Array, pullmergeRequestId: string, isBuild = false, - port = null + port = null, + compose = false ): Array { const envs = []; const isPRMRSecret = secrets.filter((s) => s.isPRMRSecret); const normalSecrets = secrets.filter((s) => !s.isPRMRSecret); if (pullmergeRequestId && isPRMRSecret.length > 0) { isPRMRSecret.forEach((secret) => { - if (isBuild && !secret.isBuildSecret) { + if ((isBuild && !secret.isBuildSecret) || (!isBuild && secret.isBuildSecret)) { return; } const build = isBuild && secret.isBuildSecret; - envs.push(parseSecret(secret, build)); + envs.push(parseSecret(secret, compose ? false : build)); }); } if (!pullmergeRequestId && normalSecrets.length > 0) { normalSecrets.forEach((secret) => { - if (isBuild && !secret.isBuildSecret) { + if ((isBuild && !secret.isBuildSecret) || (!isBuild && secret.isBuildSecret)) { return; } const build = isBuild && secret.isBuildSecret; - envs.push(parseSecret(secret, build)); + envs.push(parseSecret(secret, compose ? false : build)); }); } const portFound = envs.filter((env) => env.startsWith('PORT'));