ci: .9 안 Windows CI VM 무인 구축 자동화
Windows 설치 화면을 사람이 클릭할 수 없으므로 전 과정을 무인으로 짰다. autounattend.xml 이 설치와 OOBE 를 끝내고, provision.ps1 이 virtio 드라이버를 오프라인으로 넣어 네트워크를 살리고, 상주 agent.ps1 이 호스트 HTTP 에서 stage2.ps1 을 받아 Git/pwsh7/Python/Node/CMake/act_runner 를 설치한다. 설치 내용을 ISO 에 박지 않고 호스트가 HTTP 로 내려주는 구조로 한 이유는 ISO 를 한 번 구우면 못 고쳐서, 한 줄 고칠 때마다 Windows 재설치가 되기 때문이다. stage2.ps1 만 고치면 게스트가 20초 안에 반영한다. - 시스템 디스크는 SATA. virtio-blk 로 하면 Setup 이 디스크를 못 봐서 WinPE 드라이버 주입이 필요해진다 - VM 은 systemd --user 트랜지언트 유닛으로 띄워 봇 cgroup 밖에 둔다 (MemoryHigh=16G 안에 8G VM 이 들어가면 봇이 OOM 으로 죽는 전례) - Node 포함. act_runner host 모드가 JS 액션을 PATH 의 node 로 돌린다
This commit is contained in:
55
scripts/win-ci/run-vm.sh
Executable file
55
scripts/win-ci/run-vm.sh
Executable file
@@ -0,0 +1,55 @@
|
||||
#!/bin/bash
|
||||
# win-ci Windows VM 기동 (.9 안 중첩 KVM)
|
||||
#
|
||||
# 이 스크립트를 직접 실행하지 말 것. start-vm.sh 가 systemd 트랜지언트 유닛으로
|
||||
# 띄운다. 에이전트 턴에서 그냥 qemu 를 띄우면 ejclaw.service 의 cgroup 안에서
|
||||
# 돌아 MemoryHigh=16G 상한을 쳐서 봇이 OOM 으로 죽는다 (2026-07-26 전례).
|
||||
|
||||
set -euo pipefail
|
||||
D=/home/claude/win-ci
|
||||
cd "$D"
|
||||
|
||||
# TPM 2.0 - Windows 11 요구사항
|
||||
if [ ! -S "$D/swtpm/sock" ]; then
|
||||
swtpm socket --tpmstate "dir=$D/swtpm" \
|
||||
--ctrl "type=unixio,path=$D/swtpm/sock" --tpm2 -d
|
||||
for i in $(seq 1 20); do [ -S "$D/swtpm/sock" ] && break; sleep 0.3; done
|
||||
fi
|
||||
|
||||
rm -f "$D/qmp.sock"
|
||||
|
||||
exec qemu-system-x86_64 \
|
||||
-name win-ci,process=win-ci \
|
||||
-machine q35,smm=on,vmport=off \
|
||||
-accel kvm \
|
||||
-cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time \
|
||||
-smp 4,sockets=1,cores=4,threads=1 \
|
||||
-m 8192 \
|
||||
-rtc base=localtime,driftfix=slew \
|
||||
-global driver=cfi.pflash01,property=secure,value=on \
|
||||
-global ICH9-LPC.disable_s3=1 \
|
||||
-drive if=pflash,format=raw,unit=0,readonly=on,file=/usr/share/OVMF/OVMF_CODE_4M.secboot.fd \
|
||||
-drive if=pflash,format=raw,unit=1,file="$D/OVMF_VARS.fd" \
|
||||
-chardev "socket,id=chrtpm,path=$D/swtpm/sock" \
|
||||
-tpmdev emulator,id=tpm0,chardev=chrtpm \
|
||||
-device tpm-tis,tpmdev=tpm0 \
|
||||
-device virtio-vga,max_outputs=2,xres=1920,yres=1080 \
|
||||
-audiodev none,id=aud0 \
|
||||
-device intel-hda \
|
||||
-device hda-duplex,audiodev=aud0 \
|
||||
-netdev user,id=net0,hostfwd=tcp:127.0.0.1:13389-:3389 \
|
||||
-device virtio-net-pci,netdev=net0 \
|
||||
-device qemu-xhci,id=xhci \
|
||||
-device usb-kbd -device usb-tablet \
|
||||
-drive "file=$D/win-ci.qcow2,if=none,id=sysdisk,format=qcow2,cache=writeback,discard=unmap,aio=threads" \
|
||||
-device ide-hd,drive=sysdisk,bus=ide.0,bootindex=2 \
|
||||
-drive "file=$D/iso/win11-ltsc.iso,if=none,id=cdwin,media=cdrom,readonly=on" \
|
||||
-device ide-cd,drive=cdwin,bus=ide.1,bootindex=1 \
|
||||
-drive "file=$D/iso/virtio-win.iso,if=none,id=cdvirtio,media=cdrom,readonly=on" \
|
||||
-device ide-cd,drive=cdvirtio,bus=ide.2 \
|
||||
-drive "file=$D/unattend.iso,if=none,id=cdunattend,media=cdrom,readonly=on" \
|
||||
-device ide-cd,drive=cdunattend,bus=ide.3 \
|
||||
-serial "file:$D/serial.log" \
|
||||
-qmp "unix:$D/qmp.sock,server=on,wait=off" \
|
||||
-vnc 127.0.0.1:19 \
|
||||
-boot menu=off,strict=on
|
||||
Reference in New Issue
Block a user