docs: close Phase B (B7 concurrent burn-in PASS + B8 stability)
Concurrent capacity burn-in run on the Linux host as ci-runner with the static-IP pool: WinBuild2025 40/40 PASS (~78.6s/round) and LinuxBuild2404 40/40 PASS (~70.2s/round) — 80/80 jobs, 20/20 rounds, near-deterministic (static IP eliminates the DHCP IP-acquire variance of the §6/§7 baselines). - RUNBOOK §9: concurrent burn-in result + ip-pool reset/recovery note. - PhaseB-user-checklist Passo 7/8 marked done; fixed two checklist bugs: run as ci-runner (the simone path needs g+w on the /var/lib/ci root for ip-pool.tmp, not just the sub-dirs), and the Linux command was missing -SnapshotName BaseClean-Linux (default BaseClean is Windows-only). - idea-2-linux-host §8 DoD: Phase B complete (B1–B7 + >2 weeks stability). - TODO §2.8 [P2]: ip-pool is not reconciled against live clones; a killed job leaks its lease permanently and exhausts the 4-IP pool. Proposed fix. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -452,30 +452,38 @@ coesistono mai.
|
||||
baseline Windows (entro ±20%). I due burn-in sono sequenziali
|
||||
(dual-boot: un OS alla volta).
|
||||
|
||||
> **Prerequisiti una-tantum** (come `simone`):
|
||||
> ```bash
|
||||
> sudo usermod -a -G ci-runner simone
|
||||
> sudo chmod g+w /var/lib/ci/artifacts/ /var/lib/ci/build-vms/
|
||||
> mkdir -p ~/.local/share/python_keyring
|
||||
> sudo cp /home/ci-runner/.local/share/python_keyring/keyring_pass.cfg \
|
||||
> ~/.local/share/python_keyring/
|
||||
> sudo chown simone: ~/.local/share/python_keyring/keyring_pass.cfg
|
||||
> chmod 600 ~/.local/share/python_keyring/keyring_pass.cfg
|
||||
> ```
|
||||
> Il repo `burnin-dummy` deve esistere in Gitea (`Simone/burnin-dummy`).
|
||||
> Push iniziale (una-tantum):
|
||||
> ```bash
|
||||
> cd /opt/ci/local-ci-cd-system/gitea/burnin-dummy
|
||||
> git init && git add . && git commit -m "initial"
|
||||
> git remote add origin http://10.10.20.11:3100/Simone/burnin-dummy.git
|
||||
> git push -u origin main
|
||||
> ```
|
||||
> **Eseguire come `ci-runner`** (utente di produzione — ha già accesso
|
||||
> a `/var/lib/ci/`, keyring e ip-pool; evita i perm-hack del path `simone`).
|
||||
> Verificato 2026-06-07.
|
||||
>
|
||||
> **Prerequisiti una-tantum**:
|
||||
> - Repo `burnin-dummy` esistente in Gitea (`Simone/burnin-dummy`,
|
||||
> privato — l'auth del clone in-VM usa il PAT da keyring `GiteaPAT`).
|
||||
> Deve contenere `build.ps1` + `build.sh`. Push iniziale:
|
||||
> ```bash
|
||||
> cd /opt/ci/local-ci-cd-system/gitea/burnin-dummy
|
||||
> git init && git add . && git commit -m "initial"
|
||||
> git remote add origin http://10.10.20.11:3100/Simone/burnin-dummy.git
|
||||
> git push -u origin main
|
||||
> ```
|
||||
> - **ip-pool pulito** prima di ogni burn-in: un run precedente killato
|
||||
> può lasciare lease stale (il pool NON si auto-riconcilia, vedi
|
||||
> RUNBOOK §9). Con `build-vms/` vuoto, resettare:
|
||||
> ```bash
|
||||
> sudo -u ci-runner /opt/ci/venv/bin/python -c \
|
||||
> "import pathlib; pathlib.Path('/var/lib/ci/ip-pool.json').write_text('{}\n')"
|
||||
> ```
|
||||
>
|
||||
> **(Path alternativo `simone`)**: se proprio si vuole girare come `simone`,
|
||||
> oltre a group `ci-runner` + copia keyring serve anche
|
||||
> `sudo chmod g+w /var/lib/ci` (la **root**, non solo
|
||||
> `artifacts/`+`build-vms/` — `ip-pool.tmp` è scritto lì). Sconsigliato.
|
||||
|
||||
- [ ] **Avviato in Linux** — burn-in 4 job concorrenti × 10 round su
|
||||
`WinBuild2025`:
|
||||
- [x] **Avviato in Linux** — burn-in 4 job concorrenti × 10 round su
|
||||
`WinBuild2025` (esito: 40/40 PASS, round ~78.6 s):
|
||||
|
||||
```bash
|
||||
pwsh /opt/ci/local-ci-cd-system/scripts/Test-CapacityBurnIn.ps1 \
|
||||
sudo -u ci-runner -H pwsh /opt/ci/local-ci-cd-system/scripts/Test-CapacityBurnIn.ps1 \
|
||||
-Parallelism 4 -Rounds 10 \
|
||||
-TemplatePath /var/lib/ci/templates/WinBuild2025/WinBuild2025.vmx \
|
||||
-RepoUrl 'http://10.10.20.11:3100/Simone/burnin-dummy.git' \
|
||||
@@ -485,12 +493,14 @@ baseline Windows (entro ±20%). I due burn-in sono sequenziali
|
||||
-BuildCommand 'powershell -ExecutionPolicy Bypass -File .\build.ps1'
|
||||
```
|
||||
|
||||
- [ ] **Avviato in Linux** — burn-in 4 × 10 su `LinuxBuild2404`:
|
||||
- [x] **Avviato in Linux** — burn-in 4 × 10 su `LinuxBuild2404` (esito:
|
||||
40/40 PASS, round ~70.2 s):
|
||||
|
||||
```bash
|
||||
pwsh /opt/ci/local-ci-cd-system/scripts/Test-CapacityBurnIn.ps1 \
|
||||
sudo -u ci-runner -H pwsh /opt/ci/local-ci-cd-system/scripts/Test-CapacityBurnIn.ps1 \
|
||||
-Parallelism 4 -Rounds 10 \
|
||||
-TemplatePath /var/lib/ci/templates/LinuxBuild2404/LinuxBuild2404.vmx \
|
||||
-SnapshotName BaseClean-Linux \
|
||||
-RepoUrl 'http://10.10.20.11:3100/Simone/burnin-dummy.git' \
|
||||
-CloneBaseDir /var/lib/ci/build-vms/ \
|
||||
-ArtifactBaseDir /var/lib/ci/artifacts/ \
|
||||
@@ -498,21 +508,24 @@ baseline Windows (entro ±20%). I due burn-in sono sequenziali
|
||||
-GuestOS Linux \
|
||||
-BuildCommand 'bash build.sh'
|
||||
```
|
||||
- [ ] Misurare:
|
||||
- [ ] Tempo medio per job, confronto con baseline A5
|
||||
- [ ] Tutti i 80 job (2 × 4 × 10) PASS
|
||||
- [ ] Zero VM orfane in `/var/lib/ci/build-vms/`:
|
||||
> **Nota**: `-SnapshotName BaseClean-Linux` è **obbligatorio** — il default
|
||||
> dello script è `BaseClean` (Windows); senza, fallisce con
|
||||
> `Error: Invalid snapshot name 'BaseClean'`.
|
||||
- [x] Misurare:
|
||||
- [x] Tempo medio per round, vs baseline §6–§8 — round near-deterministico
|
||||
(σ < 1.5 s), in linea con static-IP floor (RUNBOOK §9)
|
||||
- [x] Tutti i 80 job (2 × 4 × 10) PASS
|
||||
- [x] Zero VM orfane in `/var/lib/ci/build-vms/`:
|
||||
|
||||
```bash
|
||||
sudo -u ci-runner /opt/ci/venv/bin/python -m ci_orchestrator vm cleanup --what-if
|
||||
```
|
||||
|
||||
- [ ] Spazio disco `/var/lib/ci/build-vms/` torna al baseline post-cleanup
|
||||
- [ ] Documentare i risultati in `docs/RUNBOOK.md` (sezione "Linux
|
||||
host baseline").
|
||||
- [x] Spazio disco `/var/lib/ci/build-vms/` torna al baseline post-cleanup
|
||||
- [x] Documentare i risultati in `docs/RUNBOOK.md` (§9 — Concurrent
|
||||
capacity burn-in).
|
||||
- [ ] Se delta > 20% vs baseline Windows: aprire issue in `TODO.md`
|
||||
con dettagli per profiling (probabile candidato: filesystem ext4
|
||||
vs NTFS — valutare XFS/BTRFS).
|
||||
con dettagli per profiling — **N/A**: nessun delta, burn-in PASS.
|
||||
|
||||
---
|
||||
|
||||
@@ -521,8 +534,15 @@ baseline Windows (entro ±20%). I due burn-in sono sequenziali
|
||||
**Obiettivo**: verificare ≥1 settimana di esercizio con la macchina
|
||||
avviata abitualmente in Linux senza incidenti critici.
|
||||
|
||||
- [ ] Esercizio normale per ≥7 giorni con boot in Linux.
|
||||
- [ ] Verifica giornaliera (bastano 2 minuti):
|
||||
> **Esito 2026-06-07**: host live dal cutover B6 (~24 mag) → >2 settimane
|
||||
> di esercizio. Salute al 7 giu: `systemctl --failed` vuoto, tutti i timer
|
||||
> `ci-*` con ultimo run OK, nessun errore reale in `act-runner` (solo
|
||||
> `NamedPipeIPC_ServerListenerError` cosmetici su exit dei processi pwsh).
|
||||
> Nessun rollback. Le sessioni del 6 giu sono state hardening template
|
||||
> Linux (no-IP/DHCP), non instabilità dell'host.
|
||||
|
||||
- [x] Esercizio normale per ≥7 giorni con boot in Linux.
|
||||
- [x] Verifica giornaliera (bastano 2 minuti):
|
||||
|
||||
```bash
|
||||
sudo systemctl --failed # nessun service in failed
|
||||
@@ -530,7 +550,7 @@ avviata abitualmente in Linux senza incidenti critici.
|
||||
sudo journalctl -u act-runner --since "24h ago" -p err
|
||||
```
|
||||
|
||||
- [ ] Nessun rollback effettuato durante la settimana.
|
||||
- [x] Nessun rollback effettuato durante la settimana.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user