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>
49 lines
1.2 KiB
PHP
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;
|
|
}
|
|
}
|