From 6a90bdf9fa4984d327b4353ebaac62f474c719bc Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Mon, 7 Jul 2025 12:30:44 +0200 Subject: [PATCH] fix(env): Generate literal env variables better --- app/Jobs/ApplicationDeploymentJob.php | 24 ++---------------------- app/Models/EnvironmentVariable.php | 9 ++++++++- app/Models/Service.php | 24 ++++++++---------------- bootstrap/helpers/shared.php | 5 ++--- 4 files changed, 20 insertions(+), 42 deletions(-) diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php index c9b7c9992..f3ad4383c 100644 --- a/app/Jobs/ApplicationDeploymentJob.php +++ b/app/Jobs/ApplicationDeploymentJob.php @@ -908,17 +908,7 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue $this->env_filename = '.env'; foreach ($sorted_environment_variables as $env) { - $real_value = $env->real_value; - if ($env->version === '4.0.0-beta.239') { - $real_value = $env->real_value; - } else { - if ($env->is_literal || $env->is_multiline) { - $real_value = '\''.$real_value.'\''; - } else { - $real_value = escapeEnvVariables($env->real_value); - } - } - $envs->push($env->key.'='.$real_value); + $envs->push($env->key.'='.$env->real_value); } // Add PORT if not exists, use the first port as default if ($this->build_pack !== 'dockercompose') { @@ -933,17 +923,7 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue } else { $this->env_filename = ".env-pr-$this->pull_request_id"; foreach ($sorted_environment_variables_preview as $env) { - $real_value = $env->real_value; - if ($env->version === '4.0.0-beta.239') { - $real_value = $env->real_value; - } else { - if ($env->is_literal || $env->is_multiline) { - $real_value = '\''.$real_value.'\''; - } else { - $real_value = escapeEnvVariables($env->real_value); - } - } - $envs->push($env->key.'='.$real_value); + $envs->push($env->key.'='.$env->real_value); } // Add PORT if not exists, use the first port as default if ($this->build_pack !== 'dockercompose') { diff --git a/app/Models/EnvironmentVariable.php b/app/Models/EnvironmentVariable.php index 04081fce0..b8bde5c84 100644 --- a/app/Models/EnvironmentVariable.php +++ b/app/Models/EnvironmentVariable.php @@ -118,7 +118,14 @@ class EnvironmentVariable extends BaseModel return null; } - return $this->get_real_environment_variables($this->value, $resource); + $real_value = $this->get_real_environment_variables($this->value, $resource); + if ($this->is_literal || $this->is_multiline) { + $real_value = '\''.$real_value.'\''; + } else { + $real_value = escapeEnvVariables($real_value); + } + + return $real_value; } ); } diff --git a/app/Models/Service.php b/app/Models/Service.php index a9302d7e7..8f0c16d40 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -1260,26 +1260,18 @@ class Service extends BaseModel return 3; }); + $envs = collect([]); foreach ($sorted as $env) { - if (version_compare($env->version, '4.0.0-beta.347', '<=')) { - $commands[] = "echo '{$env->key}={$env->real_value}' >> .env"; - } else { - $real_value = $env->real_value; - if ($env->version === '4.0.0-beta.239') { - $real_value = $env->real_value; - } else { - if ($env->is_literal || $env->is_multiline) { - $real_value = '\''.$real_value.'\''; - } else { - $real_value = escapeEnvVariables($env->real_value); - } - } - $commands[] = "echo \"{$env->key}={$real_value}\" >> .env"; - } + $envs->push("{$env->key}={$env->real_value}"); } - if ($sorted->count() === 0) { + ray($envs); + if ($envs->count() === 0) { $commands[] = 'touch .env'; + } else { + $envs_base64 = base64_encode($envs->implode("\n")); + $commands[] = "echo '$envs_base64' | base64 -d | tee .env > /dev/null"; } + instant_remote_process($commands, $this->server); } diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index 3685dcfd5..2fcc44ac9 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -2946,7 +2946,6 @@ function newParser(Application|Service $resource, int $pull_request_id = 0, ?int } catch (\Exception) { return collect([]); } - $services = data_get($yaml, 'services', collect([])); $topLevel = collect([ 'volumes' => collect(data_get($yaml, 'volumes', [])), @@ -3064,7 +3063,6 @@ function newParser(Application|Service $resource, int $pull_request_id = 0, ?int } } } - // Get magic environments where we need to preset the FQDN if ($key->startsWith('SERVICE_FQDN_')) { // SERVICE_FQDN_APP or SERVICE_FQDN_APP_3000 @@ -3614,7 +3612,8 @@ function newParser(Application|Service $resource, int $pull_request_id = 0, ?int 'is_required' => $isRequired, ]); // Add the variable to the environment so it will be shown in the deployable compose file - $environment[$parsedKeyValue->value()] = $resource->environment_variables()->where('key', $parsedKeyValue)->where('resourceable_type', get_class($resource))->where('resourceable_id', $resource->id)->first()->value; + // $environment[$parsedKeyValue->value()] = $resource->environment_variables()->where('key', $parsedKeyValue)->where('resourceable_type', get_class($resource))->where('resourceable_id', $resource->id)->first()->real_value; + $environment[$parsedKeyValue->value()] = $value; continue; }