ci / 质量门禁 (push) Canceled after 0s
背景:本地 PG/Redis 已按要求复用 docker-postgres-1 / docker-redis-1; S3 容器按用户要求删除,后续接入公网自建 RustFS。 改动: - 删除 infra/docker-compose.dev.yaml、infra/compose.dev.yaml - 移除 compose:up / compose:down 脚本,改用 check:dev 预检本机 PG/Redis - 新增 scripts/check-dev-deps.mjs;.env.example 的 S3_* 改为待填 - README / AGENTS / A0 报告同步本地依赖与对象存储说明 影响面:本地开发依赖与 CI 本地脚本、环境变量样例、文档。 回滚方式:恢复被删除的两个 compose 文件与 package.json 脚本即可。 验证:format:check、lint、pnpm ci:local(含 e2e 4/4)全部通过,用时 106.3s。
68 lines
2.1 KiB
JavaScript
68 lines
2.1 KiB
JavaScript
#!/usr/bin/env node
|
||
/**
|
||
* 检查本地已有依赖是否可连接:PostgreSQL(DATABASE_URL)与 Redis(REDIS_URL)。
|
||
* 仓库不再启动任何数据库/缓存容器;依赖由本机 Docker 服务提供。
|
||
*/
|
||
import { createConnection } from 'node:net';
|
||
import { loadEnvFile } from 'node:process';
|
||
|
||
// Node 24 支持 process.loadEnvFile;两个文件都不存在时忽略。
|
||
for (const file of ['.env.local', '.env']) {
|
||
try {
|
||
loadEnvFile(file);
|
||
} catch {
|
||
// 文件不存在时跳过。
|
||
}
|
||
}
|
||
|
||
const targets = [
|
||
{ name: 'PostgreSQL', value: process.env.DATABASE_URL, fallbackPort: 5432 },
|
||
{ name: 'Redis', value: process.env.REDIS_URL, fallbackPort: 6379 },
|
||
];
|
||
|
||
function parseTarget({ name, value, fallbackPort }) {
|
||
if (!value) {
|
||
throw new Error(`${name} 未配置连接串`);
|
||
}
|
||
const url = new URL(value);
|
||
return {
|
||
name,
|
||
host: url.hostname,
|
||
port: Number(url.port || fallbackPort),
|
||
database: url.pathname.replace(/^\//, '') || undefined,
|
||
};
|
||
}
|
||
|
||
function probe({ name, host, port, database }) {
|
||
return new Promise((resolve, reject) => {
|
||
const socket = createConnection({ host, port });
|
||
const timer = setTimeout(() => {
|
||
socket.destroy();
|
||
reject(new Error(`${name} 连接超时:${host}:${port}`));
|
||
}, 3_000);
|
||
|
||
socket.once('connect', () => {
|
||
clearTimeout(timer);
|
||
socket.end();
|
||
const suffix = database ? `/${database}` : '';
|
||
resolve(`${name} 可用:${host}:${port}${suffix}`);
|
||
});
|
||
socket.once('error', (error) => {
|
||
clearTimeout(timer);
|
||
reject(new Error(`${name} 不可用:${host}:${port}(${error.message})`));
|
||
});
|
||
});
|
||
}
|
||
|
||
try {
|
||
for (const target of targets) {
|
||
const info = await probe(parseTarget(target));
|
||
console.log(`✓ ${info}`);
|
||
}
|
||
console.log('本地依赖检查通过(PostgreSQL / Redis 使用本机已有 Docker 服务)。');
|
||
} catch (error) {
|
||
console.error(`✗ ${error instanceof Error ? error.message : String(error)}`);
|
||
console.error('请确认 docker-postgres-1(5432)与 docker-redis-1(6379)已启动。');
|
||
process.exit(1);
|
||
}
|