feat(GVSDServiceServer): 新增 Venom 一键重建+重新声明脚本

- rebuild-venom.ps1:npm run build 后自动调 /api/sub/declare-page/,主服务器登记入口同时清空该产品资源缓存,重建产物立即生效(无需等 24h)

- 声明端点支持请求体传 ApiKey/Secret(缺省回落环境变量),便于脚本按次传凭据
This commit is contained in:
TermiNexus committed 2026-10-07 17:48:14 +08:00
1 parent 8d98abe231
commit f812413de5
2 files changed
+84 -4

No files matched your search

+9 -4
View File
@@ -100,18 +100,23 @@ class VenomRemoteEntryView(APIView):
class DeclarePageView(APIView):
"""用「产品 API Key + 密钥」调用主服务器,声明本产品定制页的远端入口
POST /api/sub/declare-page/ {RemoteEntry?, RemoteModule?}
POST /api/sub/declare-page/ {ApiKey?, Secret?, RemoteEntry?, RemoteModule?}
—— 先 Ping 验证鉴权,再 DeclareCustomPage 登记远端入口。
凭据优先取请求体(便于 rebuild-venom.ps1 一键重建+声明时按次传入),
缺省回落到本服务环境变量(SUBSCRIPTION_API_KEY / SUBSCRIPTION_SECRET)。
主服务器登记入口的同时会清空该产品的资源缓存,故重新声明 = 重建产物立即生效。
"""
def post(self, request):
from gvsdsdk.subscription import SubscriptionClient, SubscriptionClientError
api_key = settings.SUBSCRIPTION_API_KEY
secret = settings.SUBSCRIPTION_SECRET
api_key = (request.data.get('ApiKey') or settings.SUBSCRIPTION_API_KEY or '').strip()
secret = (request.data.get('Secret') or settings.SUBSCRIPTION_SECRET or '').strip()
if not api_key or not secret:
return Response(
_err('未配置 SUBSCRIPTION_API_KEY / SUBSCRIPTION_SECRET(请用环境变量注入)', 500),
_err('缺少订阅凭据:请在请求体传 ApiKey/Secret,或注入环境变量 '
'SUBSCRIPTION_API_KEY / SUBSCRIPTION_SECRET', 500),
status=500,
)
+75
View File
@@ -0,0 +1,75 @@
# Venom custom page: one-click rebuild + redeclare
#
# IMPORTANT: keep this file pure ASCII. PS 5.1 parses BOM-less UTF-8 files using the
# ANSI codepage, so non-ASCII text would be garbled (same rule as GERP/deploy.ps1).
#
# What it does:
# 1. npm run build in venom_ui -> dist/venom-entry.js (served by GVSDServiceServer)
# 2. POST /api/sub/declare-page/ with the product credentials -> the master server
# re-registers the remote entry AND purges that product's remote-asset cache,
# so the new bundle takes effect immediately (no 24h TTL wait).
#
# Usage:
# .\rebuild-venom.ps1 # creds from env
# .\rebuild-venom.ps1 -ApiKey <key> -Secret <secret> # creds as params
# .\rebuild-venom.ps1 -SkipDeclare # build only
#
# Env fallback: SUBSCRIPTION_API_KEY / SUBSCRIPTION_SECRET
param(
[string]$ApiKey = '',
[string]$Secret = '',
[string]$ServiceBase = 'http://127.0.0.1:25090',
[string]$RemoteEntry = '',
[switch]$SkipDeclare = $false
)
$ErrorActionPreference = 'Stop'
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$EffectiveApiKey = if ($ApiKey) { $ApiKey } else { $env:SUBSCRIPTION_API_KEY }
$EffectiveSecret = if ($Secret) { $Secret } else { $env:SUBSCRIPTION_SECRET }
Write-Host ''
Write-Host '===== VENOM REBUILD START =====' -ForegroundColor Cyan
# 1. Build the remote entry bundle
Write-Host '[1/2] npm run build (venom_ui)...' -ForegroundColor Yellow
Push-Location (Join-Path $ScriptDir 'venom_ui')
try {
npm run build
if ($LASTEXITCODE -ne 0) { throw "venom_ui build failed (exit $LASTEXITCODE)" }
} finally {
Pop-Location
}
Write-Host ' build OK -> venom_ui/dist/venom-entry.js' -ForegroundColor Green
if ($SkipDeclare) {
Write-Host ' declare skipped (-SkipDeclare): master cache NOT purged' -ForegroundColor Yellow
Write-Host '===== VENOM REBUILD DONE (build only) =====' -ForegroundColor Cyan
return
}
# 2. Redeclare -> master re-registers the entry and purges this product's asset cache
if (-not $EffectiveApiKey -or -not $EffectiveSecret) {
Write-Host ' missing credentials: pass -ApiKey/-Secret or set SUBSCRIPTION_API_KEY / SUBSCRIPTION_SECRET' -ForegroundColor Yellow
Write-Host ' declare skipped -> master keeps serving the cached (old) bundle until TTL expires' -ForegroundColor Yellow
Write-Host '===== VENOM REBUILD DONE (build only) =====' -ForegroundColor Cyan
return
}
Write-Host '[2/2] declare custom page (purges master cache)...' -ForegroundColor Yellow
$payload = @{ ApiKey = $EffectiveApiKey; Secret = $EffectiveSecret }
if ($RemoteEntry) { $payload.RemoteEntry = $RemoteEntry }
$json = $payload | ConvertTo-Json -Compress
try {
$resp = Invoke-RestMethod -Method Post -Uri "$ServiceBase/api/sub/declare-page/" `
-ContentType 'application/json' -Body $json -TimeoutSec 60
Write-Host (' declare OK -> ' + ($resp | ConvertTo-Json -Compress -Depth 6)) -ForegroundColor Green
} catch {
throw "declare failed: $_ (is GVSDServiceServer running on $ServiceBase ?)"
}
Write-Host ''
Write-Host '===== VENOM REBUILD DONE =====' -ForegroundColor Cyan
Write-Host 'Hard-refresh the browser (Ctrl+F5) to pick up the new bundle.' -ForegroundColor Cyan