@ranger1/dx 0.1.108 → 0.1.110
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -16,6 +16,36 @@ function requirePositiveInteger(value, fieldPath) {
|
|
|
16
16
|
return parsed
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
function requireEnvName(value, fieldPath) {
|
|
20
|
+
const name = requireString(value, fieldPath)
|
|
21
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
|
|
22
|
+
throw new Error(`缺少必填配置: ${fieldPath}`)
|
|
23
|
+
}
|
|
24
|
+
return name
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function resolveHealthCheckEndpoint(healthCheckConfig) {
|
|
28
|
+
if (healthCheckConfig.url != null) {
|
|
29
|
+
const url = requireString(healthCheckConfig.url, 'verify.healthCheck.url')
|
|
30
|
+
try {
|
|
31
|
+
new URL(url)
|
|
32
|
+
} catch {
|
|
33
|
+
throw new Error(`缺少必填配置: verify.healthCheck.url`)
|
|
34
|
+
}
|
|
35
|
+
return { url }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (healthCheckConfig.envPort != null) {
|
|
39
|
+
const rawPath = healthCheckConfig.path == null ? '/health' : requireString(healthCheckConfig.path, 'verify.healthCheck.path')
|
|
40
|
+
return {
|
|
41
|
+
envPort: requireEnvName(healthCheckConfig.envPort, 'verify.healthCheck.envPort'),
|
|
42
|
+
path: rawPath.startsWith('/') ? rawPath : `/${rawPath}`,
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
throw new Error(`缺少必填配置: verify.healthCheck.url`)
|
|
47
|
+
}
|
|
48
|
+
|
|
19
49
|
function resolveVerifyConfig(verifyConfig = {}) {
|
|
20
50
|
const healthCheckConfig = verifyConfig?.healthCheck
|
|
21
51
|
if (healthCheckConfig == null) {
|
|
@@ -24,16 +54,9 @@ function resolveVerifyConfig(verifyConfig = {}) {
|
|
|
24
54
|
}
|
|
25
55
|
}
|
|
26
56
|
|
|
27
|
-
const url = requireString(healthCheckConfig.url, 'verify.healthCheck.url')
|
|
28
|
-
try {
|
|
29
|
-
new URL(url)
|
|
30
|
-
} catch {
|
|
31
|
-
throw new Error(`缺少必填配置: verify.healthCheck.url`)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
57
|
return {
|
|
35
58
|
healthCheck: {
|
|
36
|
-
|
|
59
|
+
...resolveHealthCheckEndpoint(healthCheckConfig),
|
|
37
60
|
timeoutSeconds:
|
|
38
61
|
healthCheckConfig.timeoutSeconds == null
|
|
39
62
|
? 10
|
|
@@ -32,6 +32,8 @@ export function buildRemoteDeployScript(phaseModel = []) {
|
|
|
32
32
|
const shouldMigrate = deploy.prismaMigrateDeploy !== false && deploy.skipMigration !== true
|
|
33
33
|
const shouldSeed = deploy.prismaSeed === true
|
|
34
34
|
const healthCheckUrl = healthCheck?.url ? String(healthCheck.url) : ''
|
|
35
|
+
const healthCheckEnvPort = healthCheck?.envPort ? String(healthCheck.envPort) : ''
|
|
36
|
+
const healthCheckPath = healthCheck?.path ? String(healthCheck.path) : ''
|
|
35
37
|
const healthCheckTimeoutSeconds = Number(healthCheck?.timeoutSeconds || 10)
|
|
36
38
|
const healthCheckMaxWaitSeconds = Number(healthCheck?.maxWaitSeconds || 24)
|
|
37
39
|
const healthCheckRetryIntervalSeconds = Number(healthCheck?.retryIntervalSeconds || 2)
|
|
@@ -57,6 +59,8 @@ START_MODE=${escapeShell(startupMode)}
|
|
|
57
59
|
SERVICE_NAME=${escapeShell(serviceName)}
|
|
58
60
|
START_ENTRY=${escapeShell(startupEntry)}
|
|
59
61
|
HEALTHCHECK_URL=${escapeShell(healthCheckUrl)}
|
|
62
|
+
HEALTHCHECK_ENV_PORT=${escapeShell(healthCheckEnvPort)}
|
|
63
|
+
HEALTHCHECK_PATH=${escapeShell(healthCheckPath)}
|
|
60
64
|
HEALTHCHECK_TIMEOUT_SECONDS=${healthCheckTimeoutSeconds}
|
|
61
65
|
HEALTHCHECK_MAX_WAIT_SECONDS=${healthCheckMaxWaitSeconds}
|
|
62
66
|
HEALTHCHECK_RETRY_DELAY_SECONDS=${healthCheckRetryIntervalSeconds}
|
|
@@ -226,6 +230,34 @@ read_pm2_status() {
|
|
|
226
230
|
' "$SERVICE_NAME"
|
|
227
231
|
}
|
|
228
232
|
|
|
233
|
+
resolve_healthcheck_url() {
|
|
234
|
+
if [[ -n "$HEALTHCHECK_URL" ]]; then
|
|
235
|
+
printf '%s\n' "$HEALTHCHECK_URL"
|
|
236
|
+
return
|
|
237
|
+
fi
|
|
238
|
+
|
|
239
|
+
if [[ -z "$HEALTHCHECK_ENV_PORT" ]]; then
|
|
240
|
+
return
|
|
241
|
+
fi
|
|
242
|
+
|
|
243
|
+
local healthcheck_port
|
|
244
|
+
healthcheck_port="$(run_with_env "$CURRENT_LINK" env | awk -F= -v key="$HEALTHCHECK_ENV_PORT" '$1 == key { print substr($0, index($0, "=") + 1); exit }')"
|
|
245
|
+
if ! [[ "$healthcheck_port" =~ ^[0-9]+$ ]]; then
|
|
246
|
+
echo "health check port env $HEALTHCHECK_ENV_PORT is missing or invalid" >&2
|
|
247
|
+
exit 1
|
|
248
|
+
fi
|
|
249
|
+
|
|
250
|
+
if [[ -z "$HEALTHCHECK_PATH" ]]; then
|
|
251
|
+
HEALTHCHECK_PATH="/health"
|
|
252
|
+
fi
|
|
253
|
+
if [[ "$HEALTHCHECK_PATH" != /* ]]; then
|
|
254
|
+
HEALTHCHECK_PATH="/$HEALTHCHECK_PATH"
|
|
255
|
+
fi
|
|
256
|
+
|
|
257
|
+
HEALTHCHECK_URL="http://127.0.0.1:\${healthcheck_port}\${HEALTHCHECK_PATH}"
|
|
258
|
+
printf '%s\n' "$HEALTHCHECK_URL"
|
|
259
|
+
}
|
|
260
|
+
|
|
229
261
|
build_summary_json() {
|
|
230
262
|
local release_name="$1"
|
|
231
263
|
local current_release_path="$2"
|
|
@@ -436,6 +468,8 @@ if [[ "$START_MODE" == "pm2" ]]; then
|
|
|
436
468
|
fi
|
|
437
469
|
fi
|
|
438
470
|
|
|
471
|
+
HEALTHCHECK_URL="$(resolve_healthcheck_url)"
|
|
472
|
+
|
|
439
473
|
if [[ -n "$HEALTHCHECK_URL" ]]; then
|
|
440
474
|
healthcheck_started_at="$(date +%s)"
|
|
441
475
|
until curl -fsS --max-time "$HEALTHCHECK_TIMEOUT_SECONDS" "$HEALTHCHECK_URL" >/dev/null; do
|
package/lib/vercel-deploy.js
CHANGED
|
@@ -38,10 +38,10 @@ const TARGET_CONFIGS = {
|
|
|
38
38
|
|
|
39
39
|
const ALLOWED_DEPLOY_MODES = ['prebuilt']
|
|
40
40
|
|
|
41
|
-
const
|
|
42
|
-
development: 'dev',
|
|
43
|
-
staging: 'staging',
|
|
44
|
-
production: 'prod'
|
|
41
|
+
const DX_ENV_FLAG_MAP = {
|
|
42
|
+
development: '--dev',
|
|
43
|
+
staging: '--staging',
|
|
44
|
+
production: '--prod'
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
const VERCEL_PROJECT_LINK_PATH = '.vercel/project.json'
|
|
@@ -351,8 +351,7 @@ export async function deployToVercel(target, options = {}) {
|
|
|
351
351
|
// - 前置构建/生成(shared/contracts/backend 等)应由项目自己的 Nx 依赖图或 Vercel buildCommand 负责。
|
|
352
352
|
// - 这样 dx deploy 能兼容不同 monorepo 布局(不强依赖 apps/sdk 等目录)。
|
|
353
353
|
|
|
354
|
-
|
|
355
|
-
const buildEnv = APP_ENV_MAP[environment]
|
|
354
|
+
const dxEnvFlag = DX_ENV_FLAG_MAP[environment]
|
|
356
355
|
|
|
357
356
|
for (const t of targets) {
|
|
358
357
|
const targetConfig = getTargetConfig(t)
|
|
@@ -425,7 +424,10 @@ export async function deployToVercel(target, options = {}) {
|
|
|
425
424
|
const envVars = {
|
|
426
425
|
...process.env,
|
|
427
426
|
VERCEL_PROJECT_ID: projectId,
|
|
428
|
-
APP_ENV:
|
|
427
|
+
APP_ENV: environment,
|
|
428
|
+
NEXT_PUBLIC_APP_ENV: environment,
|
|
429
|
+
VITE_APP_ENV: environment,
|
|
430
|
+
DX_ENV_FLAG: dxEnvFlag,
|
|
429
431
|
NODE_ENV: envManager.mapAppEnvToNodeEnv(environment),
|
|
430
432
|
VERCEL_ORG_ID: orgId
|
|
431
433
|
}
|