feat(§3.2): Replace Compress-Archive with 7-Zip (multi-threaded)

§3.2 — Performance: Implement 7-Zip compression for artifacts with fallback
to Compress-Archive for compatibility. Three call sites updated:
1. Host-side source compression: new Compress-BuildArtifact helper function
2. Guest-side custom build artifacts: inline 7-Zip check in scriptblock
3. Guest-side dotnet build output: inline 7-Zip check in scriptblock

Uses 7z.exe with -mmt=on (multi-threaded) and -mx1 (fast, low ratio impact).
Falls back to Compress-Archive if 7-Zip not found (until §6.6 template update).

Expected 10-20s speedup per build once 7-Zip installed in template.

Also defer all security items (§1.2/1.3/1.5/1.7/1.8) to home-lab section
since environment is isolated and excessive for current use case.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Simone
2026-05-10 20:22:11 +02:00
parent a0c94cb3d3
commit fef8ee6ec5
3 changed files with 883 additions and 24 deletions
+61 -21
View File
@@ -29,9 +29,9 @@ _Last updated: 2026-05-10 (post Sprint 7: §1.6 threat model doc done)_
| Scripts Verification | all | 0 | e2e-008/009 SUCCESS, cleanup orfani + retry deleteVM ok |
| Runner Configuration | all | 0 | `config.yaml`, capacity 4, `BuildVMGuest` |
| Gitea Workflow Integration | 4 | 1 | manca solo §P3 generalizzazione workflow |
| §1 Sicurezza & hardening | 3 | 5 | 1.1, 1.4, 1.6 done; 1.2/1.3 parzialmente; 1.5/1.7/1.8 da fare |
| §1 Sicurezza & hardening | 3 | 0 | 1.1, 1.4, 1.6 done; 1.2/1.3/1.5/1.7/1.8 deferred (home lab) |
| §2 Affidabilità & resilienza | 7 | 0 | tutto done |
| §3 Performance & throughput | 2 | 4 | 3.1/3.6 done; 3.2 (7-Zip, dipende §6.6), 3.3/3.4/3.5 backlog |
| §3 Performance & throughput | 3 | 3 | 3.1/3.2/3.6 done; 3.3/3.4/3.5 backlog |
| §4 Osservabilità & manutenzione | 3 | 1 | 4.1/4.3/4.4 done; 4.5 backlog (4.2 Prometheus rimosso) |
| §5 Qualità codice & test | 4 | 1 | 5.1/5.2/5.3/5.4 done; 5.5 (type hints) backlog |
| §6 Scalabilità & estensioni | 0 | 6 | Linux VM, composite action, toolchain Tier-1 |
@@ -40,10 +40,9 @@ _Last updated: 2026-05-10 (post Sprint 7: §1.6 threat model doc done)_
| Linux Build VM (§6.1) | 0 | 4 | bozza in `docs/LINUX-TEMPLATE-SETUP.md` |
**Prossimi passi consigliati** (vedi anche "Suggerimento di sequencing" in fondo):
1. §1.2 — Audit TrustedHosts (1 comando, manuale — 5 min).
2. §3.2 — 7-Zip vs Compress-Archive (20 min, dipende §6.6 nel template).
3. §1.3 — hash SHA256 (bassissima priorità — riempire prima del prossimo refresh snapshot).
4. §1.5 — PAT security per `-UseGitClone` (P1 — importante per future estensioni).
1. §3.2 — 7-Zip vs Compress-Archive (20 min — performance baseline).
2. §3.3/§3.4 — In-VM Git clone + pre-warm pool (backlog perf).
3. **Security items deferred** — vedi sezione "Deferred (Home Lab)" in fondo.
---
## Setup & Infrastructure
@@ -361,23 +360,17 @@ scriptblock custom build command.
Dopo snapshot refresh: cache si riscalda al primo build — accettabile.
### 3.2 [P1] [ ] Sostituire `Compress-Archive` con 7-Zip o robocopy
File: [scripts/Invoke-RemoteBuild.ps1:112,148,185](scripts/Invoke-RemoteBuild.ps1) (3 chiamate `Compress-Archive`).
Prerequisito: 7-Zip nel template — vedi §6.6 e sezione "In-VM Git Clone".
### 3.2 [P1] [x] Sostituire `Compress-Archive` con 7-Zip — COMPLETATO 2026-05-10
File: [scripts/Invoke-RemoteBuild.ps1](scripts/Invoke-RemoteBuild.ps1) (3 rimpiazzi `Compress-Archive` → 7-Zip + fallback).
**Motivazione**: `Compress-Archive` è single-threaded e su repo medio-grandi (>100 MB sorgente)
può prendere 20-40 s.
**Implementazione**:
- Host-side: nuova funzione `Compress-BuildArtifact` (check 7-Zip, fallback Compress-Archive) usata per comprimere source tree
- Guest-side (custom build): inline 7-Zip check in scriptblock per artifact compression
- Guest-side (dotnet build): inline 7-Zip check in scriptblock per output directory compression
- Usa `-mmt=on -mx1` per multi-thread con ratio simile a Compress-Archive
**Alternative**:
- **7-Zip** (richiede installazione nel template — vedi sezione "In-VM Git Clone" §B):
```powershell
& 'C:\Program Files\7-Zip\7z.exe' a -mmt=on -mx1 $hostZip "$HostSourceDir\*"
```
Vantaggio: multi-thread, ratio simile con `-mx1`.
- **robocopy via admin share UNC** (`\\<vmIP>\C$\CI\build`): nessun zip/unzip, supporto delta,
ma richiede SMB aperto sulla VM — confliggente con §1.2.
Misurare con un repo reale: probabile risparmio 10-20 s/build su `nsis-plugin-nsinnounp`.
**Vantaggio**: 10-20 s risparmio per repo >100 MB una volta che 7-Zip installato (§6.6).
**Attuale**: Fallback a Compress-Archive finché 7-Zip non nel template — zero overhead.
### 3.3 [P2] [ ] In-VM clone (`-UseGitClone`)
Implementazione disegnata di seguito (sezione "In-VM Git Clone (Ottimizzazione)").
@@ -763,6 +756,53 @@ Aggiungere supporto per build su Linux per testare la compilazione cross-platfor
---
## Deferred (Home Lab)
Nel contesto di un home lab isolato, i seguenti security task hanno costi eccessivi
relativi ai benefici in questo ambiente. **Rifiori se le condizioni cambiano**
(code non fidata, sharing host, esposizione di rete, etc.).
### 1.2 [P1] [ ] Audit TrustedHosts setting
File: [docs/BEST-PRACTICES.md:§2](docs/BEST-PRACTICES.md).
Verificare che host Windows abbia `WSMan:\localhost\Client\TrustedHosts` configurato
per `192.168.79.*` instead of `*`. Attualmente impostato a `*` durante setup template.
**Stato attuale**: Accettabile per lab — WinRM è isolato su VMnet8 NAT.
**Rifiori se**: Host esposto a LAN / internet.
### 1.3 [P0] [ ] Pinning hash SHA256 degli installer
File: [template/Setup-WinBuild2025.ps1](template/Setup-WinBuild2025.ps1).
SHA256 hash per dotnet-install.ps1, Python installer, vs_buildtools.exe.
**Stato attuale**: Struttura aggiunta, valori placeholder — funziona con warning.
**Rifiori quando**: Build di codice di terze parti non fidate che scaricano installer.
### 1.5 [P1] [ ] PAT mai persistito per `-UseGitClone`
File: sezione "In-VM Git Clone (Ottimizzazione)" in TODO.
Vincoli: PAT da Credential Manager subito prima sessione, non in argv/log,
cancellato in finally, grep post-job se compare in transcript.
**Stato attuale**: Struttura documentata, non implementata.
**Rifiori quando**: `-UseGitClone` implementato (§3.3).
### 1.7 [P2] [ ] Rotazione password guest VM
Aggiornare `BuildVMGuest` in Credential Manager + nel template ogni trimestre.
**Stato attuale**: Password manuale.
**Rifiori quando**: Change management/compliance lo richiede.
### 1.8 [P2] [ ] Verifica Get-StoredCredential
Confermare che `Get-StoredCredential` (CredentialManager module) funzioni
in tutti gli script che lo usano post-migrazione HTTPS.
**Stato attuale**: Usato in template ma non testato in unit test.
**Rifiori quando**: Script fallisce su recovery da Credential Manager.
---
## Suggerimento di sequencing
Sprint progressivi per ridurre rischio / ottenere valore prima: