816a15503e
Implements Phase A3 of plans/implementation-plan-A-B.md:
- commands/vm.py: vm new (replaces New-BuildVM.ps1)
- commands/build.py: build run (replaces Invoke-RemoteBuild.ps1) with WinRM/SSH dispatch and stdout streaming for act_runner
- commands/artifacts.py: artifacts collect (replaces Get-BuildArtifacts.ps1) using transport.fetch()
- 3 PS scripts reduced to shims preserving \0
- Pester tests/{New-BuildVM,Wait-VMReady,Remove-BuildVM}.Tests.ps1 removed; equivalent cases covered in pytest
- Phase C hook: build/artifacts accept opaque VmHandle/vmx; no Windows path assumptions
Tests: 91 pytest, ruff clean, mypy --strict clean, coverage 78.27% (>=70 gate).
Master checklist + step A3 attivita + 'definizione di fatto' updated; A3-closeout.md added.
92 lines
3.4 KiB
PowerShell
92 lines
3.4 KiB
PowerShell
#Requires -Version 5.1
|
|
Set-StrictMode -Version Latest
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
# Shim: delegates to the Python ci_orchestrator CLI (`build run`).
|
|
# Original PS implementation moved to git history; see plans/A3-closeout.md.
|
|
#
|
|
# Typed parameters (`[PSCredential]`, `[hashtable]`, `[switch]`) cannot cross
|
|
# a process boundary as-is; this shim translates them. Credentials are pulled
|
|
# inside Python via keyring (`--credential-target`), so the bound `-Credential`
|
|
# is intentionally discarded — callers should set `-CredentialTarget` instead
|
|
# (or rely on the default `BuildVMGuest` resolved by the Python CLI).
|
|
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory)]
|
|
[string] $IPAddress,
|
|
|
|
[Parameter()]
|
|
[System.Management.Automation.PSCredential] $Credential,
|
|
|
|
[string] $HostSourceDir = '',
|
|
[string] $CloneUrl = '',
|
|
[string] $CloneBranch = 'main',
|
|
[string] $CloneCommit = '',
|
|
[switch] $CloneSubmodules,
|
|
[string] $GiteaCredentialTarget = 'GiteaPAT',
|
|
[string] $Configuration = 'Release',
|
|
[string] $BuildCommand = '',
|
|
[string] $GuestArtifactSource = 'dist',
|
|
[string] $GuestWorkDir = 'C:\CI\build',
|
|
[string] $GuestArtifactZip = 'C:\CI\output\artifacts.zip',
|
|
[switch] $UseSharedCache,
|
|
[switch] $SkipArtifact,
|
|
|
|
[ValidateSet('Windows', 'Linux')]
|
|
[string] $GuestOS = 'Windows',
|
|
|
|
[string] $SshKeyPath = 'F:\CI\keys\ci_linux',
|
|
[string] $SshUser = 'ci_build',
|
|
[string] $SshKnownHostsFile = '',
|
|
[string] $GuestLinuxWorkDir = '/opt/ci/build',
|
|
[string] $GuestLinuxOutputDir = '/opt/ci/output',
|
|
|
|
[hashtable] $ExtraGuestEnv = @{},
|
|
|
|
# Optional override for the Credential Manager target (overrides any
|
|
# fallback resolved by Python). Discards $Credential.
|
|
[string] $CredentialTarget = ''
|
|
)
|
|
|
|
$pyArgs = @(
|
|
'--ip-address', $IPAddress,
|
|
'--guest-os', $GuestOS.ToLower(),
|
|
'--ssh-user', $SshUser,
|
|
'--ssh-key-path', $SshKeyPath,
|
|
'--clone-branch', $CloneBranch,
|
|
'--gitea-credential-target', $GiteaCredentialTarget,
|
|
'--configuration', $Configuration,
|
|
'--guest-work-dir', $GuestWorkDir,
|
|
'--guest-artifact-zip', $GuestArtifactZip,
|
|
'--guest-linux-work-dir', $GuestLinuxWorkDir,
|
|
'--guest-linux-output-dir', $GuestLinuxOutputDir,
|
|
'--guest-artifact-source', $GuestArtifactSource
|
|
)
|
|
|
|
if ($HostSourceDir) { $pyArgs += @('--host-source-dir', $HostSourceDir) }
|
|
if ($CloneUrl) { $pyArgs += @('--clone-url', $CloneUrl) }
|
|
if ($CloneCommit) { $pyArgs += @('--clone-commit', $CloneCommit) }
|
|
if ($BuildCommand) { $pyArgs += @('--build-command', $BuildCommand) }
|
|
if ($SshKnownHostsFile) { $pyArgs += @('--ssh-known-hosts-file', $SshKnownHostsFile) }
|
|
if ($CredentialTarget) { $pyArgs += @('--credential-target', $CredentialTarget) }
|
|
|
|
if ($CloneSubmodules.IsPresent) { $pyArgs += '--clone-submodules' }
|
|
if ($UseSharedCache.IsPresent) { $pyArgs += '--use-shared-cache' }
|
|
if ($SkipArtifact.IsPresent) { $pyArgs += '--skip-artifact' }
|
|
|
|
if ($ExtraGuestEnv -and $ExtraGuestEnv.Count -gt 0) {
|
|
foreach ($key in $ExtraGuestEnv.Keys) {
|
|
$pyArgs += @('--extra-env', "$key=$($ExtraGuestEnv[$key])")
|
|
}
|
|
}
|
|
|
|
if ($Credential) {
|
|
Write-Host '[Invoke-RemoteBuild] -Credential ignored; Python CLI uses keyring (set -CredentialTarget to override target name).'
|
|
}
|
|
|
|
$venvPython = $env:CI_VENV_PYTHON
|
|
if (-not $venvPython) { $venvPython = 'F:\CI\python\venv\Scripts\python.exe' }
|
|
& $venvPython -m ci_orchestrator build run @pyArgs
|
|
exit $LASTEXITCODE
|