Compare commits

...

10 Commits

Author SHA1 Message Date
Andras Bacsai
5e0adc3777 Merge pull request #1275 from coollabsio/next
v4.0.0-beta.56
2023-10-01 18:16:24 +02:00
Andras Bacsai
7d06fc4403 fix: do not show subscription cancelled noti 2023-10-01 18:14:24 +02:00
Andras Bacsai
0e1bcceb8e feat: able to disable container healthchecks
fix: dockerfile based deployments have hc off by default
2023-10-01 18:14:13 +02:00
Andras Bacsai
a922f2fedf version++ 2023-10-01 18:13:34 +02:00
Andras Bacsai
1e0226c8ed Merge pull request #1274 from coollabsio/next
v4.0.0-beta.55
2023-10-01 17:40:31 +02:00
Andras Bacsai
5c45908087 fix: if app settings is not saved to db 2023-10-01 17:39:57 +02:00
Andras Bacsai
aefdc76805 fix: dockerfile expose is not overwritten 2023-10-01 17:27:12 +02:00
Andras Bacsai
b3c8c881b7 Revert "fix: services should have destination as well"
This reverts commit 9ab5a1f7bd.
2023-10-01 15:31:25 +02:00
Andras Bacsai
9ab5a1f7bd fix: services should have destination as well 2023-10-01 13:59:22 +02:00
Andras Bacsai
23968e7886 version++ 2023-10-01 13:28:33 +02:00
12 changed files with 93 additions and 33 deletions

View File

@@ -104,13 +104,15 @@ class General extends Component
} }
public function mount() public function mount()
{ {
$this->is_static = $this->application->settings->is_static; if (data_get($this->application,'settings')) {
$this->is_git_submodules_enabled = $this->application->settings->is_git_submodules_enabled; $this->is_static = $this->application->settings->is_static;
$this->is_git_lfs_enabled = $this->application->settings->is_git_lfs_enabled; $this->is_git_submodules_enabled = $this->application->settings->is_git_submodules_enabled;
$this->is_debug_enabled = $this->application->settings->is_debug_enabled; $this->is_git_lfs_enabled = $this->application->settings->is_git_lfs_enabled;
$this->is_preview_deployments_enabled = $this->application->settings->is_preview_deployments_enabled; $this->is_debug_enabled = $this->application->settings->is_debug_enabled;
$this->is_auto_deploy_enabled = $this->application->settings->is_auto_deploy_enabled; $this->is_preview_deployments_enabled = $this->application->settings->is_preview_deployments_enabled;
$this->is_force_https_enabled = $this->application->settings->is_force_https_enabled; $this->is_auto_deploy_enabled = $this->application->settings->is_auto_deploy_enabled;
$this->is_force_https_enabled = $this->application->settings->is_force_https_enabled;
}
} }
public function submit() public function submit()

View File

@@ -45,6 +45,9 @@ CMD ["nginx", "-g", "daemon off;"]
$environment = $project->load(['environments'])->environments->where('name', $this->parameters['environment_name'])->first(); $environment = $project->load(['environments'])->environments->where('name', $this->parameters['environment_name'])->first();
$port = get_port_from_dockerfile($this->dockerfile); $port = get_port_from_dockerfile($this->dockerfile);
if (!$port) {
$port = 80;
}
$application = Application::create([ $application = Application::create([
'name' => 'dockerfile-' . new Cuid2(7), 'name' => 'dockerfile-' . new Cuid2(7),
'repository_project_id' => 0, 'repository_project_id' => 0,
@@ -56,6 +59,7 @@ CMD ["nginx", "-g", "daemon off;"]
'environment_id' => $environment->id, 'environment_id' => $environment->id,
'destination_id' => $destination->id, 'destination_id' => $destination->id,
'destination_type' => $destination_class, 'destination_type' => $destination_class,
'health_check_enabled' => false,
'source_id' => 0, 'source_id' => 0,
'source_type' => GithubApp::class 'source_type' => GithubApp::class
]); ]);

View File

@@ -9,6 +9,7 @@ class HealthChecks extends Component
public $resource; public $resource;
protected $rules = [ protected $rules = [
'resource.health_check_enabled' => 'boolean',
'resource.health_check_path' => 'string', 'resource.health_check_path' => 'string',
'resource.health_check_port' => 'nullable|string', 'resource.health_check_port' => 'nullable|string',
'resource.health_check_host' => 'string', 'resource.health_check_host' => 'string',
@@ -22,12 +23,19 @@ class HealthChecks extends Component
'resource.health_check_start_period' => 'integer', 'resource.health_check_start_period' => 'integer',
]; ];
public function instantSave()
{
$this->resource->save();
$this->emit('success', 'Health check updated.');
}
public function submit() public function submit()
{ {
try { try {
$this->validate(); $this->validate();
$this->resource->save(); $this->resource->save();
$this->emit('saved'); $this->emit('success', 'Health check updated.');
} catch (\Throwable $e) { } catch (\Throwable $e) {
return handleError($e, $this); return handleError($e, $this);
} }

View File

@@ -303,6 +303,10 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
} }
private function health_check() private function health_check()
{ {
if ($this->application->isHealthcheckDisabled()) {
$this->newVersionIsHealthy = true;
return;
}
ray('New container name: ', $this->container_name); ray('New container name: ', $this->container_name);
if ($this->container_name) { if ($this->container_name) {
$counter = 0; $counter = 0;
@@ -573,6 +577,9 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
] ]
] ]
]; ];
if ($this->application->isHealthcheckDisabled()) {
data_forget($docker_compose, 'services.' . $this->container_name . '.healthcheck');
}
if (count($this->application->ports_mappings_array) > 0 && $this->pull_request_id === 0) { if (count($this->application->ports_mappings_array) > 0 && $this->pull_request_id === 0) {
$docker_compose['services'][$this->container_name]['ports'] = $this->application->ports_mappings_array; $docker_compose['services'][$this->container_name]['ports'] = $this->application->ports_mappings_array;
} }

View File

@@ -231,4 +231,12 @@ class Application extends BaseModel
} }
return true; return true;
} }
public function isHealthcheckDisabled(): bool
{
if (data_get($this, 'dockerfile') || data_get($this, 'build_pack') === 'dockerfile' || data_get($this,'health_check_enabled') === false) {
ray('dockerfile');
return true;
}
return false;
}
} }

View File

@@ -113,7 +113,7 @@ function generateApplicationContainerName(Application $application, $pull_reques
return $application->uuid . '-' . $now; return $application->uuid . '-' . $now;
} }
} }
function get_port_from_dockerfile($dockerfile): int function get_port_from_dockerfile($dockerfile): int|null
{ {
$dockerfile_array = explode("\n", $dockerfile); $dockerfile_array = explode("\n", $dockerfile);
$found_exposed_port = null; $found_exposed_port = null;
@@ -127,7 +127,7 @@ function get_port_from_dockerfile($dockerfile): int
if ($found_exposed_port) { if ($found_exposed_port) {
return (int)$found_exposed_port->value(); return (int)$found_exposed_port->value();
} }
return 80; return null;
} }
function defaultLabels($id, $name, $pull_request_id = 0, string $type = 'application', $subType = null, $subId = null) function defaultLabels($id, $name, $pull_request_id = 0, string $type = 'application', $subType = null, $subId = null)

View File

@@ -7,7 +7,7 @@ return [
// The release version of your application // The release version of your application
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')) // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
'release' => '4.0.0-beta.54', 'release' => '4.0.0-beta.56',
// When left empty or `null` the Laravel environment will be used // When left empty or `null` the Laravel environment will be used
'environment' => config('app.env'), 'environment' => config('app.env'),

View File

@@ -1,3 +1,3 @@
<?php <?php
return '4.0.0-beta.54'; return '4.0.0-beta.56';

View File

@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('applications', function (Blueprint $table) {
$table->boolean('health_check_enabled')->default(true);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('applications', function (Blueprint $table) {
$table->dropColumn('health_check_enabled');
});
}
};

View File

@@ -5,24 +5,27 @@
</div> </div>
<div class="pb-4">Define how your resource's health should be checked.</div> <div class="pb-4">Define how your resource's health should be checked.</div>
<div class="flex flex-col gap-4"> <div class="flex flex-col gap-4">
<div class="flex gap-2"> <div class="w-32">
<x-forms.input id="resource.health_check_method" placeholder="GET" label="Method" required /> <x-forms.checkbox instantSave id="resource.health_check_enabled" label="Enabled" />
</div>
<div class="flex gap-2">
<x-forms.input id="resource.health_check_method" placeholder="GET" label="Method" required />
<x-forms.input id="resource.health_check_scheme" placeholder="http" label="Scheme" required /> <x-forms.input id="resource.health_check_scheme" placeholder="http" label="Scheme" required />
<x-forms.input id="resource.health_check_host" placeholder="localhost" label="Host" required /> <x-forms.input id="resource.health_check_host" placeholder="localhost" label="Host" required />
<x-forms.input id="resource.health_check_port" <x-forms.input id="resource.health_check_port"
helper="If no port is defined, the first exposed port will be used." placeholder="80" label="Port" /> helper="If no port is defined, the first exposed port will be used." placeholder="80" label="Port" />
<x-forms.input id="resource.health_check_path" placeholder="/health" label="Path" required /> <x-forms.input id="resource.health_check_path" placeholder="/health" label="Path" required />
</div>
<div class="flex gap-2">
<x-forms.input id="resource.health_check_return_code" placeholder="200" label="Return Code" required />
<x-forms.input id="resource.health_check_response_text" placeholder="OK" label="Response Text" />
</div>
<div class="flex gap-2">
<x-forms.input id="resource.health_check_interval" placeholder="30" label="Interval" required />
<x-forms.input id="resource.health_check_timeout" placeholder="30" label="Timeout" required />
<x-forms.input id="resource.health_check_retries" placeholder="3" label="Retries" required />
<x-forms.input id="resource.health_check_start_period" placeholder="30" label="Start Period" required />
</div>
</div> </div>
<div class="flex gap-2">
<x-forms.input id="resource.health_check_return_code" placeholder="200" label="Return Code" required />
<x-forms.input id="resource.health_check_response_text" placeholder="OK" label="Response Text" />
</div>
<div class="flex gap-2">
<x-forms.input id="resource.health_check_interval" placeholder="30" label="Interval" required />
<x-forms.input id="resource.health_check_timeout" placeholder="30" label="Timeout" required />
<x-forms.input id="resource.health_check_retries" placeholder="3" label="Retries" required />
<x-forms.input id="resource.health_check_start_period" placeholder="30" label="Start Period" required />
</div>
</div>
</form> </form>

View File

@@ -327,7 +327,7 @@ Route::post('/payments/stripe/events', function () {
} }
if ($alreadyCancelAtPeriodEnd !== $cancelAtPeriodEnd) { if ($alreadyCancelAtPeriodEnd !== $cancelAtPeriodEnd) {
if ($cancelAtPeriodEnd) { if ($cancelAtPeriodEnd) {
send_internal_notification('Subscription cancelled at period end for team: ' . $subscription->team->id); // send_internal_notification('Subscription cancelled at period end for team: ' . $subscription->team->id);
} else { } else {
send_internal_notification('Subscription resumed for team: ' . $subscription->team->id); send_internal_notification('Subscription resumed for team: ' . $subscription->team->id);
} }
@@ -346,7 +346,7 @@ Route::post('/payments/stripe/events', function () {
'stripe_invoice_paid' => false, 'stripe_invoice_paid' => false,
'stripe_trial_already_ended' => true, 'stripe_trial_already_ended' => true,
]); ]);
send_internal_notification('Subscription cancelled: ' . $subscription->team->id); // send_internal_notification('Subscription cancelled: ' . $subscription->team->id);
break; break;
case 'customer.subscription.trial_will_end': case 'customer.subscription.trial_will_end':
$customerId = data_get($data, 'customer'); $customerId = data_get($data, 'customer');

View File

@@ -4,7 +4,7 @@
"version": "3.12.36" "version": "3.12.36"
}, },
"v4": { "v4": {
"version": "4.0.0-beta.54" "version": "4.0.0-beta.56"
} }
} }
} }