|
|
|
|
@@ -192,8 +192,8 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
|
|
|
|
|
$this->preserveRepository = $this->application->settings->is_preserve_repository_enabled;
|
|
|
|
|
|
|
|
|
|
$this->basedir = $this->application->generateBaseDir($this->deployment_uuid);
|
|
|
|
|
$this->workdir = "{$this->basedir}" . rtrim($this->application->base_directory, '/');
|
|
|
|
|
$this->configuration_dir = application_configuration_dir() . "/{$this->application->uuid}";
|
|
|
|
|
$this->workdir = "{$this->basedir}".rtrim($this->application->base_directory, '/');
|
|
|
|
|
$this->configuration_dir = application_configuration_dir()."/{$this->application->uuid}";
|
|
|
|
|
$this->is_debug_enabled = $this->application->settings->is_debug_enabled;
|
|
|
|
|
|
|
|
|
|
$this->container_name = generateApplicationContainerName($this->application, $this->pull_request_id);
|
|
|
|
|
@@ -402,13 +402,13 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
|
|
|
|
|
if (data_get($this->application, 'docker_compose_custom_start_command')) {
|
|
|
|
|
$this->docker_compose_custom_start_command = $this->application->docker_compose_custom_start_command;
|
|
|
|
|
if (! str($this->docker_compose_custom_start_command)->contains('--project-directory')) {
|
|
|
|
|
$this->docker_compose_custom_start_command = str($this->docker_compose_custom_start_command)->replaceFirst('compose', 'compose --project-directory ' . $this->workdir)->value();
|
|
|
|
|
$this->docker_compose_custom_start_command = str($this->docker_compose_custom_start_command)->replaceFirst('compose', 'compose --project-directory '.$this->workdir)->value();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (data_get($this->application, 'docker_compose_custom_build_command')) {
|
|
|
|
|
$this->docker_compose_custom_build_command = $this->application->docker_compose_custom_build_command;
|
|
|
|
|
if (! str($this->docker_compose_custom_build_command)->contains('--project-directory')) {
|
|
|
|
|
$this->docker_compose_custom_build_command = str($this->docker_compose_custom_build_command)->replaceFirst('compose', 'compose --project-directory ' . $this->workdir)->value();
|
|
|
|
|
$this->docker_compose_custom_build_command = str($this->docker_compose_custom_build_command)->replaceFirst('compose', 'compose --project-directory '.$this->workdir)->value();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ($this->pull_request_id === 0) {
|
|
|
|
|
@@ -422,7 +422,7 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
|
|
|
|
|
if ($this->preserveRepository) {
|
|
|
|
|
foreach ($this->application->fileStorages as $fileStorage) {
|
|
|
|
|
$path = $fileStorage->fs_path;
|
|
|
|
|
$saveName = 'file_stat_' . $fileStorage->id;
|
|
|
|
|
$saveName = 'file_stat_'.$fileStorage->id;
|
|
|
|
|
$realPathInGit = str($path)->replace($this->application->workdir(), $this->workdir)->value();
|
|
|
|
|
// check if the file is a directory or a file inside the repository
|
|
|
|
|
$this->execute_remote_command(
|
|
|
|
|
@@ -740,7 +740,7 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
ray('push_to_docker_registry noww: ' . $this->production_image_name);
|
|
|
|
|
ray('push_to_docker_registry noww: '.$this->production_image_name);
|
|
|
|
|
try {
|
|
|
|
|
instant_remote_process(["docker images --format '{{json .}}' {$this->production_image_name}"], $this->server);
|
|
|
|
|
$this->application_deployment_queue->addLogEntry('----------------------------------------');
|
|
|
|
|
@@ -927,12 +927,12 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
|
|
|
|
|
$real_value = $env->real_value;
|
|
|
|
|
} else {
|
|
|
|
|
if ($env->is_literal || $env->is_multiline) {
|
|
|
|
|
$real_value = '\'' . $real_value . '\'';
|
|
|
|
|
$real_value = '\''.$real_value.'\'';
|
|
|
|
|
} else {
|
|
|
|
|
$real_value = escapeEnvVariables($env->real_value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
$envs->push($env->key . '=' . $real_value);
|
|
|
|
|
$envs->push($env->key.'='.$real_value);
|
|
|
|
|
}
|
|
|
|
|
// Add PORT if not exists, use the first port as default
|
|
|
|
|
if ($this->build_pack !== 'dockercompose') {
|
|
|
|
|
@@ -977,12 +977,12 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
|
|
|
|
|
$real_value = $env->real_value;
|
|
|
|
|
} else {
|
|
|
|
|
if ($env->is_literal || $env->is_multiline) {
|
|
|
|
|
$real_value = '\'' . $real_value . '\'';
|
|
|
|
|
$real_value = '\''.$real_value.'\'';
|
|
|
|
|
} else {
|
|
|
|
|
$real_value = escapeEnvVariables($env->real_value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
$envs->push($env->key . '=' . $real_value);
|
|
|
|
|
$envs->push($env->key.'='.$real_value);
|
|
|
|
|
}
|
|
|
|
|
// Add PORT if not exists, use the first port as default
|
|
|
|
|
if ($this->build_pack !== 'dockercompose') {
|
|
|
|
|
@@ -1349,7 +1349,7 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
|
|
|
|
|
destination: $destination,
|
|
|
|
|
no_questions_asked: true,
|
|
|
|
|
);
|
|
|
|
|
$this->application_deployment_queue->addLogEntry("Deployment to {$server->name}. Logs: " . route('project.application.deployment.show', [
|
|
|
|
|
$this->application_deployment_queue->addLogEntry("Deployment to {$server->name}. Logs: ".route('project.application.deployment.show', [
|
|
|
|
|
'project_uuid' => data_get($this->application, 'environment.project.uuid'),
|
|
|
|
|
'application_uuid' => data_get($this->application, 'uuid'),
|
|
|
|
|
'deployment_uuid' => $deployment_uuid,
|
|
|
|
|
@@ -1686,27 +1686,27 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
|
|
|
|
|
'CMD-SHELL',
|
|
|
|
|
$this->generate_healthcheck_commands(),
|
|
|
|
|
],
|
|
|
|
|
'interval' => $this->application->health_check_interval . 's',
|
|
|
|
|
'timeout' => $this->application->health_check_timeout . 's',
|
|
|
|
|
'interval' => $this->application->health_check_interval.'s',
|
|
|
|
|
'timeout' => $this->application->health_check_timeout.'s',
|
|
|
|
|
'retries' => $this->application->health_check_retries,
|
|
|
|
|
'start_period' => $this->application->health_check_start_period . 's',
|
|
|
|
|
'start_period' => $this->application->health_check_start_period.'s',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
if (! is_null($this->application->limits_cpuset)) {
|
|
|
|
|
data_set($docker_compose, 'services.' . $this->container_name . '.cpuset', $this->application->limits_cpuset);
|
|
|
|
|
data_set($docker_compose, 'services.'.$this->container_name.'.cpuset', $this->application->limits_cpuset);
|
|
|
|
|
}
|
|
|
|
|
if ($this->server->isSwarm()) {
|
|
|
|
|
data_forget($docker_compose, 'services.' . $this->container_name . '.container_name');
|
|
|
|
|
data_forget($docker_compose, 'services.' . $this->container_name . '.expose');
|
|
|
|
|
data_forget($docker_compose, 'services.' . $this->container_name . '.restart');
|
|
|
|
|
data_forget($docker_compose, 'services.'.$this->container_name.'.container_name');
|
|
|
|
|
data_forget($docker_compose, 'services.'.$this->container_name.'.expose');
|
|
|
|
|
data_forget($docker_compose, 'services.'.$this->container_name.'.restart');
|
|
|
|
|
|
|
|
|
|
data_forget($docker_compose, 'services.' . $this->container_name . '.mem_limit');
|
|
|
|
|
data_forget($docker_compose, 'services.' . $this->container_name . '.memswap_limit');
|
|
|
|
|
data_forget($docker_compose, 'services.' . $this->container_name . '.mem_swappiness');
|
|
|
|
|
data_forget($docker_compose, 'services.' . $this->container_name . '.mem_reservation');
|
|
|
|
|
data_forget($docker_compose, 'services.' . $this->container_name . '.cpus');
|
|
|
|
|
data_forget($docker_compose, 'services.' . $this->container_name . '.cpuset');
|
|
|
|
|
data_forget($docker_compose, 'services.' . $this->container_name . '.cpu_shares');
|
|
|
|
|
data_forget($docker_compose, 'services.'.$this->container_name.'.mem_limit');
|
|
|
|
|
data_forget($docker_compose, 'services.'.$this->container_name.'.memswap_limit');
|
|
|
|
|
data_forget($docker_compose, 'services.'.$this->container_name.'.mem_swappiness');
|
|
|
|
|
data_forget($docker_compose, 'services.'.$this->container_name.'.mem_reservation');
|
|
|
|
|
data_forget($docker_compose, 'services.'.$this->container_name.'.cpus');
|
|
|
|
|
data_forget($docker_compose, 'services.'.$this->container_name.'.cpuset');
|
|
|
|
|
data_forget($docker_compose, 'services.'.$this->container_name.'.cpu_shares');
|
|
|
|
|
|
|
|
|
|
$docker_compose['services'][$this->container_name]['deploy'] = [
|
|
|
|
|
'mode' => 'replicated',
|
|
|
|
|
@@ -1775,20 +1775,20 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ($this->application->isHealthcheckDisabled()) {
|
|
|
|
|
data_forget($docker_compose, 'services.' . $this->container_name . '.healthcheck');
|
|
|
|
|
data_forget($docker_compose, 'services.'.$this->container_name.'.healthcheck');
|
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (count($persistent_storages) > 0) {
|
|
|
|
|
if (! data_get($docker_compose, 'services.' . $this->container_name . '.volumes')) {
|
|
|
|
|
if (! data_get($docker_compose, 'services.'.$this->container_name.'.volumes')) {
|
|
|
|
|
$docker_compose['services'][$this->container_name]['volumes'] = [];
|
|
|
|
|
}
|
|
|
|
|
$docker_compose['services'][$this->container_name]['volumes'] = array_merge($docker_compose['services'][$this->container_name]['volumes'], $persistent_storages);
|
|
|
|
|
}
|
|
|
|
|
if (count($persistent_file_volumes) > 0) {
|
|
|
|
|
if (! data_get($docker_compose, 'services.' . $this->container_name . '.volumes')) {
|
|
|
|
|
if (! data_get($docker_compose, 'services.'.$this->container_name.'.volumes')) {
|
|
|
|
|
$docker_compose['services'][$this->container_name]['volumes'] = [];
|
|
|
|
|
}
|
|
|
|
|
$docker_compose['services'][$this->container_name]['volumes'] = array_merge($docker_compose['services'][$this->container_name]['volumes'], $persistent_file_volumes->map(function ($item) {
|
|
|
|
|
@@ -1856,9 +1856,9 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
|
|
|
|
|
$volume_name = $persistentStorage->name;
|
|
|
|
|
}
|
|
|
|
|
if ($this->pull_request_id !== 0) {
|
|
|
|
|
$volume_name = $volume_name . '-pr-' . $this->pull_request_id;
|
|
|
|
|
$volume_name = $volume_name.'-pr-'.$this->pull_request_id;
|
|
|
|
|
}
|
|
|
|
|
$local_persistent_volumes[] = $volume_name . ':' . $persistentStorage->mount_path;
|
|
|
|
|
$local_persistent_volumes[] = $volume_name.':'.$persistentStorage->mount_path;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $local_persistent_volumes;
|
|
|
|
|
@@ -1874,7 +1874,7 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
|
|
|
|
|
$name = $persistentStorage->name;
|
|
|
|
|
|
|
|
|
|
if ($this->pull_request_id !== 0) {
|
|
|
|
|
$name = $name . '-pr-' . $this->pull_request_id;
|
|
|
|
|
$name = $name.'-pr-'.$this->pull_request_id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$local_persistent_volumes_names[$name] = [
|
|
|
|
|
@@ -2152,7 +2152,7 @@ COPY ./nginx.conf /etc/nginx/conf.d/default.conf");
|
|
|
|
|
$containers = getCurrentApplicationContainerStatus($this->server, $this->application->id, $this->pull_request_id);
|
|
|
|
|
if ($this->pull_request_id === 0) {
|
|
|
|
|
$containers = $containers->filter(function ($container) {
|
|
|
|
|
return data_get($container, 'Names') !== $this->container_name && data_get($container, 'Names') !== $this->container_name . '-pr-' . $this->pull_request_id;
|
|
|
|
|
return data_get($container, 'Names') !== $this->container_name && data_get($container, 'Names') !== $this->container_name.'-pr-'.$this->pull_request_id;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
$containers->each(function ($container) {
|
|
|
|
|
@@ -2259,8 +2259,8 @@ COPY ./nginx.conf /etc/nginx/conf.d/default.conf");
|
|
|
|
|
|
|
|
|
|
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) . "'";
|
|
|
|
|
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(
|
|
|
|
|
[
|
|
|
|
|
@@ -2286,8 +2286,8 @@ COPY ./nginx.conf /etc/nginx/conf.d/default.conf");
|
|
|
|
|
$containers = getCurrentApplicationContainerStatus($this->server, $this->application->id, $this->pull_request_id);
|
|
|
|
|
foreach ($containers as $container) {
|
|
|
|
|
$containerName = data_get($container, 'Names');
|
|
|
|
|
if ($containers->count() == 1 || str_starts_with($containerName, $this->application->post_deployment_command_container . '-' . $this->application->uuid)) {
|
|
|
|
|
$cmd = "sh -c '" . str_replace("'", "'\''", $this->application->post_deployment_command) . "'";
|
|
|
|
|
if ($containers->count() == 1 || str_starts_with($containerName, $this->application->post_deployment_command_container.'-'.$this->application->uuid)) {
|
|
|
|
|
$cmd = "sh -c '".str_replace("'", "'\''", $this->application->post_deployment_command)."'";
|
|
|
|
|
$exec = "docker exec {$containerName} {$cmd}";
|
|
|
|
|
try {
|
|
|
|
|
$this->execute_remote_command(
|
|
|
|
|
|