From 270c3472a64a8361677c37b5ce47920ac4966468 Mon Sep 17 00:00:00 2001 From: Simone Date: Sat, 9 May 2026 00:12:03 +0200 Subject: [PATCH] feat: optimize in-VM git clone process and add support for Linux builds --- TODO.md | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/TODO.md b/TODO.md index fa4bb7c..ecaeedb 100644 --- a/TODO.md +++ b/TODO.md @@ -122,6 +122,106 @@ - [ ] Monitoraggio Windows Event Log per fallimenti servizio act_runner - [ ] Configurare retention artifact (pulizia `F:\CI\Artifacts` più vecchi di N giorni) +## In-VM Git Clone (Ottimizzazione) + +Sfruttare l'accesso internet della VM (VMnet8 NAT) per fare il `git clone` direttamente +nella VM, eliminando il ciclo host-clone → zip → WinRM-transfer → unzip. + +### Strategia + +**Flusso attuale:** +``` +host: git clone → host: Compress-Archive → WinRM: copia zip → VM: Expand-Archive → VM: build +``` +**Flusso proposto:** +``` +VM avviata → WinRM: git clone --recurse-submodules https://@gitea/... → VM: build +``` + +**Punti chiave:** +- Il PAT **non deve essere nello snapshot** — viene iniettato a runtime come env var via WinRM + (`git clone https://Simone:@gitea.emulab.it/.git`) e non viene mai persistito +- Git deve essere installato nel template (`Setup-TemplateVM.ps1`) — ora è assente per design +- L'implementazione deve essere **non-breaking**: nuovo switch opt-in `-UseGitClone` in `Invoke-CIJob.ps1` +- Si perde il parallelismo parziale (clone host avviene mentre VM boota), ma si elimina + tutto l'overhead di zip/transfer (rilevante su repo grandi o con molti submoduli) +- Submoduli funzionano nativamente con `--recurse-submodules` (nessun workaround) + +### Task + +- [ ] **Setup-TemplateVM.ps1 — installare Git for Windows** + - [ ] Scaricare e installare Git for Windows (installer silenzioso da git-scm.com) + ```powershell + $gitUrl = 'https://github.com/git-for-windows/git/releases/download/v2.47.1.windows.1/Git-2.47.1-64-bit.exe' + Start-Process $gitUrl '/VERYSILENT /NORESTART /COMPONENTS=gitlfs' -Wait + ``` + - [ ] Aggiungere `C:\Program Files\Git\cmd` al PATH di sistema nella VM + - [ ] Verificare: `git --version` ritorna exit 0 nella VM + - [ ] Rimuovere il commento "Git is NOT installed" dal docblock di Setup-TemplateVM.ps1 + +- [ ] **Setup-TemplateVM.ps1 — altri tool utili** + - [ ] **7-Zip**: installer silenzioso — molto più veloce di `Compress-Archive`/`Expand-Archive` + per archivi grandi (es. npm/NuGet cache warm) + - [ ] **curl.exe**: già presente in Windows 11/Server 2025 (v7.x) — verificare disponibilità + - [ ] Valutare: `jq` (parsing JSON in script PowerShell o bash) — opzionale + +- [ ] **Invoke-CIJob.ps1 — aggiungere switch `-UseGitClone`** + - [ ] Quando `-UseGitClone` è attivo: + - Saltare Phase 1 (host git clone) e la creazione del `HostSourceDir` temporaneo + - Dopo Wait-VMReady, leggere PAT da Windows Credential Manager sull'host + (es. target `git:https://gitea.emulab.it/...` o un target dedicato CI) + - Passare PAT come parametro a `Invoke-RemoteBuild.ps1` (mai loggato/stampato) + - [ ] Comportamento default invariato (`-UseGitClone` = `$false`) — nessuna regressione + +- [ ] **Invoke-RemoteBuild.ps1 — modalità in-VM clone** + - [ ] Aggiungere parametri: `-CloneUrl`, `-CloneBranch`, `-CloneCommit`, `-GitPat` + (tutti opzionali, usati solo quando `-UseGitClone` è attivo) + - [ ] Quando presenti: anziché copiare zip, eseguire nella VM: + ```powershell + git clone --recurse-submodules ` + "https://Simone:$env:CI_GIT_PAT@gitea.emulab.it/Simone/.git" ` + C:\CI\build + git -C C:\CI\build checkout $CloneCommit # pin al commit esatto + ``` + - [ ] Iniettare PAT come variabile d'ambiente della sessione WinRM (non argv, non log) + - [ ] Pulire la variabile d'ambiente dopo il clone: `[System.Environment]::SetEnvironmentVariable('CI_GIT_PAT', $null, 'Process')` + +- [ ] **Test e2e con `-UseGitClone`** + - [ ] Aggiornare snapshot `BaseClean` con Git installato + - [ ] Eseguire `e2e-010` con `-UseGitClone` su `nsis-plugin-nsinnounp` (ha submoduli) + - [ ] Confrontare tempo totale con e2e-009 (senza `-UseGitClone`) + - [ ] Verificare che il PAT non appaia nei log di `Invoke-CIJob.ps1` + +--- + +## Linux Build VM (Future) + +Aggiungere supporto per build su Linux per testare la compilazione cross-platform +(es. versione Linux del plugin o build check con GCC/Clang). + +- [ ] **Template VM Linux** — Provisionare template VM con Ubuntu Server 24.04 LTS + - [ ] Scegliere distro: Ubuntu 24.04 LTS (raccomandato) o Debian 12 + - [ ] Installare toolchain: GCC, Clang, CMake, Python 3.x, build-essential + - [ ] Configurare accesso SSH (chiave pubblica da host) in alternativa/integrazione a WinRM + - [ ] Prendere snapshot `BaseClean-Linux` + - [ ] Archiviare credenziali SSH in Credential Manager (o key file su host) + +- [ ] **Invoke-CIJob.ps1 — branch Linux** + - [ ] Aggiungere parametro `-GuestOS` (`Windows` / `Linux`) o rilevamento automatico da VMX + - [ ] Sostituire WinRM con SSH + SCP per trasferimento zip e raccolta artifacts + - [ ] Aggiungere supporto a comandi Linux (`bash`, `make`, `cmake --build`) + +- [ ] **Workflow Gitea — build matrix** + - [ ] Definire matrix strategy `[windows-build, linux-build]` nel workflow + - [ ] Aggiungere label `linux-build` al runner (o registrare runner separato se necessario) + - [ ] Verificare che artifacts da entrambe le piattaforme vengano raccolti correttamente + +- [ ] **Test e2e Linux** — eseguire almeno un build end-to-end su VM Linux + - [ ] Confermare che `build_plugin.py` (o analogo script) funzioni su Linux + - [ ] Confrontare artifact Linux con quelli Windows + +--- + ## Security Hardening (Post-MVP) - [ ] Passare WinRM da HTTP (5985) a HTTPS (5986) con certificato self-signed