Added pre-deployment support.

This commit is contained in:
Stuart Rowlands 2024-02-08 20:02:30 +10:00
parent 77a0179822
commit 0538c2f478
4 changed files with 41 additions and 2 deletions

View File

@ -783,8 +783,8 @@ private function prepare_builder_image()
[
"command" => executeInDocker($this->deployment_uuid, "mkdir -p {$this->basedir}")
],
);
$this->run_pre_deployment_command();
}
private function deploy_to_additional_destinations()
{
@ -1516,6 +1516,33 @@ private function add_build_env_variables_to_dockerfile()
]);
}
private function run_pre_deployment_command()
{
if (empty($this->application->pre_deployment_command)) {
return;
}
$containers = getCurrentApplicationContainerStatus($this->server, $this->application->id, $this->pull_request_id);
if ($containers->count() == 0) {
return;
}
$this->application_deployment_queue->addLogEntry("Executing pre deployment command: {$this->application->post_deployment_command}");
foreach ($containers as $container) {
$containerName = data_get($container, 'Names');
if ($containers->count() == 1 || str_starts_with($containerName, $this->application->pre_deployment_command_container. '-' . $this->application->uuid)) {
$cmd = 'sh -c "' . str_replace('"', '\"', $this->application->pre_deployment_command) . '"';
$exec = "docker exec {$containerName} {$cmd}";
$this->execute_remote_command(
[
executeInDocker($this->deployment_uuid, $exec), 'hidden' => true
],
);
return;
}
}
throw new RuntimeException('Pre deployment command: Could not find a valid container. Is the container name correct?');
}
private function run_post_deployment_command()
{
if (empty($this->application->post_deployment_command)) {

View File

@ -66,6 +66,8 @@ class General extends Component
'application.docker_compose_custom_build_command' => 'nullable',
'application.custom_labels' => 'nullable',
'application.custom_docker_run_options' => 'nullable',
'application.pre_deployment_command' => 'nullable',
'application.pre_deployment_command_container' => 'nullable',
'application.post_deployment_command' => 'nullable',
'application.post_deployment_command_container' => 'nullable',
'application.settings.is_static' => 'boolean|required',

View File

@ -14,6 +14,8 @@ public function up(): void
Schema::table('applications', function (Blueprint $table) {
$table->string('post_deployment_command')->nullable();
$table->string('post_deployment_command_container')->nullable();
$table->string('pre_deployment_command')->nullable();
$table->string('pre_deployment_command_container')->nullable();
});
}
@ -25,6 +27,8 @@ public function down(): void
Schema::table('applications', function (Blueprint $table) {
$table->dropColumn('post_deployment_command');
$table->dropColumn('post_deployment_command_container');
$table->dropColumn('pre_deployment_command');
$table->dropColumn('pre_deployment_command_container');
});
}
};

View File

@ -238,9 +238,15 @@ class="underline" href="https://coolify.io/docs/docker/registry"
@endif
<h3 class="pt-8">Deployment scripts</h3>
<div class="flex flex-col gap-2 xl:flex-row">
<x-forms.input placeholder="" id="application.pre_deployment_command" label="Pre deployment command"
helper="An optional script or command to execute in the existing container before the deployment begins." />
<x-forms.input placeholder="" id="application.pre_deployment_command_container" label="Container name"
helper="The name of the container to execute within. You can leave it blank if your application only has one container." />
</div>
<div class="flex flex-col gap-2 xl:flex-row">
<x-forms.input placeholder="php artisan migrate" id="application.post_deployment_command" label="Post deployment command"
helper="An optional script or command to execute in a container after the deployment completes." />
helper="An optional script or command to execute in the newly built container after the deployment completes." />
<x-forms.input placeholder="php" id="application.post_deployment_command_container" label="Container name"
helper="The name of the container to execute within. You can leave it blank if your application only has one container." />
</div>