Commit Graph

109 Commits

Author SHA1 Message Date
Simone 364c51b448 perf(template): NSIS download use WebClient instead of IWR (no progress-bar overhead) 2026-05-11 20:44:50 +02:00
Simone 1ad9b4dd4f fix(template): NSIS download fix meta-refresh regex to match downloads.sf.net token URL 2026-05-11 20:38:36 +02:00
Simone 133701dd60 fix(template): NSIS download browser User-Agent + PE magic bytes guard 2026-05-11 20:32:55 +02:00
Simone 1b4c3be3f5 chore(template): bump PS7 7.6.1, NSIS 3.12, gh CLI 2.92.0 2026-05-11 20:29:23 +02:00
Simone 5c1a197559 refactor(template): promote PS7/NSIS/gh CLI from Tier-2 to Tier-1 (Step 11) 2026-05-11 20:26:06 +02:00
Simone 1bf7c2347b feat(template): add -SkipTier2 switch to skip Tier-2 toolchain installation
Setup-WinBuild2025.ps1:
  - New [switch] \ param (after \)
  - Step 12 block wrapped with if (\) { skip-message } else { ... }
  - Final gate Tier-2 Assert-Step wrapped with if (-not \)

Prepare-WinBuild2025.ps1:
  - New [switch] \ param forwarded to Setup via setupArgs

Validate-SetupState.ps1:
  - New [switch] \ param
  - \ passed into both remote scriptblocks via -ArgumentList
  - Tier-2 Chk calls guarded with if (-not \) in both blocks
2026-05-11 20:13:58 +02:00
Simone 987b36ff3f feat(template): §6.6 Tier-2 toolchain PS7/NSIS/CMake/Node.js/WiX/gh CLI/Sysinternals/vcpkg
Step 12 in Setup-WinBuild2025.ps1 installs all 8 Tier-2 tools:
  - PowerShell 7.4.7 LTS (pwsh.exe)
  - NSIS 3.10 (makensis.exe)
  - CMake 3.31.6 (cmake.exe)
  - Node.js 22.14.0 LTS (node.exe + npm)
  - WiX 4.0.5 via dotnet tool (wix.exe, C:\BuildTools\Wix\)
  - GitHub CLI 2.67.0 (gh.exe)
  - Sysinternals Suite (C:\BuildTools\Sysinternals\, extracted via 7-Zip)
  - vcpkg HEAD shallow clone + bootstrap (C:\BuildTools\vcpkg\)

All tools added to Machine PATH; idempotent (binary-presence check).
Hash entries in \ ready for SHA256 pinning.
knownTempFiles extended; Final gate Assert-Step added for all 8 binaries.

Prepare-WinBuild2025.ps1: 7 new params + pass-through to Setup.
Validate-SetupState.ps1: Tier-2 checks in both main + re-run scriptblocks.
TODO.md: §6.6 [~] -> [x], Sprint 11 summary.
v1.5.0
2026-05-11 20:04:50 +02:00
Simone f948f23f0f docs(todo): Sprint 10 - mark §6.1 Linux e2e PASS + close In-VM Git Clone section v1.4.0 2026-05-11 19:49:10 +02:00
Simone 039fcdb9c9 feat(script): add UseGitClone and GuestRepoUrl parameters for in-VM cloning 2026-05-11 18:50:05 +02:00
Simone 1c39701534 fix(workflows): use shell:powershell (PS 5.1) instead of pwsh; fix ciScriptsDir path
- All 3 workflows: pwsh -> powershell (host requires PS 5.1, not Core 7+)
- workflow-example.yml: replace GITHUB_WORKSPACE-relative ciScriptsDir with
  hardcoded host path; use SSH alias URL (host-clone mode) instead of HTTP
- docs: add WORKFLOW-AUTHORING.md reference for AI and developers
2026-05-11 18:48:07 +02:00
Simone db1530cf0f fix(linux): correct PS escape for $GIT_CLONE_URL in UseGitClone clone cmd
In PS double-quoted strings, backslash does NOT escape '$'.
Only backtick does ('`$'). The previous '\' was being
expanded as a PS variable (undefined), triggering StrictMode error:
'Cannot retrieve variable \ because it has not been set.'

Replace '\$' with '`$' so the literal shell variable reference
\ is emitted correctly to the SSH command.
2026-05-11 18:40:19 +02:00
Simone 54399a2120 chore: update runner config and workflow example for linux-build label
runner/config.yaml:
- Add linux-build:host label alongside windows-build:host
- capacity remains 4 (concurrent jobs)

gitea/workflow-example.yml:
- Add linux-build job example (runs-on: linux-build:host)
- Document GuestOS auto-detection and SSH transport parameters
2026-05-11 18:35:24 +02:00
Simone 1c8fdcf028 docs: update documentation for Linux VM support (Sprint 9)
AGENTS.md (new):
- Environment reference for AI agents: host specs, PS 5.1 constraints,
  dir structure, VM templates, transport layer, style rules
- Lessons #9 (snapshot cold state) and #10 (vmrun list vs getGuestIPAddress)

ARCHITECTURE.md:
- Add SSH/SCP transport section (Linux VMs)
- Update system diagram to include _Transport.psm1, SSH transport path
- Network layout: add SSH port 22 for Linux VMs
- Timeline: Linux readiness check phases documented

CI-FLOW.md:
- Prerequisites table: add Template VM (Linux), SSH key row
- Step 6 (readiness): document Windows vs Linux phases
- Step 7 (build) and Step 8 (artifacts): document Linux/SSH paths
- ci-report-ip guestinfo mechanism referenced

HOST-SETUP.md:
- Directory tree: add LinuxBuild2404 template dir and keys/
- Post-setup checklist: add step 5 (SSH key generation + Linux template)
- Fix duplicate step numbering (56, 67)
- Reference Paths table: add Linux template VMX, snapshot, SSH key

LINUX-TEMPLATE-SETUP.md:
- Rewritten as implementation record (no longer a plan)
- Fase A user-data: minimal (user+SSH key only, no packages/runcmd)
- All phases marked complete with actual paths and snapshot names

WINDOWS-TEMPLATE-SETUP.md: minor updates for consistency

TODO.md:
- Summary: update last-updated to 2026-05-11, Sprint 9 description
- Linux Build VM row: all 5 items complete
- Prossimi passi: Test Plan + §6.6 Tier-2 as next priorities
2026-05-11 18:35:11 +02:00
Simone 383d6864ce test: add Linux build E2E test scripts
Test-Ns7zipBuild-Linux.ps1: e2e test for nsis7z plugin build on Linux VM
  (confirmed PASS: nsis7z.dll 2272 KB in 03:09  2026-05-11)

Test-NsinnounpBuild-Linux.ps1: e2e test for nsinnounp plugin build on Linux VM
2026-05-11 18:34:50 +02:00
Simone 9fcc46afd6 feat(linux): add Ubuntu 24.04 template VM automation scripts
Deploy-LinuxBuild2404.ps1 (host-side):
- Downloads Ubuntu 24.04 cloud VMDK (cached in F:\CI\ISO\)
- Generates cloud-init seed ISO (nocloud + guestinfo backup datasource)
- user-data: user+SSH key only  no packages/runcmd, all provisioning
  delegated to Prepare/Setup (removed -MinimalConfig, now always minimal)
- Assembles VMX, powers on VM, waits for cloud-init completion via SSH
- Removes seed ISO from VMX after first boot (ide1:0 disabled)
- Next-steps message uses correct -VMIPAddress parameter

Prepare-LinuxBuild2404.ps1 (host-side):
- Powers on template VM, waits for SSH readiness
- Copies Setup-LinuxBuild2404.sh into guest, runs it with sudo
- Validates setup result (all tools in PATH, dirs, sshd, swap off)
- Takes snapshot BaseClean-Linux (cold, VM shut down before snapshot)
- -NoMingw switch to skip mingw-w64 cross-compiler installation

Setup-LinuxBuild2404.sh (guest-side):
- apt update/upgrade, build-essential, gcc, g++, clang, cmake, ninja
- python3, pip3, venv; git, p7zip-full, curl, wget, ca-certificates
- Optional .NET SDK (--dotnet), mingw-w64 cross-compiler (--no-mingw to skip)
- /opt/ci/{build,output,scripts,cache} dirs (ci_build ownership)
- SSH hardening (PasswordAuthentication no, PubkeyAuthentication yes)
- Swap disable (swapoff -a + fstab), MAC-agnostic netplan for linked clones
- ci-report-ip systemd service (guestinfo.ci-ip reporter)
- apt auto-update disabled; full validation gate at end
2026-05-11 18:34:38 +02:00
Simone fee5963a65 feat(linux): update orchestration scripts for dual-OS (Windows/Linux) support
Wait-VMReady.ps1:
- Phase 1: vmrun list + path matching instead of getGuestIPAddress (avoids hang)
- Phase 2/3: WinRM (Windows) or TCP:22 + ssh echo (Linux) based on -Transport param
- -Transport SSH auto-selected by Invoke-CIJob when guestOS=ubuntu-64

Invoke-CIJob.ps1:
- Auto-detect GuestOS from clone VMX guestOS field
- Pass -GuestOS Linux to Wait-VMReady, Invoke-RemoteBuild, Get-BuildArtifacts
- Git clone output streamed line-by-line (fix buffered stdout)

Invoke-RemoteBuild.ps1:
- -GuestOS Linux path: SSH+SCP via _Transport.psm1
- Always uses in-VM git clone for Linux builds

Get-BuildArtifacts.ps1:
- -GuestOS Linux path: scp -r ci_build@<ip>:/opt/ci/output/ to host artifact dir
2026-05-11 18:34:16 +02:00
Simone 08f7bb1757 feat(linux): add SSH/SCP transport module (_Transport.psm1)
Exported functions:
- Invoke-SshCommand   run a command on a Linux guest via ssh.exe (BatchMode=yes)
- Copy-SshItem        scp a local path to a remote path (or vice versa)
- Test-SshReady       test TCP:22 + ssh echo round-trip

Used by Wait-VMReady.ps1 -Transport SSH, Invoke-RemoteBuild.ps1 -GuestOS Linux,
Get-BuildArtifacts.ps1 -GuestOS Linux.
2026-05-11 18:34:00 +02:00
Simone 59d38bee51 docs(linux): resolve 4 open questions in Deploy plan (EFI, vdiskmanager, growpart, transport scope) 2026-05-11 00:01:14 +02:00
Simone be80293af6 docs(linux): add Step 1b auto-download cloud VMDK in Deploy plan 2026-05-10 23:54:48 +02:00
Simone 4b2172f09e docs(linux): rewrite LINUX-TEMPLATE-SETUP as implementation plan checklist (automated cloud-init approach) 2026-05-10 23:52:42 +02:00
Simone f64880129a docs: add Deploy step + 2022 variant to Setup rapido and WINDOWS-TEMPLATE-SETUP 2026-05-10 23:18:04 +02:00
Simone 90a4396443 feat: enhance documentation and scripts for in-VM Git cloning and template setup
- Updated README.md to reflect the new in-VM git clone feature with `-UseGitClone`.
- Modified Setup-Host.ps1 to correct VMX path references.
- Revised various documentation files (ARCHITECTURE.md, CI-FLOW.md, HOST-SETUP.md, WINDOWS-TEMPLATE-SETUP.md) to include updated paths and features.
- Added Setup-GiteaSSH.md for SSH configuration instructions.
- Archived outdated documentation and updated README.md for clarity on current resources.
2026-05-10 23:03:56 +02:00
Simone a60f7a4b90 docs(test-plan): update results for 2026-05-10 session
- Overview table: mark partial vs done (VM-dependent items noted)
- Success Criteria: check all validated items, mark VM-only as [skip]
- Session results: 22/22 Pester, PSScriptAnalyzer 0 errors, IP validation,
  disk watch, retention policy, orphan cleanup, runbook, threat model all pass
2026-05-10 22:52:41 +02:00
Simone fa2acc4b46 fix(tests): lower ValidateRange minimums and use .ps1 fake vmrun for Pester 2026-05-10 22:50:25 +02:00
Simone a3a24199b3 fix: resolve PSScriptAnalyzer ParseError and StrictMode Count issue 2026-05-10 22:50:12 +02:00
Simone 6b2a23b8f9 chore: Bump 7-Zip 24.07→26.01, Git 2.47→2.54 across docs + setup
Setup-WinBuild2025.ps1: default SevenZipVersion '24.07' → '26.01'
TODO.md: Tier-1 table + bullet list updated to current versions
TEST-PLAN: expected version strings and checklist updated

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 22:32:26 +02:00
Simone 8b3823838d docs(todo): Mark §3.3 e2e PASS + §3 CHIUSO
E2E result (2026-05-10, nsis-plugin-nsinnounp):
  Baseline (host-side zip):  02:13.90 / 1.63 MB
  Guest clone (-UseGitClone): 01:39.52 / 1.63 MB
  Delta: -34.4s (-25.7%)

§3 Performance & throughput fully closed (3.1/3.2/3.3/3.6 done, 3.4/3.5 deferred).
Next: Test Plan execution + §6.6 Tier-2 toolchain expansion.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 22:28:42 +02:00
Simone d1f267b67c fix(artifacts): Retry WinRM connect in Get-BuildArtifacts (wsmprovhost delay)
After Invoke-RemoteBuild closes its session, wsmprovhost.exe may take a moment
to release resources. Subsequent New-PSSession in Get-BuildArtifacts fails with
'WSMan service could not launch a host process'.

Add retry loop: 3 attempts, 10s backoff. Enough for WinRM to recover between
the build session and artifact collection session.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 22:23:11 +02:00
Simone 73bb9b182b fix(§3.3): Replace credential-store with http.extraHeader for WinRM auth
credential-store --file fails in WinRM on Windows (path escaping, no helper
binary resolution in non-interactive shell). Switch to http.extraHeader:

  git -c credential.helper=       -c 'http.extraHeader=Authorization: Basic <b64>'       clone ...

Advantages:
- No credential helper binary needed
- No temp file (no cleanup required)
- Token never in URL, command display, or Write-Host output
- Works in WinRM non-interactive sessions (no TTY dependency)
- GCM still cleared by credential.helper= prefix

§1.5 compliant: Base64 is in git process argv (not logged by Write-Host).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 22:16:44 +02:00
Simone 73fca1c74a fix(§3.3): Disable GCM + set GIT_TERMINAL_PROMPT=0 in WinRM guest clone
Git Credential Manager (GCM) installed by Git for Windows tries to open
an interactive credential prompt or wincredman store — both fail in a
WinRM session (no TTY, no interactive desktop).

Fix:
- Set GIT_TERMINAL_PROMPT=0 to suppress all interactive git prompts
- Prepend '-c credential.helper=' (empty string) to reset the helper chain
  before injecting our store-based helper (clearing GCM from the chain)
- Custom credential helper (store --file <tmp>) then appended only when PAT present

Without PAT (public repo): GCM still cleared, no prompt attempted, clean fail
  if auth is actually required.
With PAT: store-based helper used exclusively, GCM never invoked.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 22:10:01 +02:00
Simone eb6fdfb2ca feat(§3.3): Implement Gitea PAT auth for guest-side git clone
Credential Manager target 'GiteaPAT' (default) read on host, passed
securely to guest WinRM session. Token never appears in argv, URL, or logs.

Guest auth flow (§1.5 compliant):
1. Host reads PAT via Get-StoredCredential -Target GiteaPAT
2. Username + password passed as ArgumentList to Invoke-Command
3. Guest writes temp .git-credentials file (https://user:token@host)
4. git clone uses: -c 'credential.helper=store --file <tmp>'
5. finally{} deletes credentials file regardless of clone success/fail

Setup (one-time on host):
  New-StoredCredential -Target 'GiteaPAT' -UserName '<user>' `
      -Password '<pat>' -Persist LocalMachine

Invoke-CIJob.ps1: added -GiteaCredentialTarget param (default: 'GiteaPAT'),
passed through to Invoke-RemoteBuild when -UseGitClone is set.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 22:03:36 +02:00
Simone c10c79d4f4 fix(test): Fix §3.3 e2e — pipeline pollution + SSH URL not usable in guest
Two bugs:
1. Run-Test used '& $orchestrator @params' without Out-Host — orchestrator output
   collected in function pipeline, mixed with returned hashtable → caller received
   array instead of hashtable → .Success property lookup threw under StrictMode.
   Fix: pipe to Out-Host.

2. RepoUrl was ssh://gitea-ci/... (SSH config alias) — alias exists only on
   host SSH config, not in guest VM. Guest-side clone (§3.3) needs HTTP URL
   directly reachable from inside the VM.
   Fix: separate -HostRepoUrl / -GuestRepoUrl params, inject per mode.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:59:51 +02:00
Simone e2f1f8b1ea fix(template): Add 7-Zip to machine PATH registry (not just session PATH)
Root cause: Assert-Step 'Final' 'dotnet/python/msbuild' block contains a
registry PATH refresh that overwrites $env:PATH, discarding the temporary
session injection added in §6.6. Next assertion (7z command available) then fails.

Fix: use SetEnvironmentVariable('PATH', ..., 'Machine') to permanently register
C:\Program Files\7-Zip in the system PATH — same pattern used for dotnet and MSBuild.
Follow-up registry refresh ensures $env:PATH is also current.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:50:48 +02:00
Simone 0fd931d6a9 fix(template): Fix Git skip path + 7-Zip PATH injection
Two root causes:
1. Git skip check used C:\BuildTools\Git but Git installs to
   C:\Program Files\Git (default). Changed $gitDir to correct path.

2. 7-Zip MSI does not register in system PATH. Registry refresh
   (GetEnvironmentVariable Machine+User) was picking up empty result.
   Fixed: inject sevenZipDir directly into $env:PATH if not present.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:42:29 +02:00
Simone c9a9d57b9c fix(template): Always refresh PATH after git/7z check, not just after install
PATH refresh was inside the 'else' block (only during fresh install).
If tools already exist from previous run, PATH not refreshed → validation fails.

Move PATH refresh outside if/else for both Git and 7-Zip:
- Already installed: skip download+install, but refresh PATH anyway
- Fresh install: download+install, then refresh PATH

Ensures validations can always resolve git/7z commands, even on retry runs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:35:06 +02:00
Simone a981be62f4 fix(template): Refresh PATH after 7-Zip MSI installation
7-Zip MSI installer adds to system PATH but PowerShell session doesn't
see it until PATH is refreshed. Refresh via:
  $env:PATH = [System.Environment]::GetEnvironmentVariable('PATH', 'Machine') + ';' +
              [System.Environment]::GetEnvironmentVariable('PATH', 'User')

Same pattern already used for Git installer. Fixes validation error:
  '7z command resolvable' now passes after installation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:29:59 +02:00
Simone 3283109bed fix(template): Handle Git version tag vs filename mismatch
GitHub release tag: v2.54.0.windows.1
Filename in release: Git-2.54.0-64-bit.exe (no .windows.1)

Extract base version for filename via regex:
  $gitVersionBase = $GitVersion -replace '\.windows\.\d+$', ''

URL now correctly formed as:
  .../download/v2.54.0.windows.1/Git-2.54.0-64-bit.exe

Reverted GitVersion back to '2.54.0.windows.1' (needed for tag).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:26:00 +02:00
Simone c6b0957865 fix(template): Correct Git version to 2.54.0 (no .windows.1 suffix)
GitHub release tag is v2.54.0, not v2.54.0.windows.1.
Filename format: Git-2.54.0-64-bit.exe

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:25:29 +02:00
Simone be0a5dd065 fix(template): Update Git for Windows to 2.54.0 + add SHA256 hash
Version 2.47.0.windows.1 no longer available on GitHub (network errors).
Updated to latest stable 2.54.0.windows.1 with SHA256 hash pinning (§1.3).

Hash: 2b96e7854f0520f0f6b709c21041d9801b1be44d5e1a0d9fa621b2fbc40f1983
Source: https://github.com/git-for-windows/git/releases

This fixes download failures in Setup-WinBuild2025 Step 11 (Tier-1 Toolchain).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:24:18 +02:00
Simone d732e182ce test(validation): Add Git + 7-Zip checks to Validate-SetupState
§6.6 Tier-1 Toolchain (Git for Windows, 7-Zip) now included in final
state validation. Checks:
- 'Git for Windows (git.exe in PATH)'
- '7-Zip (7z.exe in PATH)'

Added to both initial validation pass and re-validation pass (post-remediation).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:01:46 +02:00
Simone 13ecd823dc test(e2e): Add §3.3 comparison script (host-side vs guest-clone)
Create Test-E2E-Section3.3.ps1 for side-by-side measurement:
- Runs nsis-plugin-nsinnounp with default host-side clone (baseline)
- Runs same build with -UseGitClone flag (target: guest-side git)
- Displays elapsed time, artifact size, performance delta

Usage:
  .\scripts\Test-E2E-Section3.3.ps1               # Full comparison
  .\scripts\Test-E2E-Section3.3.ps1 -SkipBaseline  # Guest-clone only
  .\scripts\Test-E2E-Section3.3.ps1 -SkipGuestClone # Baseline only

Prerequisite: Template VM has Git installed (§6.6 Tier-1 Toolchain).

Also: Defer §3.5 (vCPU/RAM tuning) and §3.4 (pre-warm pool) to home lab
section — not required for initial CI operability.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:00:03 +02:00
Simone 021ce9718f docs(TODO): Mark §3.3 In-VM Git Clone complete
Update TODO.md to reflect §3.3 implementation:
- §3 summary: 4 done (3.1/3.2/3.3/3.6), 1 open (3.5), 1 deferred (3.4)
- §3.3 marked [x] completato 2026-05-10
- Document implementation: Mode 1 (host) vs Mode 2 (guest) clone
- Update recommended next steps: prioritize E2E test §3.3 + full test plan

Next actionable: E2E validation with -UseGitClone flag to measure
host-zip-transfer overhead elimination.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 20:55:31 +02:00
Simone edfd6a3907 feat(§3.3): Complete In-VM Git Clone implementation
Add guest-side clone mode to Invoke-RemoteBuild.ps1:

Changes:
1. Update DESCRIPTION: document Mode 1 (host) vs Mode 2 (guest) clone
2. Add params: CloneUrl, CloneBranch, CloneCommit, CloneSubmodules
3. Mode validation: enforce mutual exclusion (HostSourceDir XOR CloneUrl)
4. Conditional source prep:
   - Mode 1 (default): compress host source, zip-transfer, expand in guest
   - Mode 2 (§3.3): clone repo directly in guest via git

Guest clone implementation (§3.3):
- Clone with --depth 1, --branch specified, optionally --recurse-submodules
- Checkout specific commit if provided (handles shallow history edge case)
- PAT handling per §1.5: read from Credential Manager (placeholder),
  passed as env var in WinRM session, cleaned up immediately after clone
- No PAT in argv, logs, or transcript — only in session env scope

Prerequisite: Git for Windows in template (§6.6, complete)
Testing: E2E with nsis-plugin-nsinnounp (-UseGitClone flag)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 20:55:02 +02:00
Simone 844142b250 feat(§3.3): Partial implementation of In-VM Git Clone
Add -UseGitClone switch to Invoke-CIJob.ps1 + conditional logic:

Changes:
1. Add -UseGitClone [switch] param + docstring (§3.3 mode)
2. Modify Phase 1 to skip host clone when -UseGitClone active
3. Phase 5: Pass CloneUrl/CloneBranch/CloneCommit instead of HostSourceDir
   when -UseGitClone enabled
4. Finally: Skip host cleanup when -UseGitClone (dir never created)

When -UseGitClone is active:
- Phase 1 (host clone) skipped — clone happens in VM instead
- Phase 5 passes git repo parameters to Invoke-RemoteBuild.ps1
- PAT (if needed) read in Invoke-RemoteBuild session (§1.5)

Prerequisite: Git for Windows + 7-Zip in template (§6.6, now complete)

Work in progress: Invoke-RemoteBuild.ps1 modifications pending (source transfer
conditional + guest-side git clone logic).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 20:54:39 +02:00
Simone f9ef9f9769 test(plan): Update prerequisites + add §6.6 Tier-1 Toolchain test section
Mark verified prerequisites (2026-05-10):
- [x] Template VM WinBuild2025.vmx + BaseClean snapshot
- [x] F:\CI\ directory structure
- [x] act_runner service running
- [x] Pester v5.7.1 installed
- [x] CredentialManager module

Add test section for §6.6 (Git + 7-Zip):
- Step 11 installation validation
- Git command + clone test
- 7-Zip command + compression test
- In-VM git availability (prereq for §3.3)

Update Success Criteria:
- [x] Git (v2.47.0+) in template + PATH
- [x] 7-Zip (v24.07+) in template + PATH
- [x] Final pre-snapshot gate validates both tools

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 20:51:39 +02:00
Simone b69c4a2f19 docs(TODO): Mark §6.6 Tier-1 Toolchain partially complete — Git + 7-Zip done
Update TODO.md to reflect progress on §6.6:
- Mark §6 summary: 1 done (6.6 Git+7-Zip), 5 open (6.1 Linux, 6.2-6.5 extensions)
- §6.6 now shows [~] (partially complete) with note on implementation status
- Separate Tier-1 (done: Git, 7-Zip) from Tier-2 backlog (8 tools)
- Update recommended next steps: §3.3 In-VM clone now prioritized (§6.6 prerequisite met)

Next: §3.3 In-VM Git Clone implementation can now proceed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 20:49:20 +02:00
Simone 971d3dc6e9 feat(template): Add Step 11 Tier-1 Toolchain — Git + 7-Zip installation
Implement §6.6 minimal viable product: install Git for Windows and 7-Zip
to the template VM. Critical prerequisites for §3.3 (In-VM Git clone).

Step 11 additions:
- Git for Windows (latest LTS configurable) — silent installer, adds to PATH
- 7-Zip (latest stable configurable) — MSI installer to Program Files
- SHA256 hash pinning for both tools (currently unpinned, warn at runtime)
- Assert-Step validation for git/7z command availability
- Final pre-snapshot gate checks for both tools + cleanup of installers

Parameters added:
- -GitVersion (default: 2.47.0.windows.1)
- -SevenZipVersion (default: 24.07)

Rationale:
- Enables §3.3 in-VM Git clone (git clone directly in VM instead of host-zip-transfer)
- Supports cross-platform builds and multi-tool workflows
- Fallback from §3.2 7-Zip compression finally available in template
- Positions for future expansion of Tier-1 tools (NSIS, CMake, Node.js, WiX, etc.)

Updated documentation:
- Setup-WinBuild2025.ps1 docstring: Step 11 added to list + step ordering rationale
- Removed NOTE about Git not being installed
- Final validation now checks: 9 assertions (was 7)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 20:48:43 +02:00
Simone 914072fdd8 refactor(config): Update VMX path from CI-WinBuild to WinBuild2025
Replace all references to CI-WinBuild.vmx with WinBuild2025.vmx.
Update template path: F:\CI\Templates\WinBuild\ → F:\CI\Templates\WinBuild2025\

Files affected:
- runner/config.yaml: GITEA_CI_TEMPLATE_PATH env var
- docs: HOST-SETUP.md, WINDOWS-TEMPLATE-SETUP.md, TEST-PLAN, RUNBOOK
- scripts: Measure-CIBenchmark, Set-TemplateSharedFolders, Test-NsinnounpBuild
- TODO.md, Setup-Host.ps1, README.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 20:46:36 +02:00
Simone a5719f2ac6 docs(TODO): Defer §3.4 pre-warm pool to home lab (profiling-dependent optimization)
Move pre-warm pool (maintaining 2 avviati clones) from main §3 backlog to Deferred section.
Rationale: optimization only valuable if profiling shows New-BuildVM+Wait-VMReady is
bottleneck; with 2-min builds ~40% overhead, but ~0% for 10+ min builds.

Update summary table: §3 now shows 3 done, 2 open, 1 deferred (instead of 3 open).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 20:43:14 +02:00
Simone 7e6d21678d docs(TODO): Remove §4.5 Dashboard (P3 nice-to-have)
Delete §4.5 Dashboard read-only from backlog. Already have:
- §4.1 JSONL structured logs
- §4.3 Disk space monitoring
- §4.4 Incident runbook

§4 now fully closed: 3/3 items complete (Prometheus §4.2 and Dashboard §4.5 removed).

Also mark §1, §2, §4, §5 as complete sections.
4 sections closed, 6 remaining in progress.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 20:40:26 +02:00