feat: rolling update

This commit is contained in:
Andras Bacsai
2023-08-21 18:00:12 +02:00
parent a3f3470137
commit bed959f1cd
19 changed files with 263 additions and 118 deletions

View File

@@ -9,3 +9,4 @@ const VALID_CRON_STRINGS = [
'monthly' => '0 0 1 * *',
'yearly' => '0 0 1 1 *',
];
const RESTART_MODE = 'unless-stopped';

View File

@@ -1,14 +1,27 @@
<?php
use App\Models\Application;
use App\Models\Server;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
function getCurrentApplicationContainerStatus(Server $server, int $id): Collection {
$containers = instant_remote_process(["docker ps -a --filter='label=coolify.applicationId={$id}' --format '{{json .}}' "], $server);
if (!$containers) {
return collect([]);
}
return format_docker_command_output_to_json($containers);
}
function format_docker_command_output_to_json($rawOutput): Collection
{
$outputLines = explode(PHP_EOL, $rawOutput);
return collect($outputLines)
if (count($outputLines) === 1) {
$outputLines = collect($outputLines[0]);
} else {
$outputLines = collect($outputLines);
}
return $outputLines
->reject(fn ($line) => empty($line))
->map(fn ($outputLine) => json_decode($outputLine, true, flags: JSON_THROW_ON_ERROR));
}
@@ -44,26 +57,38 @@ function format_docker_envs_to_json($rawOutput)
}
}
function get_container_status(Server $server, string $container_id, bool $all_data = false, bool $throwError = false)
function getApplicationContainerStatus(Application $application) {
$server = $application->destination->server;
$id = $application->id;
$containers = getCurrentApplicationContainerStatus($server, $id);
if ($containers->count() > 0) {
$status = data_get($containers[0], 'State', 'exited');
return $status;
}
return 'exited';
}
function getContainerStatus(Server $server, string $container_id, bool $all_data = false, bool $throwError = false)
{
check_server_connection($server);
// check_server_connection($server);
$container = instant_remote_process(["docker inspect --format '{{json .}}' {$container_id}"], $server, $throwError);
if (!$container) {
return 'exited';
}
$container = format_docker_command_output_to_json($container);
if ($all_data) {
return $container[0];
return $container;
}
return data_get($container[0], 'State.Status', 'exited');
}
function generate_container_name(string $uuid, int $pull_request_id = 0)
function generateApplicationContainerName(string $uuid, int $pull_request_id = 0)
{
if ($pull_request_id !== 0) {
return $uuid . '-pr-' . $pull_request_id;
$now = now()->format('YmdHis');
if ($pull_request_id !== 0 && $pull_request_id !== null) {
return $uuid . '-pr-' . $pull_request_id . '-' . $now;
} else {
return $uuid;
return $uuid . '-' . $now;
}
}
function get_port_from_dockerfile($dockerfile): int

View File

@@ -32,7 +32,7 @@ function generate_default_proxy_configuration(Server $server)
"traefik" => [
"container_name" => "coolify-proxy",
"image" => "traefik:v2.10",
"restart" => "always",
"restart" => RESTART_MODE,
"extra_hosts" => [
"host.docker.internal:host-gateway",
],