'developer'], ['display_name' => 'Developer']); $user = User::factory()->create(); $user->addRole($role); FeatureFlag::create([ 'name' => 'DeploymentPackage', 'label' => 'Deployment csomagoló', 'enabled' => $flagEnabled, 'stages' => null, 'roles' => ['developer'], ]); app(FeatureFlagRegistrar::class)->registerAll(); return $user; } /** * @param array $arguments */ function deploymentGit(string $path, array $arguments): string { $process = new Process(array_merge(['git'], $arguments), $path); $process->mustRun(); return $process->getOutput(); } /** * A minta-repó útvonala. A PID azért van benne, hogy párhuzamos futásnál (paratest) * minden processznek saját mintája legyen. */ function deploymentTemplatePath(): string { return sys_get_temp_dir().DIRECTORY_SEPARATOR.'deployment-package-minta-'.getmypid(); } /** * Determinisztikus minta-repó: átnevezés, törlés, ékezetes fájlnév és migráció is van benne. * * A 12 git parancs processzenként EGYSZER fut le - Windowson a processzindítás olyan drága, * hogy tesztenként újraépítve ez önmagában ~4 mp lenne. A tesztek másolatot kapnak. * * @return array{path:string, commits:array} */ function deploymentRepositoryTemplate(): array { static $template = null; // Ha a minta időközben eltűnt (kézi takarítás, megszakadt futás), újraépítjük. if ($template !== null && is_dir($template['path'])) { return $template; } $elsoFelepites = $template === null; $path = deploymentTemplatePath(); // Egy korábbi, megszakadt futás azonos PID-ű maradványa nem szennyezheti a mintát. deploymentDeleteDirectory($path); 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']); deploymentGit($path, ['config', 'user.name', 'Teszt']); deploymentGit($path, ['config', 'commit.gpgsign', 'false']); File::put($path.'/app/Elso.php', " deploymentDeleteDirectory(deploymentTemplatePath())); } return $template = ['path' => $path, 'commits' => explode("\n", $log)]; } /** * A teszt saját, írható másolata a mintáról: a builder és a "working tree elrontása" * tesztek beleírnak a repóba, ezért nem oszthatnak közös példányt. * * @return array{path:string, commits:array} */ function deploymentTestRepository(): array { $template = deploymentRepositoryTemplate(); $path = sys_get_temp_dir().DIRECTORY_SEPARATOR.'deployment-package-test-'.uniqid(); File::copyDirectory($template['path'], $path); Config::set('deployment.repo_path', $path); Config::set('deployment.output_path', $path.DIRECTORY_SEPARATOR.'_kimenet'); return ['path' => $path, 'commits' => $template['commits']]; } /** * Facade nélküli törlés: a shutdown függvény a booteolt alkalmazáson kívül is fut. */ function deploymentDeleteDirectory(string $path): void { if (! is_dir($path)) { return; } $items = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST ); foreach ($items as $item) { // A .git/objects tartalma Windowson csak olvasható, ezért törlés előtt fel kell oldani. @chmod($item->getPathname(), 0777); $item->isDir() ? @rmdir($item->getPathname()) : @unlink($item->getPathname()); } @rmdir($path); } function deploymentCleanup(string $path): void { deploymentDeleteDirectory($path); }