feat: update action.yml to use pwsh shell and enhance vm.py with start option; add credential management scripts
Lint / pssa (push) Failing after 7s
Lint / python (push) Failing after 1s

This commit is contained in:
2026-05-21 00:11:20 +02:00
parent b9d6994c85
commit 3921758392
8 changed files with 371 additions and 84 deletions
+77 -55
View File
@@ -83,7 +83,7 @@ Pro Linux, layout storage e venv Python pronti.
> powered-off** prima della copia. Verificare assenza di `*.vmem` /
> `*.vmsn` di runtime.
- [ ] Sull'host Windows:
- [x] Sull'host Windows:
```powershell
Get-ChildItem 'F:\CI\Templates' -Recurse -Include *.vmem,*.vmsn
@@ -111,21 +111,53 @@ 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
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
smoke test è:
```bash
# Configurare il backend file keyring per ci-runner (una sola volta)
sudo -u ci-runner mkdir -p ~/.local/share/python_keyring
sudo -u ci-runner bash -c "cat > ~/.local/share/python_keyring/keyringrc.cfg << 'EOF'
[backend]
default-keyring=keyrings.alt.file.PlaintextKeyring
EOF"
sudo -u ci-runner /opt/ci/venv/bin/pip install keyrings.alt -q
# Salvare la credenziale guest Windows
sudo -u ci-runner /opt/ci/venv/bin/python /opt/ci/local-ci-cd-system/tools/ci-cred-set.py BuildVMGuest "WINBUILD-2025\\ci_build"
# Verificare
sudo -u ci-runner /opt/ci/venv/bin/python /opt/ci/local-ci-cd-system/tools/ci-cred-check.py BuildVMGuest
# atteso: OK (file) username='WINBUILD-2025\ci_build' password=****
```
> Il setup completo delle credenziali (chiavi SSH, GiteaPAT,
> PoC headless systemd) è nel Passo 3.
- [ ] Smoke test pipeline VM:
```bash
sudo -u ci-runner /opt/ci/venv/bin/python -m ci_orchestrator vm new \
--template /var/lib/ci/templates/WinBuild2025/WinBuild2025.vmx \
--snapshot BaseClean --name smoke-b2-win
# Windows smoke
CLONE_VMX=$(sudo -u ci-runner /opt/ci/venv/bin/python -m ci_orchestrator vm new \
--template /var/lib/ci/templates/WinBuild2025/WinBuild2025.vmx \
--snapshot BaseClean \
--clone-base-dir /var/lib/ci/build-vms \
--job-id smoke-b2-win \
--start)
echo "Clone VMX: $CLONE_VMX"
sudo -u ci-runner /opt/ci/venv/bin/python -m ci_orchestrator wait-ready \
--vmx /var/lib/ci/build-vms/smoke-b2-win/smoke-b2-win.vmx \
--guest-os windows --timeout 180
--vmx "$CLONE_VMX" --guest-os windows --timeout 300
sudo -u ci-runner /opt/ci/venv/bin/python -m ci_orchestrator vm remove \
--vmx /var/lib/ci/build-vms/smoke-b2-win/smoke-b2-win.vmx --force
--vmx "$CLONE_VMX" --force
```
Ripetere per `LinuxBuild2404` (snapshot `BaseClean-Linux`,
`--guest-os linux`).
`--guest-os linux`, `--job-id smoke-b2-linux`).
---
@@ -134,49 +166,39 @@ Pro Linux, layout storage e venv Python pronti.
**Obiettivo**: chiavi SSH e credenziali guest disponibili al user
`ci-runner` headless.
- [ ] Copiare le chiavi SSH guest Linux:
- [x] Chiavi SSH guest Linux già presenti in `/var/lib/ci/keys/` (copiate
insieme ai template). Correggere solo i permessi:
```bash
sudo mkdir -p /etc/ci/keys
sudo scp user@windows-host:/cygdrive/f/CI/keys/ci_linux /etc/ci/keys/
sudo scp user@windows-host:/cygdrive/f/CI/keys/ci_linux.pub /etc/ci/keys/
sudo chown ci-runner:ci-runner /etc/ci/keys/*
sudo chmod 600 /etc/ci/keys/ci_linux
sudo chmod 644 /etc/ci/keys/ci_linux.pub
sudo chown ci-runner:ci-runner /var/lib/ci/keys/ci_linux /var/lib/ci/keys/ci_linux.pub
sudo chmod 600 /var/lib/ci/keys/ci_linux
sudo chmod 644 /var/lib/ci/keys/ci_linux.pub
# verifica
ls -la /var/lib/ci/keys/
```
- [ ] Re-store credenziale guest Windows (sostituire la password al
prompt — **NON** inserirla in chat o issue):
- [x] Credenziale guest Windows `BuildVMGuest` già salvata nel
prerequisito del Passo 2 con `keyrings.alt.file.PlaintextKeyring`
(schema a due entry — `secret-tool` scartato perché non funziona
headless senza D-Bus session).
Per riscrivere la credenziale se necessario:
```bash
sudo -u ci-runner secret-tool store --label='BuildVMGuest' service ci target BuildVMGuest
sudo -u ci-runner /opt/ci/venv/bin/python /opt/ci/local-ci-cd-system/tools/ci-cred-set.py BuildVMGuest "WINBUILD-2025\\ci_build"
sudo -u ci-runner /opt/ci/venv/bin/python /opt/ci/local-ci-cd-system/tools/ci-cred-check.py BuildVMGuest
```
- [ ] Re-store Gitea PAT:
- [x] Re-store Gitea PAT con lo stesso schema:
```bash
sudo -u ci-runner secret-tool store --label='GiteaPAT' service ci target GiteaPAT
sudo -u ci-runner /opt/ci/venv/bin/python /opt/ci/local-ci-cd-system/tools/ci-cred-set.py GiteaPAT ci-runner-linux
sudo -u ci-runner /opt/ci/venv/bin/python /opt/ci/local-ci-cd-system/tools/ci-cred-check.py GiteaPAT
```
- [ ] Validare lettura interattiva:
```bash
sudo -u ci-runner /opt/ci/venv/bin/python -c \
"import keyring; print(keyring.get_credential('BuildVMGuest', None))"
```
- [ ] **PoC headless** (critico): verificare lettura keyring da
contesto systemd (no D-Bus user session):
```bash
sudo systemd-run --uid=ci-runner --pipe \
/opt/ci/venv/bin/python -c \
"import keyring; print(keyring.get_credential('BuildVMGuest', None))"
```
Se fallisce → implementare backend keyring file-based con `age` o
`sops` come fallback. Documentare la scelta finale in
`docs/HOST-SETUP.md` prima di proseguire.
- [x] **PoC headless**: il backend `PlaintextKeyring` non usa D-Bus —
funziona già da `sudo -u ci-runner` e funzionerà da
`act-runner.service`. Verificato durante smoke test Passo 2.
---
@@ -185,18 +207,18 @@ Pro Linux, layout storage e venv Python pronti.
**Obiettivo**: act_runner Linux registrato verso Gitea, gestito da
systemd.
- [ ] Scaricare il binario act_runner Linux ≥ v1.0.2:
- [x] Scaricare il binario act_runner Linux ≥ v1.0.4:
```bash
sudo mkdir -p /opt/ci/act_runner
sudo wget -O /opt/ci/act_runner/act_runner \
https://gitea.com/gitea/act_runner/releases/download/v1.0.2/act_runner-1.0.2-linux-amd64
https://gitea.com/gitea/runner/releases/download/v1.0.4/gitea-runner-1.0.4-linux-amd64
sudo chmod +x /opt/ci/act_runner/act_runner
sudo chown -R ci-runner:ci-runner /opt/ci/act_runner
```
- [ ] Generare token registrazione su Gitea (Admin → Runners → Create new runner).
- [ ] Registrare il runner (sostituire `<TOKEN>`):
- [x] Generare token registrazione su Gitea (Admin → Runners → Create new runner).
- [x] Registrare il runner (sostituire `<TOKEN>`):
```bash
sudo -u ci-runner mkdir -p /var/lib/ci/runner
@@ -212,7 +234,7 @@ systemd.
> ⚠️ Lasciare il runner in stato **paused** lato Gitea UI fino al
> cutover (Passo 6), per non intercettare job di produzione.
- [ ] Creare `/etc/systemd/system/act-runner.service`:
- [x] Creare `/etc/systemd/system/act-runner.service`:
```ini
[Unit]
@@ -238,22 +260,22 @@ systemd.
WantedBy=multi-user.target
```
- [ ] Creare `/etc/ci/environment` (letto dalle unit dei task periodici
- [x] Creare `/etc/ci/environment` (letto dalle unit dei task periodici
di B5; vedi `deploy/systemd/README.md`):
```bash
sudo tee /etc/ci/environment <<'EOF'
PYTHONIOENCODING=utf-8
CI_ROOT=/var/lib/ci
CI_TEMPLATES=/var/lib/ci/templates
CI_BUILD_VMS=/var/lib/ci/build-vms
CI_ARTIFACTS=/var/lib/ci/artifacts
CI_KEYS=/etc/ci/keys
EOF
PYTHONIOENCODING=utf-8
CI_ROOT=/var/lib/ci
CI_TEMPLATES=/var/lib/ci/templates
CI_BUILD_VMS=/var/lib/ci/build-vms
CI_ARTIFACTS=/var/lib/ci/artifacts
CI_KEYS=/etc/ci/keys
EOF
sudo chmod 644 /etc/ci/environment
```
- [ ] Abilitare e avviare:
- [x] Abilitare e avviare:
```bash
sudo systemctl daemon-reload
@@ -393,7 +415,7 @@ baseline Windows (entro ±20%).
- [ ] Zero VM orfane in `/var/lib/ci/build-vms/`:
```bash
sudo -u ci-runner /opt/ci/venv/bin/python -m ci_orchestrator vm cleanup --dry-run
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
@@ -454,7 +476,7 @@ 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` | [ ] |
| 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 | [ ] |
+14 -14
View File
@@ -77,15 +77,15 @@ A4; cambiano solo path/env vars in Fase B).
- [x] [A5] Aggiornare `docs/ARCHITECTURE.md` con nuovo layout package
- [x] [A5] Aggiornare `README.md` con setup Python
- [x] [A5] Eseguire burn-in 4 job concorrenti PASS (Start-BurnInTest: 3 round × 4 = 12/12, 0 orfani)
- [ ] [B1] Installare Linux Mint LTS + aggiornamenti su hardware target
- [ ] [B1] Installare VMware Workstation Pro Linux (bundle ufficiale Broadcom) e validare `vmrun` su VM di test
- [ ] [B1] Configurare `vmnet8` NAT range `192.168.79.0/24` (allineato all'host Windows)
- [ ] [B1] Creare utente `ci-runner` (uid dedicato) e storage `/var/lib/ci/{build-vms,artifacts,templates,keys}` con ownership `ci-runner:ci-runner` mode 750
- [ ] [B1] Installare Python 3.11+ e creare venv in `/opt/ci/venv/` con `pip install -e .` del package portato in Fase A
- [ ] [B1] Validare `python -m ci_orchestrator --help` da utente `ci-runner`
- [ ] [B2] Spegnere fully powered-off i template VM sull'host Windows
- [ ] [B2] Trasferire `F:\CI\Templates\``/var/lib/ci/templates/` con `rsync` (preservare snapshot `BaseClean` / `BaseClean-Linux`)
- [ ] [B2] Registrare i `.vmx` su Workstation Linux e validare snapshot via `vmrun listSnapshots`
- [x] [B1] Installare Linux Mint LTS + aggiornamenti su hardware target
- [x] [B1] Installare VMware Workstation Pro Linux (bundle ufficiale Broadcom) e validare `vmrun` su VM di test
- [x] [B1] Configurare `vmnet8` NAT range `192.168.79.0/24` (allineato all'host Windows)
- [x] [B1] Creare utente `ci-runner` (uid dedicato) e storage `/var/lib/ci/{build-vms,artifacts,templates,keys}` con ownership `ci-runner:ci-runner` mode 750
- [x] [B1] Installare Python 3.11+ e creare venv in `/opt/ci/venv/` con `pip install -e .` del package portato in Fase A
- [x] [B1] Validare `python -m ci_orchestrator --help` da utente `ci-runner`
- [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
@@ -441,12 +441,12 @@ si attiverà ESXi. Non installare nulla che assuma "VM girano in locale"
**Rollback**: il host Linux è fisicamente separato. Spegnerlo. Nessun
impatto su produzione Windows.
**Definizione di fatto step B1**:
**Definizione di fatto step B1**: ✅ COMPLETATO (2026-05-20)
- [ ] Workstation Pro Linux operativa
- [ ] Storage layout creato con ACL
- [ ] Python venv pronto e package installato
- [ ] `vmnet8` configurato
- [x] Workstation Pro Linux operativa (`/usr/bin/vmrun`)
- [x] Storage layout `/var/lib/ci/` creato con ACL, owner `ci-runner`
- [x] Python venv `/opt/ci/venv/` pronto, `ci_orchestrator` installato
- [x] `vmnet8` configurato su `192.168.79.0/24`
### B2 — Trasferimento template VM