From 7f307602a39bb5c142e309733db561862c2c6411 Mon Sep 17 00:00:00 2001 From: zzabisagent-lab Date: Mon, 26 Oct 2026 13:45:42 +0000 Subject: [PATCH] =?UTF-8?q?release.mjs:=20portal=20artifact=20=EC=97=90=20?= =?UTF-8?q?catalog=20=EB=94=94=EB=A0=89=ED=84=B0=EB=A6=AC=20=ED=8F=AC?= =?UTF-8?q?=ED=95=A8(=EC=8B=A4=EC=84=9C=EB=B2=84=20=EC=83=81=ED=92=88?= =?UTF-8?q?=EC=A0=95=EC=B1=85=20=EC=8B=9C=EB=93=9C=20=EB=88=84=EB=9D=BD=20?= =?UTF-8?q?=EC=88=98=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- VERSION_HISTORY.md | 1 + scripts/release.mjs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/VERSION_HISTORY.md b/VERSION_HISTORY.md index c341aab..2e16a87 100644 --- a/VERSION_HISTORY.md +++ b/VERSION_HISTORY.md @@ -98,6 +98,7 @@ - **기존 유닛 보존**(`hal/modules/index.mjs` `keepExistingUnit`): Webmaker 의 운영 유닛은 `ProtectSystem=strict`·`ReadWritePaths` 등 강화 지시문을 갖는데 템플릿이 Environment 줄만 보존하고 나머지를 지웠을 것이다. 유닛이 이미 `/current` 를 가리키면 다시 쓰지 않는다. - **포털 nginx 접근 경로**(`deploy/bootstrap-hal.sh`): `deploy/nginx/ariweb-portal.conf.tmpl` 이 어디서도 적용되지 않아 `my.ariweb.net` 이 열리지 않았다. 부트스트랩 4단계(접근 경로 준비)에서 HAL 과 함께 설치한다. - **부트스트랩 인증서 확인**(`deploy/bootstrap-hal.sh`): `/etc/letsencrypt/live` 는 root 만 읽을 수 있어 일반 계정의 `[ -f ]` 가 항상 거짓이었다(실제 부트스트랩이 4단계에서 중단). `sudo -n test -f` 로 확인한다. +- **포털 artifact 에 Catalog 누락**(`scripts/release.mjs`): 상품정책 시드 파일 `catalog/release-0.1.1.json` 이 portal artifact 에 들어가지 않아 운영자 시드(`/internal/ops/commerce/catalog/seed`)가 실서버에서 실패했을 것이다. portal 경로에 `catalog` 를 넣었다. - 회귀 테스트: `test/agent.test.mjs` 에 실행 계정 모드(도우미 스크립트 실제 실행·경로 제한 거부)·REVISION 버전·기존 유닛 보존 검사를 추가했다. ### 도입 소스 diff --git a/scripts/release.mjs b/scripts/release.mjs index ea708ca..954bcae 100644 --- a/scripts/release.mjs +++ b/scripts/release.mjs @@ -17,7 +17,7 @@ import { fileURLToPath } from 'node:url'; const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..'); const args = process.argv.slice(2); const cmd = args[0] || 'build'; const opt = (n, d = null) => { const i = args.indexOf('--' + n); return i >= 0 ? (args[i + 1] && !args[i + 1].startsWith('--') ? args[i + 1] : true) : d; }; const pkg = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8')); const VERSION = pkg.version; -const MODULES = { hal: ['hal', 'lib', 'deploy', 'lang', 'package.json', 'README.md'], portal: ['portal', 'lib', 'lang', 'package.json'], agent: ['agent', 'lib', 'deploy', 'package.json'], webmaker: ['modules/webmaker'], arimail: ['modules/arimail'] }; +const MODULES = { hal: ['hal', 'lib', 'deploy', 'lang', 'package.json', 'README.md'], portal: ['portal', 'lib', 'lang', 'catalog', 'package.json'], agent: ['agent', 'lib', 'deploy', 'package.json'], webmaker: ['modules/webmaker'], arimail: ['modules/arimail'] }; const sha = (f) => createHash('sha256').update(readFileSync(f)).digest('hex'); const git = (a) => { try { return execFileSync('git', a, { cwd: ROOT, encoding: 'utf8' }).trim(); } catch (_) { return ''; } };