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 로 돌린다
34 lines
1.3 KiB
Bash
Executable File
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
|