552eb628b7
Sprint 4 — qualità codice: - scripts/_Common.psm1: New-CISessionOption, Resolve-VmrunPath, Invoke-Vmrun - PSScriptAnalyzerSettings.psd1: project-wide PSSA rules (security + formatting) - Remove-BuildVM.ps1: SupportsShouldProcess (-WhatIf support) - Invoke-RemoteBuild.ps1, Get-BuildArtifacts.ps1: use New-CISessionOption from module - New-BuildVM.ps1: use Resolve-VmrunPath + Invoke-Vmrun from module Sprint 5 — affidabilità: - Backup-CITemplate.ps1: stop runner, timestamped VMDK backup, prune old, restart - Watch-RunnerHealth.ps1: auto-restart act_runner, cooldown 3/h, EventLog + webhook - Register-CIScheduledTasks.ps1: add CI-RunnerHealth task (every 15 min) Sprint 6 — perf baseline: - Set-TemplateSharedFolders.ps1: idempotent VMX editor for NuGet/pip shared folders - Invoke-RemoteBuild.ps1: -UseSharedCache injects NUGET_PACKAGES + PIP_CACHE_DIR in guest - Measure-CIBenchmark.ps1: times clone/start/IP/WinRM/destroy, appends to benchmark.jsonl Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
104 lines
3.0 KiB
PowerShell
104 lines
3.0 KiB
PowerShell
#Requires -Version 5.1
|
|
<#
|
|
.SYNOPSIS
|
|
Creates a linked clone of the template VM for an ephemeral CI build.
|
|
|
|
.DESCRIPTION
|
|
Uses vmrun.exe to create a linked clone from a frozen template snapshot.
|
|
Returns the full path to the new clone's .vmx file on success.
|
|
The template VM and its snapshot are never modified.
|
|
|
|
.PARAMETER TemplatePath
|
|
Full path to the template VM's .vmx file.
|
|
Example: F:\CI\Templates\WinBuild\WinBuild.vmx
|
|
|
|
.PARAMETER SnapshotName
|
|
Name of the snapshot on the template VM to clone from.
|
|
Default: BaseClean
|
|
|
|
.PARAMETER CloneBaseDir
|
|
Directory under which the new clone folder will be created.
|
|
The clone folder is named after the job ID and timestamp.
|
|
Example: F:\CI\BuildVMs
|
|
|
|
.PARAMETER JobId
|
|
Unique identifier for the CI job (e.g. run ID from Gitea Actions).
|
|
Used to name the clone: Clone_{JobId}_{yyyyMMdd_HHmmss}
|
|
|
|
.PARAMETER VmrunPath
|
|
Full path to vmrun.exe.
|
|
Default: C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe
|
|
|
|
.OUTPUTS
|
|
[string] Full path to the new clone's .vmx file.
|
|
|
|
.EXAMPLE
|
|
$vmxPath = .\New-BuildVM.ps1 `
|
|
-TemplatePath "F:\CI\Templates\WinBuild\WinBuild.vmx" `
|
|
-CloneBaseDir "F:\CI\BuildVMs" `
|
|
-JobId "run-42"
|
|
#>
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory)]
|
|
[ValidateScript({ Test-Path $_ -PathType Leaf })]
|
|
[string] $TemplatePath,
|
|
|
|
[string] $SnapshotName = 'BaseClean',
|
|
|
|
[Parameter(Mandatory)]
|
|
[string] $CloneBaseDir,
|
|
|
|
[Parameter(Mandatory)]
|
|
[string] $JobId,
|
|
|
|
[string] $VmrunPath = 'C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe'
|
|
)
|
|
|
|
Set-StrictMode -Version Latest
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
Import-Module (Join-Path $PSScriptRoot '_Common.psm1') -Force
|
|
|
|
Resolve-VmrunPath -VmrunPath $VmrunPath | Out-Null
|
|
|
|
# --- Build clone path ---
|
|
$timestamp = Get-Date -Format 'yyyyMMdd_HHmmss'
|
|
$cloneName = "Clone_${JobId}_${timestamp}"
|
|
$cloneDir = Join-Path $CloneBaseDir $cloneName
|
|
$cloneVmx = Join-Path $cloneDir "$cloneName.vmx"
|
|
|
|
# Ensure clone base dir exists
|
|
if (-not (Test-Path $CloneBaseDir)) {
|
|
New-Item -ItemType Directory -Path $CloneBaseDir -Force | Out-Null
|
|
}
|
|
|
|
Write-Host "[New-BuildVM] Creating linked clone..."
|
|
Write-Host " Template : $TemplatePath"
|
|
Write-Host " Snapshot : $SnapshotName"
|
|
Write-Host " Clone VMX : $cloneVmx"
|
|
|
|
$sw = [System.Diagnostics.Stopwatch]::StartNew()
|
|
|
|
$cloneResult = Invoke-Vmrun -VmrunPath $VmrunPath -Operation clone `
|
|
-Arguments @($TemplatePath, $cloneVmx, 'linked', '-snapshot', $SnapshotName)
|
|
|
|
$sw.Stop()
|
|
|
|
if ($cloneResult.ExitCode -ne 0) {
|
|
# Clean up partial clone directory if it was created
|
|
if (Test-Path $cloneDir) {
|
|
Remove-Item $cloneDir -Recurse -Force -ErrorAction SilentlyContinue
|
|
}
|
|
throw "vmrun clone failed (exit $($cloneResult.ExitCode)).`nOutput: $($cloneResult.Output)"
|
|
}
|
|
|
|
if (-not (Test-Path $cloneVmx -PathType Leaf)) {
|
|
throw "vmrun reported success but clone VMX not found at: $cloneVmx"
|
|
}
|
|
|
|
Write-Host "[New-BuildVM] Clone created in $($sw.Elapsed.TotalSeconds.ToString('F1'))s : $cloneVmx"
|
|
|
|
# Return the VMX path as output
|
|
return $cloneVmx
|