69 lines
2.4 KiB
PowerShell
69 lines
2.4 KiB
PowerShell
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."
|