fix(installer): Read DB 미사용 시 Write DB만 참조하도록 수정 + GitHub 이슈 템플릿 신설
설치 시 use_read_db=false 인데도 db_read_host 잔존값으로 read 커넥션을 조립해 5단계 마이그레이션이 실패하던 문제를 수정한다. "read 사용 여부" 판정이 세 지점에서 달랐던 것이 근본 원인으로, use_read_db 플래그를 단일 SSoT 로 통일한다. - installer-runtime.php: read 블록을 use_read_db 게이트로. 미사용 시 runtime 에 read 키 미생성 → 하류가 write 로 자동 fallback. mergeRuntimeIntoEnv 도 read 부재 시 DB_READ_* 를 빈 값으로 기록(write 복사 제거). - config/database.php: read env 를 Elvis(?:) fallback 으로 복원. 중첩 env(A, env(B)) 는 DB_READ_* 가 빈 문자열일 때 fallback 이 무력화되므로, 빈 값까지 흡수하는 ?: 를 사용(tinker 실측 확인). 설치 이후 운영 중 DB_READ_* 공란 시에도 SELECT 가 write DB 로 정확히 향하게 한다. - functions.php / request-handler.php: read 미사용 시 .env DB_READ_* 빈 값 기록 + state.json 잔존 read 필드 제거(2단계 방어). 기존 설치 환경은 .env 에 DB_READ_* 가 이미 채워져 Elvis fallback 미발동 → 동작 불변이라 업그레이드 스텝 불필요(실측 확인). 무관 사전 실패 테스트(beta.7 stale-ENV 복구)는 코어 version 이 beta.7 이 아니면 skip 하도록 가드 헬퍼 추가(프로덕션 한시 가드 전제를 테스트에 반영). 자유형식 제보에서 진단 축(버전/활성 확장/커스텀 자산/환경)이 누락되기 쉬워 G7 전용 이슈 템플릿을 추가한다. bug_report / feature_request / upgrade_issue + config.yml(blank 비활성, Discussions·보안신고 링크).
This commit is contained in:
1 parent
94d2cd2c11
commit
cbc91117d7
14 files changed
+417
-78
No files matched your search
@@ -193,7 +193,7 @@ class InstallerRuntimeServiceProviderTest extends TestCase
|
||||
public function test_provider_injects_app_key(): void
|
||||
{
|
||||
$this->withProductionEnv();
|
||||
$key = 'base64:' . base64_encode(random_bytes(32));
|
||||
$key = 'base64:'.base64_encode(random_bytes(32));
|
||||
|
||||
$this->writeRuntime([
|
||||
'app' => ['key' => $key],
|
||||
@@ -284,6 +284,7 @@ class InstallerRuntimeServiceProviderTest extends TestCase
|
||||
|
||||
public function test_recovers_stale_process_env_when_disk_env_is_healthy(): void
|
||||
{
|
||||
$this->skipUnlessBeta7CoreVersion();
|
||||
$this->withProductionEnv();
|
||||
|
||||
// 디스크 .env 는 정합 자격증명 + INSTALLER_COMPLETED (finalize 완료 신호)
|
||||
@@ -423,6 +424,32 @@ class InstallerRuntimeServiceProviderTest extends TestCase
|
||||
$this->assertSame('root', getenv('DB_WRITE_USERNAME'), 'runtime.php 잔존 시 본 보정 미발동');
|
||||
}
|
||||
|
||||
/**
|
||||
* beta.7 stale-ENV 복구는 config/app.php version === '7.0.0-beta.7' 일 때만 발동한다
|
||||
* (InstallerRuntimeServiceProvider::recoverStaleProcessEnvFromDiskEnv 의 한시 가드).
|
||||
* 코어가 beta.7 을 지난 버전이면 복구가 의도적으로 비활성이므로, 복구 발동을 기대하는
|
||||
* 테스트는 skip 한다. no-recovery 테스트들은 비활성 상태에서도 결과가 동일하여 영향 없음.
|
||||
*/
|
||||
private function skipUnlessBeta7CoreVersion(): void
|
||||
{
|
||||
$configPath = base_path('config/app.php');
|
||||
$content = is_file($configPath) ? (string) @file_get_contents($configPath) : '';
|
||||
|
||||
$version = null;
|
||||
if (preg_match("/'version'\s*=>\s*env\(\s*'APP_VERSION'\s*,\s*'([^']+)'\s*\)/", $content, $m)) {
|
||||
$version = $m[1];
|
||||
} elseif (preg_match("/'version'\s*=>\s*'([^']+)'/", $content, $m)) {
|
||||
$version = $m[1];
|
||||
}
|
||||
|
||||
if ($version !== '7.0.0-beta.7') {
|
||||
$this->markTestSkipped(
|
||||
'beta.7 stale-ENV 복구는 코어 version === 7.0.0-beta.7 일 때만 발동. '
|
||||
.'현재 version='.($version ?? 'unknown').' → 한시 보정 비활성 (정상).'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, mixed> $data
|
||||
*/
|
||||
@@ -433,7 +460,7 @@ class InstallerRuntimeServiceProviderTest extends TestCase
|
||||
mkdir($dir, 0755, true);
|
||||
}
|
||||
|
||||
$php = "<?php\n\nreturn " . var_export($data, true) . ";\n";
|
||||
$php = "<?php\n\nreturn ".var_export($data, true).";\n";
|
||||
file_put_contents($this->runtimePath, $php);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user