A 2026-08-17-i eset általánosítása: a d2d/e2e Docker Swarmban ugyanazt a kódot több service futtatja közös volume-ról, és a queue:work hosszan futó folyamat a betöltött osztályokat a memóriájában tartja. A fájlmásolás után a worker RÉGI kóddal dolgozta fel a jobot - a felület jónak látszott, a háttérfeladat némán a régi viselkedést hozta. - config: 'runtime' minta (app/, config/, database/, routes/, bootstrap/, composer.lock), mert a restart nem csak a jobok változásakor kell; targetenként a service nevek és a Swarm manager elérése - a felületen figyelmeztetés, a teendőkben a konkrét ssh + docker service update parancs - a restart szándékosan a cache ürítés UTÁN: a frissen induló worker különben a régi, cache-elt konfigot töltené be - a d2d schedulernél jelezzük, hogy 0 replikán fut (a restart üresjárat lehet), a t2t-nél pedig azt, hogy queue service még nincs, de a névkonvenció alapján t2t_queue lesz Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
89 lines
2.5 KiB
PHP
89 lines
2.5 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Deployment;
|
|
|
|
/**
|
|
* A célkörnyezetek (e2e, d2d) feloldása a config/deployment.php-ból.
|
|
*
|
|
* A target nem utólagos címke: már a csomagoláskor rögzül, mert befolyásolja a
|
|
* mappanevet, a teendők listáját, a kezdő commit előtöltését és a naplót is.
|
|
*/
|
|
class DeploymentTargets
|
|
{
|
|
/**
|
|
* @return array<string, array{key:string, label:string, domain:string, remote_path:string, expected_branch:?string, services:array<string, string>, services_note:?string}>
|
|
*/
|
|
public function all(): array
|
|
{
|
|
/** @var array<string, array<string, mixed>> $targets */
|
|
$targets = (array) config('deployment.targets', []);
|
|
|
|
$resolved = [];
|
|
|
|
foreach ($targets as $key => $target) {
|
|
$resolved[$key] = array_merge(
|
|
[
|
|
'label' => $key,
|
|
'domain' => '',
|
|
'remote_path' => '',
|
|
'expected_branch' => null,
|
|
'services' => [],
|
|
'services_note' => null,
|
|
],
|
|
$target,
|
|
['key' => $key],
|
|
);
|
|
}
|
|
|
|
return $resolved;
|
|
}
|
|
|
|
/**
|
|
* A célkörnyezet hosszan futó service-einek újraindító parancsai.
|
|
*
|
|
* @return array<int, string>
|
|
*/
|
|
public function restartCommands(?string $key): array
|
|
{
|
|
$target = $this->find($key);
|
|
|
|
if (! $target || $target['services'] === []) {
|
|
return [];
|
|
}
|
|
|
|
$user = (string) config('deployment.swarm.user', 'root');
|
|
$host = (string) config('deployment.swarm.host');
|
|
|
|
return array_values(array_map(
|
|
fn (string $service): string => sprintf(
|
|
'ssh %s@%s "docker service update --force %s"',
|
|
$user,
|
|
$host,
|
|
$service,
|
|
),
|
|
$target['services'],
|
|
));
|
|
}
|
|
|
|
/**
|
|
* @return array{key:string, label:string, domain:string, remote_path:string, expected_branch:?string, services:array<string, string>, services_note:?string}|null
|
|
*/
|
|
public function find(?string $key): ?array
|
|
{
|
|
return $key ? ($this->all()[$key] ?? null) : null;
|
|
}
|
|
|
|
/**
|
|
* @return array<string, string>
|
|
*/
|
|
public function options(): array
|
|
{
|
|
return array_map(fn (array $target): string => $target['label'], $this->all());
|
|
}
|
|
|
|
public function defaultKey(): ?string
|
|
{
|
|
return array_key_first($this->all());
|
|
}
|
|
}
|