From c8d5e01490f989298e59ed7bb59490a2b2495544 Mon Sep 17 00:00:00 2001 From: E98Developer Date: Sun, 16 Aug 2026 22:23:11 +0200 Subject: [PATCH] =?UTF-8?q?ADD=20Deployment=20csomagol=C3=B3=20seeder-feli?= =?UTF-8?q?smer=C3=A9s=20a=20teend=C5=91k=20k=C3=B6z=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Éles használat közben derült ki: a csomagba került egy seeder, de a _TEENDOK.md nem szólt róla. A seeder felmásolása önmagában nem csinál semmit, tehát csendben kimaradt egy lépés - pont az a hibatípus, ami ellen az egész eszköz készült. - config: új attention csoport a database/seeders/* útvonalakra - a felületen figyelmeztetés, a teendőkben a konkrét osztálynévvel: php artisan db:seed --class= - mellé egy feltételes cache-lépés: a Pennant purge Eloquent mentésnél NEM kell (a FeatureFlagObserver::saved() elvégzi), csak query builderes írás után; a laratrust cache pedig csak szerepkör/jogosultság hozzárendelés változásakor, mert a saját cache-ét a felhasználóhoz kötve tárolja Co-Authored-By: Claude Opus 5 --- app/Services/Deployment/ChangeSetAnalyzer.php | 11 +++++ .../Deployment/DeploymentPackageBuilder.php | 41 +++++++++++++++++++ config/deployment.php | 1 + tests/Feature/DeploymentPackageTest.php | 21 ++++++++++ 4 files changed, 74 insertions(+) diff --git a/app/Services/Deployment/ChangeSetAnalyzer.php b/app/Services/Deployment/ChangeSetAnalyzer.php index 6ad59fe..4338d6b 100644 --- a/app/Services/Deployment/ChangeSetAnalyzer.php +++ b/app/Services/Deployment/ChangeSetAnalyzer.php @@ -108,6 +108,17 @@ private function warnings(array $copied, array $deleted, int $excludedCount, ?ar ]; } + $seeders = $this->matching($copied, 'seeder'); + + if ($seeders !== []) { + $warnings[] = [ + 'level' => 'warning', + 'title' => sprintf('Seeder a csomagban (%d db)', count($seeders)), + 'body' => 'A seeder felmásolása önmagában nem csinál semmit - el kell dönteni, hogy le kell-e futtatni a célgépen. ' + .'Ha feature flageket ír, a lefutása után azok azonnal hatnak.', + ]; + } + if ($this->matching($copied, 'composer') !== []) { $warnings[] = [ 'level' => 'warning', diff --git a/app/Services/Deployment/DeploymentPackageBuilder.php b/app/Services/Deployment/DeploymentPackageBuilder.php index db2f0df..dc73541 100644 --- a/app/Services/Deployment/DeploymentPackageBuilder.php +++ b/app/Services/Deployment/DeploymentPackageBuilder.php @@ -4,6 +4,7 @@ use Illuminate\Filesystem\Filesystem; use Illuminate\Support\Carbon; +use Illuminate\Support\Str; use RuntimeException; use ZipArchive; @@ -310,6 +311,24 @@ private function writeInstructions(string $path, array $manifest, array $target) $steps[] = 'Futtasd a célgépen: `php artisan migrate`'; } + if (str_contains($warning['title'], 'Seeder')) { + $seeders = $this->seederClasses($manifest); + + $steps[] = sprintf( + 'Seeder változott (%s). A felmásolás önmagában NEM futtatja le - ha idempotens ' + .'(`updateOrCreate`/`firstOrCreate`), futtasd: %s', + implode(', ', $seeders), + implode(' ', array_map(fn (string $class): string => '`php artisan db:seed --class='.$class.'`', $seeders)), + ); + + // A projekt FeatureFlagObserver-e Eloquent mentéskor magától purge-öl, ezért + // ezt nem kötelező lépésként, hanem feltételes ellenőrzésként írjuk ki. + $steps[] = 'Ha a seeder feature flageket írt **Eloquent modellen keresztül**, a Pennant cache-t a ' + .'`FeatureFlagObserver` magától üríti. Query builderes írás (`->update()`) esetén viszont kell: ' + .'`php artisan pennant:purge`. Ha szerepkör/jogosultság **hozzárendelés** változott, a laratrust ' + .'cache-hez: `php artisan cache:clear`.'; + } + if (str_contains($warning['title'], 'composer')) { $steps[] = 'Futtasd a célgépen: `composer install --no-dev` (a vendor/ nincs a csomagban)'; } @@ -428,6 +447,28 @@ private function createZip(string $path, string $name): ?string return $zipPath; } + /** + * A csomagban lévő seeder fájlok osztálynevei. + * + * @param array $manifest + * @return array + */ + private function seederClasses(array $manifest): array + { + /** @var array $patterns */ + $patterns = (array) config('deployment.attention.seeder', []); + + $classes = []; + + foreach ($manifest['files'] as $file) { + if (Str::is($patterns, $file['path'])) { + $classes[] = pathinfo($file['path'], PATHINFO_FILENAME); + } + } + + return $classes; + } + /** * Mindig LF sorvéggel írunk: a csomag Windowson készül, de Linux célgépre megy. */ diff --git a/config/deployment.php b/config/deployment.php index 8e57347..718ab5f 100644 --- a/config/deployment.php +++ b/config/deployment.php @@ -87,6 +87,7 @@ */ 'attention' => [ 'migration' => ['database/migrations/*'], + 'seeder' => ['database/seeders/*'], 'composer' => ['composer.json', 'composer.lock'], 'asset' => [ 'resources/js/*', diff --git a/tests/Feature/DeploymentPackageTest.php b/tests/Feature/DeploymentPackageTest.php index 9bb5673..f0e28b9 100644 --- a/tests/Feature/DeploymentPackageTest.php +++ b/tests/Feature/DeploymentPackageTest.php @@ -70,6 +70,7 @@ function deploymentTestRepository(): array File::makeDirectory($path.'/app', 0777, true); File::makeDirectory($path.'/database/migrations', 0777, true); + File::makeDirectory($path.'/database/seeders', 0777, true); deploymentGit($path, ['init']); deploymentGit($path, ['config', 'user.email', 'teszt@example.com']); @@ -86,6 +87,7 @@ function deploymentTestRepository(): array File::put($path.'/app/Elso.php', "pluck('title')->implode(' | '); expect($titles)->toContain('Migráció') + ->and($titles)->toContain('Seeder') ->and($titles)->toContain('Törlendő fájl'); deploymentCleanup($repository['path']); }); +test('a teendők között szerepel a seeder futtatása a konkrét osztálynévvel', function () { + deploymentAllowEnvironment(); + $repository = deploymentTestRepository(); + [$first, , $third] = $repository['commits']; + + $package = app(DeploymentPackageBuilder::class)->build('e2e', 'main', $first, $third); + $teendok = File::get($package['path'].'/_TEENDOK.md'); + + expect($teendok)->toContain('php artisan db:seed --class=TesztSeeder') + // A seeder puszta felmásolása nem futtatja le - ezt ki kell mondani. + ->and($teendok)->toContain('NEM futtatja le') + // A Pennant purge feltételes: Eloquent mentésnél a FeatureFlagObserver elvégzi. + ->and($teendok)->toContain('pennant:purge') + ->and($teendok)->toContain('cache:clear'); + + deploymentCleanup($repository['path']); +}); + test('az érvénytelen commit azonosítót nem adja tovább a gitnek', function () { $repository = deploymentTestRepository();