Widen scratch iteration 011 with fixture-backed integrations QA
This commit is contained in:
@@ -13,13 +13,16 @@
|
||||
Only build Docker images (skip infra start and .NET build).
|
||||
.PARAMETER SkipImages
|
||||
Skip Docker image builds.
|
||||
.PARAMETER QaIntegrationFixtures
|
||||
Start the optional Harbor and GitHub App QA fixtures used for successful Integrations Hub onboarding checks.
|
||||
#>
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[switch]$SkipBuild,
|
||||
[switch]$InfraOnly,
|
||||
[switch]$ImagesOnly,
|
||||
[switch]$SkipImages
|
||||
[switch]$SkipImages,
|
||||
[switch]$QaIntegrationFixtures
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
@@ -391,7 +394,7 @@ function Test-Prerequisites {
|
||||
# ─── 2. Check and install hosts file ─────────────────────────────────────
|
||||
|
||||
function Test-HostsFile {
|
||||
Write-Step 'Checking hosts file for stella-ops.local entries'
|
||||
Write-Step 'Checking hosts file for required Stella Ops entries'
|
||||
$hostsPath = 'C:\Windows\System32\drivers\etc\hosts'
|
||||
$hostsSource = Join-Path $Root 'devops/compose/hosts.stellaops.local'
|
||||
|
||||
@@ -400,20 +403,49 @@ function Test-HostsFile {
|
||||
return
|
||||
}
|
||||
|
||||
$content = Get-Content $hostsPath -Raw
|
||||
if ($content -match 'stella-ops\.local') {
|
||||
Write-Ok 'stella-ops.local entries found in hosts file'
|
||||
return
|
||||
}
|
||||
|
||||
Write-Warn 'stella-ops.local entries NOT found in hosts file.'
|
||||
|
||||
if (-not (Test-Path $hostsSource)) {
|
||||
Write-Warn "Hosts source file not found at $hostsSource"
|
||||
Write-Host ' Add the hosts block from docs/dev/DEV_ENVIRONMENT_SETUP.md section 2' -ForegroundColor Yellow
|
||||
return
|
||||
}
|
||||
|
||||
$content = Get-Content $hostsPath -Raw
|
||||
$sourceLines = Get-Content $hostsSource | Where-Object {
|
||||
$trimmed = $_.Trim()
|
||||
$trimmed -and -not $trimmed.StartsWith('#')
|
||||
}
|
||||
|
||||
$missingLines = @()
|
||||
$missingHosts = @()
|
||||
foreach ($line in $sourceLines) {
|
||||
$tokens = $line -split '\s+' | Where-Object { $_ }
|
||||
if ($tokens.Count -lt 2) {
|
||||
continue
|
||||
}
|
||||
|
||||
$hostnames = $tokens | Select-Object -Skip 1
|
||||
$lineMissing = $false
|
||||
foreach ($hostname in $hostnames) {
|
||||
$escapedHostname = [regex]::Escape($hostname)
|
||||
if ($content -notmatch "(?m)(^|\s)$escapedHostname($|\s)") {
|
||||
$missingHosts += $hostname
|
||||
$lineMissing = $true
|
||||
}
|
||||
}
|
||||
|
||||
if ($lineMissing) {
|
||||
$missingLines += $line
|
||||
}
|
||||
}
|
||||
|
||||
if ($missingHosts.Count -eq 0) {
|
||||
Write-Ok 'All required Stella Ops host entries are present in the hosts file'
|
||||
return
|
||||
}
|
||||
|
||||
$missingHosts = $missingHosts | Sort-Object -Unique
|
||||
Write-Warn "Missing Stella Ops host aliases: $([string]::Join(', ', $missingHosts))"
|
||||
|
||||
# Check if running as Administrator
|
||||
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
||||
|
||||
@@ -424,9 +456,9 @@ function Test-HostsFile {
|
||||
Write-Host ''
|
||||
$answer = Read-Host ' Add entries to hosts file now? (Y/n)'
|
||||
if ($answer -eq '' -or $answer -match '^[Yy]') {
|
||||
$hostsBlock = Get-Content $hostsSource -Raw
|
||||
Add-Content -Path $hostsPath -Value "`n$hostsBlock"
|
||||
Write-Ok 'Hosts entries added successfully'
|
||||
Add-Content -Path $hostsPath -Value ''
|
||||
Add-Content -Path $hostsPath -Value ($missingLines -join [Environment]::NewLine)
|
||||
Write-Ok "Added $($missingLines.Count) missing host entry line(s) successfully"
|
||||
} else {
|
||||
Write-Warn 'Skipped. Add them manually before accessing the platform.'
|
||||
Write-Host " Copy from: $hostsSource" -ForegroundColor Yellow
|
||||
@@ -597,6 +629,27 @@ function Start-Platform {
|
||||
-restartAfterSeconds 45)
|
||||
}
|
||||
|
||||
function Start-QaIntegrationFixtures {
|
||||
Write-Step 'Starting QA integration fixtures'
|
||||
Push-Location $ComposeDir
|
||||
try {
|
||||
docker compose -f docker-compose.integration-fixtures.yml up -d
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Fail 'Failed to start QA integration fixtures.'
|
||||
exit 1
|
||||
}
|
||||
|
||||
[void](Wait-ForComposeConvergence `
|
||||
-composeFiles @('docker-compose.integration-fixtures.yml') `
|
||||
-successMessage 'QA integration fixtures are healthy' `
|
||||
-maxWaitSeconds 90 `
|
||||
-restartAfterSeconds 30)
|
||||
}
|
||||
finally {
|
||||
Pop-Location
|
||||
}
|
||||
}
|
||||
|
||||
function Test-ExpectedHttpStatus([string]$url, [int[]]$allowedStatusCodes, [int]$timeoutSeconds = 5, [int]$attempts = 6, [int]$retryDelaySeconds = 2) {
|
||||
for ($attempt = 1; $attempt -le $attempts; $attempt++) {
|
||||
$statusCode = $null
|
||||
@@ -770,6 +823,24 @@ function Test-Smoke {
|
||||
$hasBlockingFailures = $true
|
||||
}
|
||||
|
||||
if ($QaIntegrationFixtures) {
|
||||
$harborFixtureStatus = Test-ExpectedHttpStatus 'http://127.1.1.6/api/v2.0/health' @(200)
|
||||
if ($null -ne $harborFixtureStatus) {
|
||||
Write-Ok "Harbor QA fixture (HTTP $harborFixtureStatus)"
|
||||
} else {
|
||||
Write-Fail 'Harbor QA fixture did not respond with HTTP 200 on /api/v2.0/health'
|
||||
$hasBlockingFailures = $true
|
||||
}
|
||||
|
||||
$githubFixtureStatus = Test-ExpectedHttpStatus 'http://127.1.1.7/api/v3/app' @(200)
|
||||
if ($null -ne $githubFixtureStatus) {
|
||||
Write-Ok "GitHub App QA fixture (HTTP $githubFixtureStatus)"
|
||||
} else {
|
||||
Write-Fail 'GitHub App QA fixture did not respond with HTTP 200 on /api/v3/app'
|
||||
$hasBlockingFailures = $true
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $InfraOnly) {
|
||||
if (Test-FrontdoorBootstrap) {
|
||||
Write-Ok 'Frontdoor bootstrap path is ready for first-user sign-in'
|
||||
@@ -794,8 +865,15 @@ function Test-Smoke {
|
||||
@('docker-compose.stella-ops.yml')
|
||||
}
|
||||
|
||||
if ($QaIntegrationFixtures) {
|
||||
$composeFiles += 'docker-compose.integration-fixtures.yml'
|
||||
}
|
||||
|
||||
if (-not ($composeFiles | Where-Object { Test-Path $_ })) {
|
||||
$composeFiles = @('docker-compose.dev.yml', 'docker-compose.stella-ops.yml')
|
||||
if ($QaIntegrationFixtures) {
|
||||
$composeFiles += 'docker-compose.integration-fixtures.yml'
|
||||
}
|
||||
}
|
||||
|
||||
$totalContainers = 0
|
||||
@@ -902,6 +980,9 @@ Initialize-EnvFile
|
||||
|
||||
if ($InfraOnly) {
|
||||
Start-Infrastructure
|
||||
if ($QaIntegrationFixtures) {
|
||||
Start-QaIntegrationFixtures
|
||||
}
|
||||
$infraSmokeFailed = Test-Smoke
|
||||
if ($infraSmokeFailed) {
|
||||
Write-Fail 'Infrastructure setup did not pass blocking smoke tests. Review output and docker compose logs.'
|
||||
@@ -920,6 +1001,9 @@ if (-not $SkipImages) {
|
||||
}
|
||||
|
||||
Start-Platform
|
||||
if ($QaIntegrationFixtures) {
|
||||
Start-QaIntegrationFixtures
|
||||
}
|
||||
$platformSmokeFailed = Test-Smoke
|
||||
if ($platformSmokeFailed) {
|
||||
Write-Fail 'Setup did not pass blocking smoke tests. Review output and docker compose logs.'
|
||||
@@ -929,6 +1013,10 @@ if ($platformSmokeFailed) {
|
||||
Write-Host "`n=============================================" -ForegroundColor Green
|
||||
Write-Host ' Setup complete!' -ForegroundColor Green
|
||||
Write-Host ' Platform: https://stella-ops.local' -ForegroundColor Green
|
||||
if ($QaIntegrationFixtures) {
|
||||
Write-Host ' Harbor QA fixture: http://harbor-fixture.stella-ops.local/api/v2.0/health' -ForegroundColor Green
|
||||
Write-Host ' GitHub App QA fixture: http://github-app-fixture.stella-ops.local/api/v3/app' -ForegroundColor Green
|
||||
}
|
||||
Write-Host ' Docs: docs/dev/DEV_ENVIRONMENT_SETUP.md' -ForegroundColor Green
|
||||
Write-Host '=============================================' -ForegroundColor Green
|
||||
exit 0
|
||||
|
||||
Reference in New Issue
Block a user