From ca096a69c399816681371e82a9079f5f6bab865d Mon Sep 17 00:00:00 2001 From: EJClaw Date: Fri, 25 Sep 2026 23:44:00 +0900 Subject: [PATCH] =?UTF-8?q?ci:=20=ED=9A=8C=EC=88=98=ED=95=9C=20=EC=A6=9D?= =?UTF-8?q?=EA=B1=B0=20=ED=8C=8C=EC=9D=BC=EC=9D=98=20=ED=95=9C=EA=B8=80?= =?UTF-8?q?=EC=9D=B4=20=EA=B9=A8=EC=A7=80=EB=8D=98=20=EA=B2=83=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20+=20=EB=AC=B8=EC=84=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [Console]::OutputEncoding 을 UTF-8 로 두지 않으면 PowerShell 이 자식 프로세스 stdout 을 콘솔 코드페이지(LTSC en-US = 437)로 읽는다. python 쪽은 PYTHONUTF8=1 로 UTF-8 을 내보내니 한글이 전부 깨지고, 회수한 증거 파일의 실패 메시지를 읽을 수 없었다(실제로 첫 수집본의 한글 트레이스백이 그랬다). docs/WINDOWS-TESTING.md 에 증거 채널(POST /artifact -> results/)과 sync.sh 재검증 절차를 적었다. --- docs/WINDOWS-TESTING.md | 25 ++++++++++++++++++++++++- scripts/win-ci/serve/stage2.ps1 | 8 ++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/docs/WINDOWS-TESTING.md b/docs/WINDOWS-TESTING.md index c298129..121eaf9 100644 --- a/docs/WINDOWS-TESTING.md +++ b/docs/WINDOWS-TESTING.md @@ -175,7 +175,30 @@ scripts/win-ci/build.sh # ISO 받기 + 무인설치 ISO 굽기 + 디스 | 방향 | 통로 | 왜 | |---|---|---| | 호스트 → 게스트 | HTTP `10.0.2.2:8099` (QEMU user networking) | 스크립트·러너 토큰 전달 | -| 게스트 → 호스트 | COM1 → `serial.log`, HTTP POST → `guest.log` | 네트워크가 **없는** 드라이버 설치 단계도 봐야 하므로 시리얼이 필수 | +| 게스트 → 호스트 | COM1 → `serial.log`, HTTP POST `/log` → `guest.log` | 네트워크가 **없는** 드라이버 설치 단계도 봐야 하므로 시리얼이 필수 | +| 게스트 → 호스트 | HTTP POST `/artifact/<이름>` → `results/<이름>.log` | 검증 출력 **전문**. 바로 아래 참고 | + +##### 검증 결과는 `results/` 에 파일로 남습니다 — 그게 기준선입니다 + +`stage2.ps1` 의 `Step` 이 각 단계 출력을 게스트 `C:\win-ci\out\` 에 한 줄씩 +기록하면서 호스트 `/home/claude/win-ci/results/` 로 올립니다. 판정 요약은 +`results/summary.log` 이고 **검증한 리비전이 박혀** 있습니다. + +처음에는 로그 채널로 마지막 몇 줄만 흘렸는데, `serial.log` 는 VM 이 뜰 때마다 +truncate 되고 `guest.log` 는 `stage2` 가 다시 돌 때만 채워집니다. 그래서 pytest +실패 트레이스백이 호스트에 한 줄도 남지 않아, 화면을 읽고 옮겨 적는 수밖에 +없었습니다. 고친 뒤에 고쳐졌다고 말할 근거가 없는 상태였습니다. + +재검증은 리비전으로 요청합니다. + +```bash +cd scripts/win-ci && ./sync.sh # stage2 의 $TargetRev 를 그 커밋으로 박아 배포 +tail -f /home/claude/win-ci/guest.log # 약 10분, 끝나면 results/summary.log 확인 +``` + +게스트 agent 는 `stage2.ps1` **내용 해시가 바뀔 때만** 다시 돕니다. 커밋만 +푸시하면 재검증이 걸리지 않으니 sha 를 넘기세요. `build.sh` 를 다시 돌리면 +안 됩니다 — 지워둔 Windows ISO 4.8GB 를 다시 내려받습니다. 접속 정보: 계정 `ci` / 비밀번호는 `~/.config/ejclaw/secrets.json` 의 `win-ci.9` 항목. RDP 는 호스트 `127.0.0.1:13389`, VNC 는 `127.0.0.1:5919`. diff --git a/scripts/win-ci/serve/stage2.ps1 b/scripts/win-ci/serve/stage2.ps1 index 95f50fa..a474a5e 100644 --- a/scripts/win-ci/serve/stage2.ps1 +++ b/scripts/win-ci/serve/stage2.ps1 @@ -10,6 +10,14 @@ $ErrorActionPreference = 'Stop' [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +# 자식 프로세스 stdout 을 UTF-8 로 해독한다. +# +# 이게 없으면 PowerShell 이 자식의 출력을 콘솔 코드페이지(LTSC en-US = 437)로 +# 읽는다. python 쪽은 PYTHONUTF8=1 로 UTF-8 을 내보내므로 한글이 전부 깨져서 +# 호스트로 회수한 증거 파일의 실패 메시지를 읽을 수 없다. 여기서 바꾸는 건 +# '해독' 쪽이라 파일 저장 인코딩(StreamWriter 는 UTF-8 고정)과는 무관하다. +try { [Console]::OutputEncoding = [Text.UTF8Encoding]::new($false) } catch { } + $Dl = 'C:\win-ci\dl' New-Item -ItemType Directory -Force -Path $Dl | Out-Null