From 20ad2165e7ae9b528409ff67eb255234f3cf6136 Mon Sep 17 00:00:00 2001
From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Date: Thu, 11 Sep 2025 17:38:16 +0200
Subject: [PATCH] feat(environment): introduce 'is_buildtime_only' attribute to
environment variables for improved build-time configuration
---
.../Api/ApplicationsController.php | 16 +++++++++++
app/Jobs/ApplicationDeploymentJob.php | 12 ++++++--
.../Shared/EnvironmentVariable/Add.php | 6 ++++
.../Shared/EnvironmentVariable/All.php | 1 +
.../Shared/EnvironmentVariable/Show.php | 5 ++++
app/Models/EnvironmentVariable.php | 2 ++
...me_only_to_environment_variables_table.php | 28 +++++++++++++++++++
.../shared/environment-variable/add.blade.php | 3 ++
.../environment-variable/show.blade.php | 12 ++++++++
9 files changed, 83 insertions(+), 2 deletions(-)
create mode 100644 database/migrations/2025_09_11_150344_add_is_buildtime_only_to_environment_variables_table.php
diff --git a/app/Http/Controllers/Api/ApplicationsController.php b/app/Http/Controllers/Api/ApplicationsController.php
index 9b9de640c..b9c854ea1 100644
--- a/app/Http/Controllers/Api/ApplicationsController.php
+++ b/app/Http/Controllers/Api/ApplicationsController.php
@@ -2532,6 +2532,9 @@ class ApplicationsController extends Controller
if ($env->is_shown_once != $request->is_shown_once) {
$env->is_shown_once = $request->is_shown_once;
}
+ if ($request->has('is_buildtime_only') && $env->is_buildtime_only != $request->is_buildtime_only) {
+ $env->is_buildtime_only = $request->is_buildtime_only;
+ }
$env->save();
return response()->json($this->removeSensitiveData($env))->setStatusCode(201);
@@ -2556,6 +2559,9 @@ class ApplicationsController extends Controller
if ($env->is_shown_once != $request->is_shown_once) {
$env->is_shown_once = $request->is_shown_once;
}
+ if ($request->has('is_buildtime_only') && $env->is_buildtime_only != $request->is_buildtime_only) {
+ $env->is_buildtime_only = $request->is_buildtime_only;
+ }
$env->save();
return response()->json($this->removeSensitiveData($env))->setStatusCode(201);
@@ -2717,6 +2723,9 @@ class ApplicationsController extends Controller
if ($env->is_shown_once != $item->get('is_shown_once')) {
$env->is_shown_once = $item->get('is_shown_once');
}
+ if ($item->has('is_buildtime_only') && $env->is_buildtime_only != $item->get('is_buildtime_only')) {
+ $env->is_buildtime_only = $item->get('is_buildtime_only');
+ }
$env->save();
} else {
$env = $application->environment_variables()->create([
@@ -2726,6 +2735,7 @@ class ApplicationsController extends Controller
'is_literal' => $is_literal,
'is_multiline' => $is_multi_line,
'is_shown_once' => $is_shown_once,
+ 'is_buildtime_only' => $item->get('is_buildtime_only', false),
'resourceable_type' => get_class($application),
'resourceable_id' => $application->id,
]);
@@ -2743,6 +2753,9 @@ class ApplicationsController extends Controller
if ($env->is_shown_once != $item->get('is_shown_once')) {
$env->is_shown_once = $item->get('is_shown_once');
}
+ if ($item->has('is_buildtime_only') && $env->is_buildtime_only != $item->get('is_buildtime_only')) {
+ $env->is_buildtime_only = $item->get('is_buildtime_only');
+ }
$env->save();
} else {
$env = $application->environment_variables()->create([
@@ -2752,6 +2765,7 @@ class ApplicationsController extends Controller
'is_literal' => $is_literal,
'is_multiline' => $is_multi_line,
'is_shown_once' => $is_shown_once,
+ 'is_buildtime_only' => $item->get('is_buildtime_only', false),
'resourceable_type' => get_class($application),
'resourceable_id' => $application->id,
]);
@@ -2890,6 +2904,7 @@ class ApplicationsController extends Controller
'is_literal' => $request->is_literal ?? false,
'is_multiline' => $request->is_multiline ?? false,
'is_shown_once' => $request->is_shown_once ?? false,
+ 'is_buildtime_only' => $request->is_buildtime_only ?? false,
'resourceable_type' => get_class($application),
'resourceable_id' => $application->id,
]);
@@ -2912,6 +2927,7 @@ class ApplicationsController extends Controller
'is_literal' => $request->is_literal ?? false,
'is_multiline' => $request->is_multiline ?? false,
'is_shown_once' => $request->is_shown_once ?? false,
+ 'is_buildtime_only' => $request->is_buildtime_only ?? false,
'resourceable_type' => get_class($application),
'resourceable_id' => $application->id,
]);
diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php
index 8807f0f97..81628a629 100644
--- a/app/Jobs/ApplicationDeploymentJob.php
+++ b/app/Jobs/ApplicationDeploymentJob.php
@@ -911,7 +911,11 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
});
if ($this->pull_request_id === 0) {
$this->env_filename = '.env';
- foreach ($sorted_environment_variables as $env) {
+ // Filter out buildtime-only variables from runtime environment
+ $runtime_environment_variables = $sorted_environment_variables->filter(function ($env) {
+ return ! $env->is_buildtime_only;
+ });
+ foreach ($runtime_environment_variables as $env) {
$envs->push($env->key.'='.$env->real_value);
}
// Add PORT if not exists, use the first port as default
@@ -955,7 +959,11 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
}
} else {
$this->env_filename = '.env';
- foreach ($sorted_environment_variables_preview as $env) {
+ // Filter out buildtime-only variables from runtime environment for preview
+ $runtime_environment_variables_preview = $sorted_environment_variables_preview->filter(function ($env) {
+ return ! $env->is_buildtime_only;
+ });
+ foreach ($runtime_environment_variables_preview as $env) {
$envs->push($env->key.'='.$env->real_value);
}
// Add PORT if not exists, use the first port as default
diff --git a/app/Livewire/Project/Shared/EnvironmentVariable/Add.php b/app/Livewire/Project/Shared/EnvironmentVariable/Add.php
index a2d783232..9d5a5a39f 100644
--- a/app/Livewire/Project/Shared/EnvironmentVariable/Add.php
+++ b/app/Livewire/Project/Shared/EnvironmentVariable/Add.php
@@ -23,6 +23,8 @@ class Add extends Component
public bool $is_literal = false;
+ public bool $is_buildtime_only = false;
+
protected $listeners = ['clearAddEnv' => 'clear'];
protected $rules = [
@@ -30,6 +32,7 @@ class Add extends Component
'value' => 'nullable',
'is_multiline' => 'required|boolean',
'is_literal' => 'required|boolean',
+ 'is_buildtime_only' => 'required|boolean',
];
protected $validationAttributes = [
@@ -37,6 +40,7 @@ class Add extends Component
'value' => 'value',
'is_multiline' => 'multiline',
'is_literal' => 'literal',
+ 'is_buildtime_only' => 'buildtime only',
];
public function mount()
@@ -52,6 +56,7 @@ class Add extends Component
'value' => $this->value,
'is_multiline' => $this->is_multiline,
'is_literal' => $this->is_literal,
+ 'is_buildtime_only' => $this->is_buildtime_only,
'is_preview' => $this->is_preview,
]);
$this->clear();
@@ -63,5 +68,6 @@ class Add extends Component
$this->value = '';
$this->is_multiline = false;
$this->is_literal = false;
+ $this->is_buildtime_only = false;
}
}
diff --git a/app/Livewire/Project/Shared/EnvironmentVariable/All.php b/app/Livewire/Project/Shared/EnvironmentVariable/All.php
index 884441ec2..92c1d16f9 100644
--- a/app/Livewire/Project/Shared/EnvironmentVariable/All.php
+++ b/app/Livewire/Project/Shared/EnvironmentVariable/All.php
@@ -214,6 +214,7 @@ class All extends Component
$environment->value = $data['value'];
$environment->is_multiline = $data['is_multiline'] ?? false;
$environment->is_literal = $data['is_literal'] ?? false;
+ $environment->is_buildtime_only = $data['is_buildtime_only'] ?? false;
$environment->is_preview = $data['is_preview'] ?? false;
$environment->resourceable_id = $this->resource->id;
$environment->resourceable_type = $this->resource->getMorphClass();
diff --git a/app/Livewire/Project/Shared/EnvironmentVariable/Show.php b/app/Livewire/Project/Shared/EnvironmentVariable/Show.php
index 14b532bf8..ab70b70f4 100644
--- a/app/Livewire/Project/Shared/EnvironmentVariable/Show.php
+++ b/app/Livewire/Project/Shared/EnvironmentVariable/Show.php
@@ -38,6 +38,8 @@ class Show extends Component
public bool $is_shown_once = false;
+ public bool $is_buildtime_only = false;
+
public bool $is_required = false;
public bool $is_really_required = false;
@@ -56,6 +58,7 @@ class Show extends Component
'is_multiline' => 'required|boolean',
'is_literal' => 'required|boolean',
'is_shown_once' => 'required|boolean',
+ 'is_buildtime_only' => 'required|boolean',
'real_value' => 'nullable',
'is_required' => 'required|boolean',
];
@@ -99,6 +102,7 @@ class Show extends Component
} else {
$this->validate();
$this->env->is_required = $this->is_required;
+ $this->env->is_buildtime_only = $this->is_buildtime_only;
$this->env->is_shared = $this->is_shared;
}
$this->env->key = $this->key;
@@ -113,6 +117,7 @@ class Show extends Component
$this->is_multiline = $this->env->is_multiline;
$this->is_literal = $this->env->is_literal;
$this->is_shown_once = $this->env->is_shown_once;
+ $this->is_buildtime_only = $this->env->is_buildtime_only ?? false;
$this->is_required = $this->env->is_required ?? false;
$this->is_really_required = $this->env->is_really_required ?? false;
$this->is_shared = $this->env->is_shared ?? false;
diff --git a/app/Models/EnvironmentVariable.php b/app/Models/EnvironmentVariable.php
index 0afa703c2..85fcdcecb 100644
--- a/app/Models/EnvironmentVariable.php
+++ b/app/Models/EnvironmentVariable.php
@@ -17,6 +17,7 @@ use OpenApi\Attributes as OA;
'is_literal' => ['type' => 'boolean'],
'is_multiline' => ['type' => 'boolean'],
'is_preview' => ['type' => 'boolean'],
+ 'is_buildtime_only' => ['type' => 'boolean'],
'is_shared' => ['type' => 'boolean'],
'is_shown_once' => ['type' => 'boolean'],
'key' => ['type' => 'string'],
@@ -36,6 +37,7 @@ class EnvironmentVariable extends BaseModel
'value' => 'encrypted',
'is_multiline' => 'boolean',
'is_preview' => 'boolean',
+ 'is_buildtime_only' => 'boolean',
'version' => 'string',
'resourceable_type' => 'string',
'resourceable_id' => 'integer',
diff --git a/database/migrations/2025_09_11_150344_add_is_buildtime_only_to_environment_variables_table.php b/database/migrations/2025_09_11_150344_add_is_buildtime_only_to_environment_variables_table.php
new file mode 100644
index 000000000..d95f351d5
--- /dev/null
+++ b/database/migrations/2025_09_11_150344_add_is_buildtime_only_to_environment_variables_table.php
@@ -0,0 +1,28 @@
+boolean('is_buildtime_only')->default(false)->after('is_preview');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('environment_variables', function (Blueprint $table) {
+ $table->dropColumn('is_buildtime_only');
+ });
+ }
+};
diff --git a/resources/views/livewire/project/shared/environment-variable/add.blade.php b/resources/views/livewire/project/shared/environment-variable/add.blade.php
index 8e0993d43..5af9e6318 100644
--- a/resources/views/livewire/project/shared/environment-variable/add.blade.php
+++ b/resources/views/livewire/project/shared/environment-variable/add.blade.php
@@ -5,6 +5,9 @@
x-bind:label="$wire.is_multiline === false && 'Value'" required />