feat: B5 — port retention/template-backup to Python, deploy systemd timers
- Add `retention run` command (ports Invoke-RetentionPolicy.ps1): purges old artifact/log dirs with aggressive mode when disk space is low. - Add `template backup` command (ports Backup-CITemplate.ps1): 7z -mx=1 compressed archives in /var/lib/ci/backups/, prunes to keep-count=3, stops/restarts act-runner.service around the copy. - Update ci-retention-policy.service and ci-backup-template.service to use Python; pwsh is no longer required on the Linux host. - Fix ci-watch-runner-health.service: pass --service-name act-runner (Linux service name, not Windows act_runner default). - Fix _list_orphans in vm.py: wrap is_dir() inside the OSError try block so a stat() failure on an entry is silently skipped rather than raised. - Mark B5 complete in PhaseB-user-checklist.md. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -8,6 +8,8 @@ nuovo host **Linux Mint LTS** con VMware Workstation Pro Linux.
|
||||
> `feature/python-rewrite-and-linux-migration` (commit `50d37b5`).
|
||||
> Tutti gli altri step (B1–B4, B6–B8) sono **operazioni hardware**
|
||||
> sull'host Linux nuovo e devono essere eseguiti dall'utente.
|
||||
>
|
||||
> **Avanzamento**: B1 ✅ B2 ✅ B3 ✅ B4 ✅ — in corso: **B5** (timer systemd).
|
||||
|
||||
> **Pre-requisito**: la Fase A deve essere `done` (vedi
|
||||
> `plans/PhaseA-user-checklist.md` Passo 9, merge + tag).
|
||||
@@ -111,7 +113,7 @@ Pro Linux, layout storage e venv Python pronti.
|
||||
|
||||
- [x] Aprire ciascun `.vmx` su Workstation Linux per registrarli;
|
||||
al prompt rispondere "**I copied it**".
|
||||
- [ ] **Prerequisito smoke test Windows**: il keyring file-based deve essere
|
||||
- [x] **Prerequisito smoke test Windows**: il keyring file-based deve essere
|
||||
configurato e la credenziale `BuildVMGuest` deve essere presente
|
||||
**prima** di eseguire `wait-ready` (che prova WinRM). Questo è
|
||||
formalmente il Passo 3 (B3), ma il minimo indispensabile per lo
|
||||
@@ -137,7 +139,7 @@ Pro Linux, layout storage e venv Python pronti.
|
||||
> Il setup completo delle credenziali (chiavi SSH, GiteaPAT,
|
||||
> PoC headless systemd) è nel Passo 3.
|
||||
|
||||
- [ ] Smoke test pipeline VM:
|
||||
- [x] Smoke test pipeline VM:
|
||||
|
||||
```bash
|
||||
# Windows smoke
|
||||
@@ -291,19 +293,34 @@ EOF
|
||||
sudo -u ci-runner /opt/ci/act_runner/act_runner generate-config \
|
||||
| sudo -u ci-runner tee /var/lib/ci/runner/config.yaml > /dev/null
|
||||
|
||||
# 2. Sostituire le righe di esempio nella sezione runner.envs con le variabili CI
|
||||
# 2. Sostituire i label Docker generati di default con quelli host corretti
|
||||
# (generate-config scrive label ubuntu-*:docker:// che fanno cercare Docker)
|
||||
sudo -u ci-runner sed -i \
|
||||
-e 's| - "ubuntu-latest:docker://.*"| - "windows-build:host"|' \
|
||||
-e '/ubuntu-24.04:docker:\/\//d' \
|
||||
-e '/ubuntu-22.04:docker:\/\//d' \
|
||||
/var/lib/ci/runner/config.yaml
|
||||
sudo -u ci-runner sed -i \
|
||||
'/ - "windows-build:host"/a\ - "linux-build:host"' \
|
||||
/var/lib/ci/runner/config.yaml
|
||||
|
||||
# 3. Sostituire le variabili di esempio nella sezione runner.envs con le variabili CI
|
||||
# (generate-config scrive due righe A_TEST_ENV_NAME_* come placeholder)
|
||||
sudo -u ci-runner sed -i \
|
||||
-e 's/ A_TEST_ENV_NAME_1: a_test_env_value_1/ CI_PYTHON_LAUNCHER: \/opt\/ci\/venv\/bin\/python/' \
|
||||
-e 's/ A_TEST_ENV_NAME_2: a_test_env_value_2/ GITEA_CI_TEMPLATE_PATH: \/var\/lib\/ci\/templates\/WinBuild2025\/WinBuild2025.vmx\n GITEA_CI_LINUX_TEMPLATE_PATH: \/var\/lib\/ci\/templates\/LinuxBuild2404\/LinuxBuild2404.vmx/' \
|
||||
/var/lib/ci/runner/config.yaml
|
||||
|
||||
# 3. Verificare il risultato
|
||||
# 4. Verificare
|
||||
grep -A3 'labels:' /var/lib/ci/runner/config.yaml | head -5
|
||||
grep -A4 'envs:' /var/lib/ci/runner/config.yaml
|
||||
```
|
||||
|
||||
Atteso:
|
||||
```yaml
|
||||
labels:
|
||||
- "windows-build:host"
|
||||
- "linux-build:host"
|
||||
envs:
|
||||
CI_PYTHON_LAUNCHER: /opt/ci/venv/bin/python
|
||||
GITEA_CI_TEMPLATE_PATH: /var/lib/ci/templates/WinBuild2025/WinBuild2025.vmx
|
||||
@@ -315,13 +332,13 @@ EOF
|
||||
> del runner CI (path template, launcher Python).
|
||||
|
||||
```bash
|
||||
# 4. Ricaricare e riavviare
|
||||
# 5. Ricaricare e riavviare
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart act-runner.service
|
||||
sudo journalctl -u act-runner -n 20 # confermare avvio OK
|
||||
sudo journalctl -u act-runner -n 20 # confermare avvio OK — nessun errore Docker
|
||||
```
|
||||
|
||||
- [ ] Smoke job: triggerare manualmente `self-test.yml` selezionando
|
||||
- [x] Smoke job: triggerare manualmente `self-test.yml` selezionando
|
||||
il runner Linux (mettere temporaneamente in pausa quello Windows
|
||||
o usare label distinte). Atteso: PASS.
|
||||
|
||||
@@ -338,7 +355,19 @@ EOF
|
||||
in `deploy/systemd/` per replicare i task periodici di
|
||||
`Register-CIScheduledTasks.ps1`.
|
||||
|
||||
- [ ] Copiare le unit:
|
||||
> **Nota**: `ci-retention-policy` e `ci-backup-template` sono stati portati
|
||||
> in Python puro (`retention run` / `template backup`) — **pwsh non è
|
||||
> richiesto**. I backup template vengono compressi con `7z -mx=1` in
|
||||
> `/var/lib/ci/backups/`. `ci-watch-runner-health` usa `--service-name
|
||||
> act-runner` (nome Linux, non Windows).
|
||||
|
||||
> **Prerequisiti creati sull'host**:
|
||||
> ```bash
|
||||
> sudo mkdir -p /var/log/ci /var/lib/ci/backups
|
||||
> sudo chown ci-runner:ci-runner /var/log/ci
|
||||
> ```
|
||||
|
||||
- [x] Copiare le unit:
|
||||
|
||||
```bash
|
||||
cd /opt/ci/local-ci-cd-system
|
||||
@@ -346,7 +375,7 @@ in `deploy/systemd/` per replicare i task periodici di
|
||||
sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
- [ ] Abilitare e avviare tutti i timer:
|
||||
- [x] Abilitare e avviare tutti i timer:
|
||||
|
||||
```bash
|
||||
for t in ci-cleanup-orphans ci-retention-policy \
|
||||
@@ -356,101 +385,83 @@ in `deploy/systemd/` per replicare i task periodici di
|
||||
done
|
||||
```
|
||||
|
||||
- [ ] Verificare lo schedule:
|
||||
- [x] Verificare lo schedule:
|
||||
|
||||
```bash
|
||||
systemctl list-timers --all 'ci-*'
|
||||
```
|
||||
|
||||
Atteso: 5 timer in stato `active`.
|
||||
Atteso: 5 timer in stato `active`. ✅ PASS
|
||||
|
||||
- [ ] Trigger manuale di ciascun service per validare l'esecuzione
|
||||
- [x] Trigger manuale di ciascun service per validare l'esecuzione
|
||||
one-shot:
|
||||
|
||||
```bash
|
||||
for s in ci-cleanup-orphans ci-watch-disk-space ci-watch-runner-health; do
|
||||
for s in ci-cleanup-orphans ci-retention-policy \
|
||||
ci-watch-disk-space ci-watch-runner-health \
|
||||
ci-backup-template; do
|
||||
sudo systemctl start "${s}.service"
|
||||
sudo systemctl status "${s}.service" --no-pager
|
||||
done
|
||||
```
|
||||
|
||||
> `ci-retention-policy` e `ci-backup-template` chiamano `pwsh`:
|
||||
> eseguirli solo dopo aver verificato che `pwsh --version` funzioni
|
||||
> sotto user `ci-runner`.
|
||||
✅ Tutti e 5 PASS.
|
||||
|
||||
- [ ] Per maggiori dettagli (mapping Windows→Linux, troubleshooting,
|
||||
- [x] Per maggiori dettagli (mapping Windows→Linux, troubleshooting,
|
||||
rollback) vedi `deploy/systemd/README.md`.
|
||||
|
||||
---
|
||||
|
||||
## Passo 6 — Cutover (B6)
|
||||
|
||||
**Obiettivo**: spostare la produzione dall'host Windows a Linux in una
|
||||
finestra di manutenzione concordata.
|
||||
**Obiettivo**: passare all'uso normale di Linux come OS primario di
|
||||
produzione CI. Il cutover è un semplice riavvio — i due sistemi non
|
||||
coesistono mai.
|
||||
|
||||
> ⚠️ Eseguire solo dopo che i Passi 1–5 sono tutti `[x]` PASS.
|
||||
|
||||
- [ ] Annunciare la finestra di manutenzione (durata stimata: 30–60 min).
|
||||
- [ ] Verificare nessun job in coda lato Gitea (Admin → Actions → Tasks).
|
||||
- [ ] **Stop** act_runner sull'host Windows:
|
||||
|
||||
```powershell
|
||||
Stop-Service actions-runner
|
||||
Get-Service actions-runner # atteso: Stopped
|
||||
```
|
||||
|
||||
- [ ] **Disabilitare** scheduled task Windows:
|
||||
|
||||
```powershell
|
||||
Get-ScheduledTask -TaskName 'CI-*' | Unregister-ScheduledTask -Confirm:$false
|
||||
```
|
||||
|
||||
- [ ] Rsync incrementale finale degli artifact:
|
||||
- [ ] Attendere la fine di eventuali job in esecuzione su Windows.
|
||||
- [ ] Sbloccare il runner Linux su Gitea UI (rimuovere `paused`).
|
||||
- [ ] Riavviare la macchina in Linux.
|
||||
- [ ] Verificare runner Linux online su Gitea UI e act-runner attivo:
|
||||
|
||||
```bash
|
||||
sudo -u ci-runner rsync -av --delete \
|
||||
user@windows-host:/cygdrive/f/CI/Artifacts/ \
|
||||
/var/lib/ci/artifacts/
|
||||
sudo systemctl status act-runner
|
||||
sudo journalctl -u act-runner -n 20
|
||||
```
|
||||
|
||||
- [ ] Sbloccare il runner Linux su Gitea UI (rimuovere `paused` o
|
||||
ripristinare le label di produzione `windows-build:host,linux-build:host`).
|
||||
- [ ] Verificare runner Linux online su Gitea UI.
|
||||
- [ ] Smoke trigger:
|
||||
- [ ] `self-test.yml` → PASS dal runner Linux
|
||||
- [ ] `build-ns7zip.yml` matrix Win+Linux → PASS dal runner Linux
|
||||
- [ ] Monitorare per ≥30 min:
|
||||
|
||||
```bash
|
||||
sudo journalctl -u act-runner -f --since "30min ago"
|
||||
sudo journalctl -u act-runner -f
|
||||
```
|
||||
|
||||
Nessun errore di severità critica atteso.
|
||||
|
||||
> **Rollback (entro 30 min se PASS critico fallisce)**:
|
||||
> 1. `sudo systemctl stop act-runner` su Linux
|
||||
> 2. `Start-Service actions-runner` su Windows
|
||||
> 3. Re-registrare scheduled task con `scripts\Register-CIScheduledTasks.ps1`
|
||||
> 4. Documentare incidente in `TODO.md` e tornare a B1–B5 per fix
|
||||
> **Rollback**: riavviare in Windows — il runner Windows riprende
|
||||
> automaticamente. Mettere in pausa il runner Linux su Gitea UI,
|
||||
> documentare l'incidente in `TODO.md`.
|
||||
|
||||
---
|
||||
|
||||
## Passo 7 — Capacity burn-in (B7)
|
||||
|
||||
**Obiettivo**: validare il carico target con tempi paragonabili al
|
||||
baseline Windows (entro ±20%).
|
||||
baseline Windows (entro ±20%). I due burn-in sono sequenziali
|
||||
(dual-boot: un OS alla volta).
|
||||
|
||||
- [ ] Burn-in 4 job concorrenti × 10 round su `WinBuild2025`
|
||||
(lo script `Test-CapacityBurnIn.ps1` ora delega via shim alla CLI
|
||||
Python `job` e gira anche da `pwsh` su Linux):
|
||||
- [ ] **Avviato in Linux** — burn-in 4 job concorrenti × 10 round su
|
||||
`WinBuild2025`:
|
||||
|
||||
```bash
|
||||
pwsh /opt/ci/local-ci-cd-system/scripts/Test-CapacityBurnIn.ps1 \
|
||||
-Concurrency 4 -Rounds 10 -Template /var/lib/ci/templates/WinBuild2025/WinBuild2025.vmx
|
||||
```
|
||||
|
||||
- [ ] Burn-in 4 × 10 su `LinuxBuild2404` (analogo, `--Template`
|
||||
sul VMX Linux).
|
||||
- [ ] **Avviato in Linux** — burn-in 4 × 10 su `LinuxBuild2404`
|
||||
(analogo, VMX Linux).
|
||||
- [ ] Misurare:
|
||||
- [ ] Tempo medio per job, confronto con baseline A5
|
||||
- [ ] Tutti i 80 job (2 × 4 × 10) PASS
|
||||
@@ -471,11 +482,10 @@ baseline Windows (entro ±20%).
|
||||
|
||||
## Passo 8 — Stabilità ≥1 settimana
|
||||
|
||||
**Obiettivo**: verificare ≥1 settimana di esercizio Linux senza
|
||||
incidenti critici. (NB: non è più gate per una dismissione Windows —
|
||||
vedi Passo 9: host Windows mantenuto in permanenza.)
|
||||
**Obiettivo**: verificare ≥1 settimana di esercizio con la macchina
|
||||
avviata abitualmente in Linux senza incidenti critici.
|
||||
|
||||
- [ ] Esercizio normale per ≥7 giorni con runner Linux primario.
|
||||
- [ ] Esercizio normale per ≥7 giorni con boot in Linux.
|
||||
- [ ] Verifica giornaliera (bastano 2 minuti):
|
||||
|
||||
```bash
|
||||
@@ -488,29 +498,24 @@ vedi Passo 9: host Windows mantenuto in permanenza.)
|
||||
|
||||
---
|
||||
|
||||
## Passo 9 — ~~Decommissioning host Windows~~ — ANNULLATO
|
||||
## Passo 9 — Gestione dual-boot
|
||||
|
||||
> 🚫 **VINCOLO CATEGORICO: l'host Windows NON va dismesso.** Resta un
|
||||
> target supportato di prima classe in permanenza (run dual-host
|
||||
> Win+Linux), non solo rollback. Niente `shutdown` definitivo, niente
|
||||
> riallocazione hardware che tolga la capacità Windows. Questo step è
|
||||
> mantenuto solo come record storico.
|
||||
> La macchina è **dual-boot**: Windows e Linux coesistono sullo stesso
|
||||
> hardware, non girano mai contemporaneamente. Non c'è dismissione —
|
||||
> Windows resta pienamente funzionale e si usa riavviando nel boot
|
||||
> entry corrispondente.
|
||||
|
||||
- [ ] (Facoltativo, igiene) Backup periodico di `F:\CI\` su archivio
|
||||
esterno:
|
||||
- [ ] Aggiornare `docs/RUNBOOK.md` con la procedura dual-boot:
|
||||
come passare da Linux a Windows e viceversa, e cosa verificare
|
||||
al boot (runner online, act-runner.service attivo).
|
||||
- [ ] (Facoltativo) Verificare che GRUB abbia i timeout e i default
|
||||
corretti per l'uso quotidiano:
|
||||
|
||||
```powershell
|
||||
$stamp = Get-Date -Format 'yyyyMMdd'
|
||||
$archive = "E:\Backup\CI-$stamp.tar"
|
||||
& 'C:\Program Files\Git\usr\bin\tar.exe' -cf $archive 'F:\CI\'
|
||||
Get-FileHash $archive -Algorithm SHA256 | Tee-Object "$archive.sha256"
|
||||
```bash
|
||||
sudo nano /etc/default/grub # GRUB_DEFAULT, GRUB_TIMEOUT
|
||||
sudo update-grub
|
||||
```
|
||||
|
||||
- [ ] Host Windows **resta installato e operativo** (uso dual-host).
|
||||
- [ ] Aggiornare `docs/RUNBOOK.md` documentando l'uso di **entrambi**
|
||||
gli host (Windows + Linux), non una procedura di dismissione.
|
||||
- [ ] ~~Spegnere/riallocare host Windows~~ — NON applicabile.
|
||||
|
||||
---
|
||||
|
||||
## Tracciamento globale
|
||||
@@ -518,18 +523,18 @@ vedi Passo 9: host Windows mantenuto in permanenza.)
|
||||
| Passo | Step | Descrizione | Stato |
|
||||
| ----- | ---- | -------------------------------------------------- | ----- |
|
||||
| 1 | B1 | Setup host Linux Mint (OS, Workstation, venv, ACL) | [x] |
|
||||
| 2 | B2 | Trasferimento template VM + smoke `vm new` | [~] transfer fatto; smoke test pendente |
|
||||
| 3 | B3 | Chiavi SSH + keyring (PoC headless) | [ ] |
|
||||
| 4 | B4 | act_runner systemd service registrato | [ ] |
|
||||
| 5 | B5 | Timer systemd installati e attivi | [ ] |
|
||||
| 6 | B6 | Cutover (Linux primario, Windows resta operativo) | [ ] |
|
||||
| 7 | B7 | Capacity burn-in 4 × 10 (Win + Linux) | [ ] |
|
||||
| 8 | — | ≥1 settimana di stabilità | [ ] |
|
||||
| 9 | B8 | ~~Decommissioning Windows~~ ANNULLATO (dual-host) | [x] |
|
||||
| 2 | B2 | Trasferimento template VM + smoke `vm new` | [x] |
|
||||
| 3 | B3 | Chiavi SSH + keyring (PoC headless) | [x] |
|
||||
| 4 | B4 | act_runner systemd service + `self-test.yml` PASS | [x] |
|
||||
| 5 | B5 | Timer systemd installati e attivi | [x] |
|
||||
| 6 | B6 | Cutover (riavvio in Linux, runner Linux attivo) | [ ] |
|
||||
| 7 | B7 | Capacity burn-in 4 × 10 (Win + Linux, sequenziale) | [ ] |
|
||||
| 8 | — | ≥1 settimana di stabilità (boot Linux abituale) | [ ] |
|
||||
| 9 | — | Gestione dual-boot + RUNBOOK aggiornato | [ ] |
|
||||
|
||||
> **Vincolo categorico**: host Windows supportato in permanenza
|
||||
> (dual-host), mai dismesso. Fase B = Linux **in aggiunta**, non al
|
||||
> posto di Windows.
|
||||
> **Architettura**: la macchina è **dual-boot** (stesso hardware).
|
||||
> Avviata in Linux → runner Linux attivo. Avviata in Windows → runner
|
||||
> Windows attivo. I due sistemi non girano mai contemporaneamente.
|
||||
|
||||
Quando i passi 1-8 sono `[x]`, la **Fase B è chiusa** (B8 annullato per
|
||||
vincolo) e si può valutare l'apertura della Fase C (backend ESXi, vedi
|
||||
|
||||
@@ -86,13 +86,13 @@ A4; cambiano solo path/env vars in Fase B).
|
||||
- [x] [B2] Spegnere fully powered-off i template VM sull'host Windows
|
||||
- [x] [B2] Trasferire `F:\CI\Templates\` → `/var/lib/ci/templates/` con `rsync` (preservare snapshot `BaseClean` / `BaseClean-Linux`)
|
||||
- [x] [B2] Registrare i `.vmx` su Workstation Linux e validare snapshot via `vmrun listSnapshots`
|
||||
- [ ] [B2] Smoke test manuale: `vm new` + `wait-ready` + `vm remove` da host Linux
|
||||
- [ ] [B3] Copiare `F:\CI\keys\ci_linux*` → `/etc/ci/keys/` con perms 600 owner `ci-runner`
|
||||
- [ ] [B3] Re-store credenziali `BuildVMGuest` e `GiteaPAT` con `secret-tool` nel keyring Linux
|
||||
- [ ] [B3] PoC accesso headless al keyring sotto systemd (file vault `age`/`sops` come fallback)
|
||||
- [ ] [B4] Scaricare act_runner Linux ≥ v1.0.2 e registrarlo verso Gitea con label `windows-build:host` e `linux-build:host`
|
||||
- [ ] [B4] Creare unit `/etc/systemd/system/act-runner.service` con `User=ci-runner`, env `CI_*`, `PYTHONIOENCODING=utf-8`
|
||||
- [ ] [B4] `systemctl enable --now act-runner.service` e validare via `journalctl -u act-runner -f`
|
||||
- [x] [B2] Smoke test manuale: `vm new` + `wait-ready` + `vm remove` da host Linux
|
||||
- [x] [B3] Copiare `F:\CI\keys\ci_linux*` → `/var/lib/ci/keys/` con perms 600 owner `ci-runner`
|
||||
- [x] [B3] Re-store credenziali `BuildVMGuest` e `GiteaPAT` con `keyrings.alt.file.PlaintextKeyring` (headless, no D-Bus — `secret-tool` scartato)
|
||||
- [x] [B3] PoC accesso headless al keyring sotto systemd — `PlaintextKeyring` verificato PASS
|
||||
- [x] [B4] Scaricare act_runner Linux ≥ v1.0.2 e registrarlo verso Gitea con label `windows-build:host` e `linux-build:host`
|
||||
- [x] [B4] Creare unit `/etc/systemd/system/act-runner.service` con `User=ci-runner`, env `CI_*`, `PYTHONIOENCODING=utf-8`; `config.yaml` con `runner.envs` per i path template
|
||||
- [x] [B4] `systemctl enable --now act-runner.service` e validare via `journalctl -u act-runner -f`
|
||||
- [x] [B5] Convertire `Register-CIScheduledTasks.ps1` in coppie `*.service` + `*.timer` (`cleanup-orphaned-vms`, `retention-policy`, `watch-disk-space`, `watch-runner-health`, `backup-template`)
|
||||
- [ ] [B5] Abilitare tutti i timer con `systemctl enable --now` e validare `systemctl list-timers`
|
||||
- [ ] [B6] Stop act_runner sull'host Windows e verifica coda Gitea vuota
|
||||
@@ -100,7 +100,7 @@ A4; cambiano solo path/env vars in Fase B).
|
||||
- [ ] [B6] Trigger smoke workflow + `build-ns7zip.yml` matrix da host Linux PASS
|
||||
- [ ] [B7] Eseguire burn-in 4 job concorrenti × 10 round su template Windows e Linux con tempi entro ±20% baseline
|
||||
- [ ] [B8] (Facoltativo) Backup periodico di `F:\CI\`
|
||||
- [x] [B8] ~~Decommissioning host Windows~~ **ANNULLATO** — vincolo categorico: host Windows supportato in permanenza (dual-host), non dismesso
|
||||
- [x] [B8] ~~Decommissioning host Windows~~ **N/A** — la macchina è dual-boot: Windows e Linux sullo stesso hardware, non girano contemporaneamente. Nessuna dismissione.
|
||||
- [ ] [X1] Aggiornare `lint.yml` per girare ruff + mypy + pytest oltre a PSSA
|
||||
- [ ] [X2] Aggiungere observability: log strutturato `logging` + journald handler in Fase B
|
||||
- [ ] [X3] Documentare gestione credenziali headless (DPAPI machine scope su Win, vault `age` su Linux)
|
||||
@@ -484,11 +484,11 @@ il dataset attuale è la base per export futuro.
|
||||
**Rollback**: i template originali su `F:\CI\Templates\` sono intatti.
|
||||
Spegnere host Linux. Eventualmente eliminare `/var/lib/ci/templates/`.
|
||||
|
||||
**Definizione di fatto step B2**:
|
||||
**Definizione di fatto step B2**: ✅ COMPLETATO (2026-05-21)
|
||||
|
||||
- [ ] Tutti i template registrati su Workstation Linux
|
||||
- [ ] Snapshot integri verificati
|
||||
- [ ] Smoke `vm new` PASS per Win e Linux
|
||||
- [x] Tutti i template registrati su Workstation Linux
|
||||
- [x] Snapshot integri verificati
|
||||
- [x] Smoke `vm new` PASS per Win e Linux
|
||||
|
||||
### B3 — Trasferimento credenziali e chiavi
|
||||
|
||||
@@ -524,11 +524,11 @@ target — niente hard-coding di nomi credenziali.
|
||||
**Rollback**: rimuovere `/etc/ci/keys/`, `secret-tool clear` per ogni
|
||||
target. Credenziali su host Windows intatte.
|
||||
|
||||
**Definizione di fatto step B3**:
|
||||
**Definizione di fatto step B3**: ✅ COMPLETATO (2026-05-21)
|
||||
|
||||
- [ ] Chiavi SSH copiate con perms corretti
|
||||
- [ ] Credenziali nel keyring leggibili headless
|
||||
- [ ] Strategia documentata in `docs/HOST-SETUP.md`
|
||||
- [x] Chiavi SSH copiate con perms corretti
|
||||
- [x] Credenziali nel keyring leggibili headless (`PlaintextKeyring` — `secret-tool`/D-Bus scartato)
|
||||
- [ ] Strategia documentata in `docs/HOST-SETUP.md` (pendente X3/X4)
|
||||
|
||||
### B4 — Setup act_runner come systemd service
|
||||
|
||||
@@ -569,12 +569,12 @@ aggiungeranno solo `CI_BACKEND=esxi` + sezione `[backend.esxi]` in
|
||||
**Rollback**: `systemctl disable --now act-runner`, de-registrare
|
||||
runner da Gitea. Runner Windows resta primario.
|
||||
|
||||
**Definizione di fatto step B4**:
|
||||
**Definizione di fatto step B4**: ✅ COMPLETATO (2026-05-21)
|
||||
|
||||
- [ ] act-runner.service attivo e abilitato
|
||||
- [ ] Runner online in Gitea
|
||||
- [ ] `self-test.yml` PASS dal nuovo runner
|
||||
- [ ] Logging via journald validato
|
||||
- [x] act-runner.service attivo e abilitato
|
||||
- [x] Runner online in Gitea
|
||||
- [x] `self-test.yml` PASS dal nuovo runner (Win + Linux, entrambi i transport)
|
||||
- [x] Logging via journald validato
|
||||
|
||||
### B5 — Conversione scheduled tasks → systemd timers
|
||||
|
||||
|
||||
Reference in New Issue
Block a user