feat: update action.yml to use pwsh shell and enhance vm.py with start option; add credential management scripts
This commit is contained in:
@@ -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 | [ ] |
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user