d2d.emegrendeles.hu/app/Models/DeploymentPackage.php
E98Developer bfc1484611 ADD Deployment csomagoló phase3 napló, környezetkövetés, ZIP letöltés és törlő szkript
A csomagolás mostantól nyomot hagy: melyik környezetre mi készült, mi lett kirakva, és
mennyi a lemaradás - ez az, ami a "melyik verzió fut az e2e-n" kérdést kiveszi a fejből.

- deployment_packages tábla + modell (BaseAuditable): target, tartomány, darabszámok,
  mappa/ZIP útvonal, deployed_at. A csomagolás és a tényleges kirakás két külön esemény.
- Targetenkénti előtöltés: a kezdő commit az adott környezetre utoljára kirakottként
  megjelölt csomag to_commit-je. Rebase után nem létező hash esetén inkább üres marad,
  mint hogy hamis tartományt mutasson.
- "Környezetek állapota" panel: napló szerinti állapot + commit-lemaradás
  (git rev-list --count), és gombra a szerver deploy-version.json-jának lekérdezése.
  Ha a kettő eltér, az elmaradt vagy félbemaradt feltöltés jele. Szándékosan gombra fut,
  nem minden rendereléskor: így nem indul kimenő kérés magától.
- ZIP a kész mappából (a fájllista a zip létrejötte előtt készül, így nem csomagolja
  magát), letöltés a naplóból. A DB-ből jövő útvonalat kiírás előtt a kimeneti mappához
  kötjük, hogy egy módosított rekord se tehessen letölthetővé tetszőleges fájlt.
- _torles.sh: alapból dry run, --confirm kell a törléshez, app-gyökér ellenőrzéssel,
  abszolút útvonal és .. kiszűrésével, LF sorvéggel és BOM nélkül. Lefuttatva ellenőrizve.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 07:20:34 +02:00

49 lines
1.2 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
* Egy elkészített deployment csomag naplóbejegyzése.
*
* Nem csak audit: a legutóbb kirakott csomag `to_commit`-je adja a következő csomag
* alapértelmezett kezdő commitját, környezetenként külön - ez az, ami a "mi maradt ki
* a másolásból" hibát megelőzi.
*/
class DeploymentPackage extends BaseAuditable
{
use SoftDeletes;
protected $casts = [
'deployed_at' => 'datetime',
'copied_count' => 'integer',
'deleted_count' => 'integer',
'skipped_count' => 'integer',
'missing_count' => 'integer',
];
public function scopeForTarget(Builder $query, string $target): Builder
{
return $query->where('target', $target);
}
/**
* Az adott környezetre utoljára kirakottként megjelölt csomag.
*/
public static function lastDeployedFor(string $target): ?self
{
return static::query()
->forTarget($target)
->whereNotNull('deployed_at')
->latest('deployed_at')
->first();
}
public function isDeployed(): bool
{
return $this->deployed_at !== null;
}
}