param( [Parameter(Mandatory = $true)] [string]$Registry, [string]$Namespace = 'iotlcm', [string]$Tag = 'latest', [string]$Username = $env:REGISTRY_USERNAME ) $ErrorActionPreference = 'Stop' $ProjectRoot = Resolve-Path (Join-Path $PSScriptRoot '..') $Password = $env:REGISTRY_PASSWORD if (-not [string]::IsNullOrWhiteSpace($Username) -and [string]::IsNullOrWhiteSpace($Password)) { throw 'REGISTRY_PASSWORD is required when REGISTRY_USERNAME is set.' } function Invoke-Docker { param( [Parameter(Mandatory = $true)] [string[]]$Arguments ) & docker @Arguments if ($LASTEXITCODE -ne 0) { throw "docker $($Arguments -join ' ') failed with exit code $LASTEXITCODE" } } $backendImage = "$Registry/$Namespace/onelink-mock-backend:$Tag" $frontendImage = "$Registry/$Namespace/onelink-mock-frontend:$Tag" Push-Location $ProjectRoot try { if (-not [string]::IsNullOrWhiteSpace($Username)) { Write-Host "Logging in to $Registry..." $Password | & docker login $Registry --username $Username --password-stdin if ($LASTEXITCODE -ne 0) { throw "docker login failed with exit code $LASTEXITCODE" } } Write-Host "Building backend image: $backendImage" Invoke-Docker @('build', '-t', $backendImage, '.') Write-Host "Pushing backend image: $backendImage" Invoke-Docker @('push', $backendImage) Push-Location (Join-Path $ProjectRoot 'frontend') try { Write-Host "Building frontend image: $frontendImage" Invoke-Docker @('build', '-t', $frontendImage, '.') Write-Host "Pushing frontend image: $frontendImage" Invoke-Docker @('push', $frontendImage) } finally { Pop-Location } Write-Host 'Image build and push completed.' -ForegroundColor Green Write-Host " $backendImage" Write-Host " $frontendImage" } finally { Pop-Location }