Files
EJClaw e41d0cb441 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 로 돌린다
2026-09-25 22:13:55 +09:00

34 lines
1.3 KiB
Bash
Executable File

#!/bin/bash
# win-ci VM + 호스트 제어 서버를 systemd 트랜지언트 유닛으로 띄운다.
#
# 반드시 봇(ejclaw.service) cgroup 밖에서 돌아야 한다. 안에서 돌면 8GB VM 이
# MemoryHigh=16G 를 쳐서 봇이 OOM 으로 죽는다. --user 유닛으로 띄우면
# systemd --user 의 자식이 되어 app.slice 형제로 빠지고, 에이전트 턴이
# 끝나도 계속 살아 있는다.
#
# CPUQuota=400% / CPUWeight=50 - 물리 호스트가 i7-11700(16스레드)뿐이고 .5 에서
# 운영 컨테이너 19개가 돈다. 4코어를 넘기면 .5 응답이 +140% 느려진다(실측).
set -euo pipefail
systemctl --user reset-failed win-ci.service win-ci-http.service 2>/dev/null || true
# 게스트 <-> 호스트 제어 채널 (게스트는 10.0.2.2:8099 로 본다)
if ! systemctl --user is-active --quiet win-ci-http.service; then
systemd-run --user --unit=win-ci-http \
--description="win-ci guest control channel" \
-p Restart=always \
/usr/bin/python3 /home/claude/win-ci/serve-host.py
fi
# VM
systemd-run --user --unit=win-ci \
--description="win-ci Windows CI VM (nested KVM)" \
-p MemoryMax=10G \
-p CPUQuota=400% \
-p CPUWeight=50 \
-p WorkingDirectory=/home/claude/win-ci \
/bin/bash /home/claude/win-ci/run-vm.sh
sleep 2
systemctl --user --no-pager status win-ci-http.service win-ci.service | head -40