param( [ValidateSet('local', 'dev', 'development', 'test', 'production')] [string]$Environment, [ValidateSet('cn', 'overseas')] [string]$Region = 'cn', [string]$ServerAddr = '127.0.0.1:8848', [string]$Group = 'BAIYUE', [string]$Namespace ) $ErrorActionPreference = 'Stop' $projectRoot = Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path) if ($Environment -eq 'local') { if ($Namespace -and $Namespace -ne 'public') { throw 'local 环境只能发布到 public namespace' } $Namespace = 'public' $configProfile = 'local' } else { if (-not $Namespace -or $Namespace -eq 'public') { throw "$Environment/$Region 必须显式指定非 public 的 Nacos namespace" } $configProfile = $Region } $configRoot = (Resolve-Path (Join-Path $projectRoot "config\nacos\$configProfile")).Path $healthUrl = "http://$ServerAddr/nacos/v1/console/health/readiness" $publishUrl = "http://$ServerAddr/nacos/v1/cs/configs" $health = Invoke-WebRequest -UseBasicParsing -Uri $healthUrl -TimeoutSec 5 if ($health.StatusCode -ne 200 -or $health.Content.Trim() -ne 'OK') { throw "Nacos not ready: $healthUrl" } $files = Get-ChildItem -LiteralPath $configRoot -File -Filter '*.yml' | Sort-Object Name if ($files.Count -eq 0) { throw "No Nacos configuration found: $configRoot" } $published = 0 foreach ($file in $files) { $resolvedFile = (Resolve-Path -LiteralPath $file.FullName).Path if (-not $resolvedFile.StartsWith($configRoot, [System.StringComparison]::OrdinalIgnoreCase)) { throw "Unexpected config path: $resolvedFile" } $body = @{ dataId = $file.Name group = $Group content = Get-Content -LiteralPath $resolvedFile -Raw -Encoding UTF8 type = 'yaml' } if ($Namespace -ne 'public') { $body.tenant = $Namespace } $pairs = foreach ($entry in $body.GetEnumerator()) { [uri]::EscapeDataString([string]$entry.Key) + '=' + [uri]::EscapeDataString([string]$entry.Value) } $result = Invoke-RestMethod -Method Post -Uri $publishUrl ` -ContentType 'application/x-www-form-urlencoded; charset=UTF-8' ` -Body ($pairs -join '&') -TimeoutSec 10 if ([string]$result -ne 'true') { throw "Publish failed: $($file.Name), Nacos response: $result" } $published++ Write-Host "Published $($file.Name) -> $Namespace / $Group" } Write-Host "Published $Environment/$Region Nacos configuration: $published items."