param( [ValidateSet('test')][string]$Environment = 'test', [Parameter(Mandatory)][string]$ServerAddr, [string]$Group = 'BAIYUE', [Parameter(Mandatory)][string]$Namespace, [string]$Username = $env:NACOS_USERNAME, [string]$Password = $env:NACOS_PASSWORD, [switch]$DryRun ) $ErrorActionPreference = 'Stop' if ([string]::IsNullOrWhiteSpace($Namespace) -or $Namespace -eq 'public') { throw 'Supply the actual TEST Namespace ID, not public or a display name' } $projectRoot = Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path) $configRoot = Join-Path $projectRoot 'config/nacos/test' $files = Get-ChildItem -LiteralPath $configRoot -File -Filter '*.yml' | Sort-Object @{Expression={if ($_.Name -eq 'baiyue-common.yml') {0} else {1}}}, Name if ($files.Count -ne 14) { throw 'Expected common configuration and 13 retained services' } if ($DryRun) { $files | ForEach-Object { Write-Host "Would publish $($_.Name) -> $Namespace / $Group" }; return } if (-not $Username -or -not $Password) { throw 'NACOS_USERNAME and NACOS_PASSWORD are required' } $base = "http://$ServerAddr/nacos" $login = Invoke-RestMethod -Method Post -Uri "$base/v1/auth/login" -Body @{username=$Username; password=$Password} -TimeoutSec 10 if (-not $login.accessToken) { throw 'Nacos authentication failed' } foreach ($file in $files) { $body = @{dataId=$file.Name; group=$Group; tenant=$Namespace; type='yaml'; content=(Get-Content -LiteralPath $file.FullName -Raw -Encoding UTF8); accessToken=$login.accessToken} $pairs = foreach ($entry in $body.GetEnumerator()) { [uri]::EscapeDataString([string]$entry.Key) + '=' + [uri]::EscapeDataString([string]$entry.Value) } $result = Invoke-RestMethod -Method Post -Uri "$base/v1/cs/configs" -ContentType 'application/x-www-form-urlencoded; charset=UTF-8' -Body ($pairs -join '&') -TimeoutSec 10 if ([string]$result -ne 'true') { throw "Publish failed: $($file.Name)" } Write-Host "Published $($file.Name) -> $Namespace / $Group" }