ai-project-manage-cli 2.0.12 → 2.0.13
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.
- package/README.md +6 -6
- package/dist/api/cli.d.ts +62 -1
- package/dist/api/cli.d.ts.map +1 -1
- package/dist/api/client.d.ts +3 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/request-config.d.ts +4 -1
- package/dist/api/request-config.d.ts.map +1 -1
- package/dist/api/request-config.js +12 -0
- package/dist/api/request-config.js.map +1 -1
- package/dist/cli/commands/deploy-backend.d.ts +7 -0
- package/dist/cli/commands/deploy-backend.d.ts.map +1 -0
- package/dist/cli/commands/deploy-backend.js +81 -0
- package/dist/cli/commands/deploy-backend.js.map +1 -0
- package/dist/cli/commands/deploy-frontend.d.ts +3 -0
- package/dist/cli/commands/deploy-frontend.d.ts.map +1 -0
- package/dist/cli/commands/deploy-frontend.js +98 -0
- package/dist/cli/commands/deploy-frontend.js.map +1 -0
- package/dist/cli/commands/get.d.ts.map +1 -1
- package/dist/cli/commands/get.js +1 -1
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/init.js +1 -1
- package/dist/cli/commands/publish.d.ts.map +1 -1
- package/dist/cli/commands/publish.js +42 -127
- package/dist/cli/commands/publish.js.map +1 -1
- package/dist/cli/commands/release.d.ts +3 -0
- package/dist/cli/commands/release.d.ts.map +1 -0
- package/dist/cli/commands/release.js +39 -0
- package/dist/cli/commands/release.js.map +1 -0
- package/dist/cli/utils/parse.d.ts +2 -0
- package/dist/cli/utils/parse.d.ts.map +1 -0
- package/dist/cli/utils/parse.js +12 -0
- package/dist/cli/utils/parse.js.map +1 -0
- package/dist/cli.js +6 -2
- package/dist/cli.js.map +1 -1
- package/dist/core/apm-config.d.ts +60 -1
- package/dist/core/apm-config.d.ts.map +1 -1
- package/dist/core/apm-config.js +111 -3
- package/dist/core/apm-config.js.map +1 -1
- package/dist/core/backend-deploy/backend-deploy-workflow.d.ts +16 -0
- package/dist/core/backend-deploy/backend-deploy-workflow.d.ts.map +1 -0
- package/dist/core/backend-deploy/backend-deploy-workflow.js +53 -0
- package/dist/core/backend-deploy/backend-deploy-workflow.js.map +1 -0
- package/dist/core/backend-deploy/image-tag.d.ts +2 -0
- package/dist/core/backend-deploy/image-tag.d.ts.map +1 -0
- package/dist/core/backend-deploy/image-tag.js +15 -0
- package/dist/core/backend-deploy/image-tag.js.map +1 -0
- package/dist/core/backend-deploy/index.d.ts +12 -0
- package/dist/core/backend-deploy/index.d.ts.map +1 -0
- package/dist/core/backend-deploy/index.js +23 -0
- package/dist/core/backend-deploy/index.js.map +1 -0
- package/dist/core/backend-deploy/local-docker-build.d.ts +11 -0
- package/dist/core/backend-deploy/local-docker-build.d.ts.map +1 -0
- package/dist/core/backend-deploy/local-docker-build.js +29 -0
- package/dist/core/backend-deploy/local-docker-build.js.map +1 -0
- package/dist/core/backend-deploy/registry-login-push.d.ts +14 -0
- package/dist/core/backend-deploy/registry-login-push.d.ts.map +1 -0
- package/dist/core/backend-deploy/registry-login-push.js +48 -0
- package/dist/core/backend-deploy/registry-login-push.js.map +1 -0
- package/dist/core/backend-deploy/remote-docker-client.d.ts +11 -0
- package/dist/core/backend-deploy/remote-docker-client.d.ts.map +1 -0
- package/dist/core/backend-deploy/remote-docker-client.js +33 -0
- package/dist/core/backend-deploy/remote-docker-client.js.map +1 -0
- package/dist/core/backend-deploy/remote-pull-image.d.ts +9 -0
- package/dist/core/backend-deploy/remote-pull-image.d.ts.map +1 -0
- package/dist/core/backend-deploy/remote-pull-image.js +39 -0
- package/dist/core/backend-deploy/remote-pull-image.js.map +1 -0
- package/dist/core/backend-deploy/resolve-dockerfile.d.ts +12 -0
- package/dist/core/backend-deploy/resolve-dockerfile.d.ts.map +1 -0
- package/dist/core/backend-deploy/resolve-dockerfile.js +33 -0
- package/dist/core/backend-deploy/resolve-dockerfile.js.map +1 -0
- package/dist/core/backend-deploy/run-docker-cli.d.ts +14 -0
- package/dist/core/backend-deploy/run-docker-cli.d.ts.map +1 -0
- package/dist/core/backend-deploy/run-docker-cli.js +33 -0
- package/dist/core/backend-deploy/run-docker-cli.js.map +1 -0
- package/dist/core/backend-deploy/types.d.ts +69 -0
- package/dist/core/backend-deploy/types.d.ts.map +1 -0
- package/dist/core/backend-deploy/types.js +6 -0
- package/dist/core/backend-deploy/types.js.map +1 -0
- package/dist/core/branch-name.d.ts +8 -0
- package/dist/core/branch-name.d.ts.map +1 -0
- package/dist/core/branch-name.js +37 -0
- package/dist/core/branch-name.js.map +1 -0
- package/dist/core/cursor-cmd.d.ts.map +1 -1
- package/dist/core/cursor-cmd.js +2 -1
- package/dist/core/cursor-cmd.js.map +1 -1
- package/dist/core/minio.d.ts +35 -0
- package/dist/core/minio.d.ts.map +1 -0
- package/dist/core/minio.js +154 -0
- package/dist/core/minio.js.map +1 -0
- package/package.json +6 -5
- package/templates/skills/apm-release/SKILL.md +87 -0
|
@@ -4,40 +4,28 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.registerPublishCommands = registerPublishCommands;
|
|
7
|
-
const promises_1 = require("node:fs/promises");
|
|
8
7
|
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
-
const
|
|
8
|
+
const client_1 = __importDefault(require("../../api/client"));
|
|
10
9
|
const apm_config_1 = require("../../core/apm-config");
|
|
11
|
-
const
|
|
12
|
-
".html": "text/html; charset=utf-8",
|
|
13
|
-
".js": "application/javascript; charset=utf-8",
|
|
14
|
-
".mjs": "application/javascript; charset=utf-8",
|
|
15
|
-
".css": "text/css; charset=utf-8",
|
|
16
|
-
".json": "application/json; charset=utf-8",
|
|
17
|
-
".map": "application/json; charset=utf-8",
|
|
18
|
-
".txt": "text/plain; charset=utf-8",
|
|
19
|
-
".svg": "image/svg+xml",
|
|
20
|
-
".png": "image/png",
|
|
21
|
-
".jpg": "image/jpeg",
|
|
22
|
-
".jpeg": "image/jpeg",
|
|
23
|
-
".webp": "image/webp",
|
|
24
|
-
".gif": "image/gif",
|
|
25
|
-
".ico": "image/x-icon",
|
|
26
|
-
".woff": "font/woff",
|
|
27
|
-
".woff2": "font/woff2",
|
|
28
|
-
".ttf": "font/ttf",
|
|
29
|
-
};
|
|
30
|
-
const DEFAULT_MAX_FILE_SIZE_MB = 100;
|
|
10
|
+
const minio_1 = require("../../core/minio");
|
|
31
11
|
function registerPublishCommands(program) {
|
|
32
12
|
program
|
|
33
13
|
.command("publish")
|
|
34
14
|
.description("递归上传前端产物目录到 MinIO,并在成功后为该桶设置匿名可读策略(仅读取当前目录下 `.apm/.env` 中的 MINIO_*,已有环境变量优先)")
|
|
35
15
|
.argument("<name>", "分支名,作为对象键顶层目录")
|
|
16
|
+
.option("--env <env_tag>", "环境标签", "测试环境,正式环境")
|
|
36
17
|
.option("--dir <dir>", "产物目录(默认 dist)", "dist")
|
|
37
|
-
.option("--
|
|
18
|
+
.option("--requirement-id <requirement_id>", "需求 ID(上传成功后登记前端环境)", (v) => {
|
|
19
|
+
const n = Number.parseInt(String(v), 10);
|
|
20
|
+
if (!Number.isFinite(n) || n < 1) {
|
|
21
|
+
throw new Error("--requirement-id 须为正整数");
|
|
22
|
+
}
|
|
23
|
+
return n;
|
|
24
|
+
})
|
|
25
|
+
.option("--max-file-size-mb <mb>", `单文件大小上限,默认 ${minio_1.DEFAULT_MAX_FILE_SIZE_MB}`, (v) => Number.parseInt(String(v), 10))
|
|
38
26
|
.action(async (name, opts) => {
|
|
39
|
-
const {
|
|
40
|
-
const
|
|
27
|
+
const { frontendDeploy: settings } = (0, apm_config_1.loadApmConfig)();
|
|
28
|
+
const minio = new minio_1.MinioClient({
|
|
41
29
|
endPoint: settings.endpoint,
|
|
42
30
|
port: settings.port,
|
|
43
31
|
useSSL: settings.useSsl,
|
|
@@ -52,15 +40,14 @@ function registerPublishCommands(program) {
|
|
|
52
40
|
}
|
|
53
41
|
const cleanBranch = sanitizeBranchName(branchName);
|
|
54
42
|
const root = node_path_1.default.resolve(process.cwd(), opts.dir || "dist");
|
|
55
|
-
|
|
56
|
-
if (!rootStat || !rootStat.isDirectory()) {
|
|
43
|
+
if (!(await (0, minio_1.isDirectoryPath)(root))) {
|
|
57
44
|
console.error(`产物目录不存在:${root}`);
|
|
58
45
|
process.exit(1);
|
|
59
46
|
}
|
|
60
47
|
const maxBytes = Math.max(1, Number.isFinite(opts.maxFileSizeMb)
|
|
61
|
-
? Math.floor((opts.maxFileSizeMb ?? DEFAULT_MAX_FILE_SIZE_MB) * 1024 * 1024)
|
|
62
|
-
: DEFAULT_MAX_FILE_SIZE_MB * 1024 * 1024);
|
|
63
|
-
const files = await collectFiles(root);
|
|
48
|
+
? Math.floor((opts.maxFileSizeMb ?? minio_1.DEFAULT_MAX_FILE_SIZE_MB) * 1024 * 1024)
|
|
49
|
+
: minio_1.DEFAULT_MAX_FILE_SIZE_MB * 1024 * 1024);
|
|
50
|
+
const files = await (0, minio_1.collectFiles)(root);
|
|
64
51
|
if (files.length === 0) {
|
|
65
52
|
console.error(`目录为空:${root}`);
|
|
66
53
|
process.exit(1);
|
|
@@ -68,23 +55,23 @@ function registerPublishCommands(program) {
|
|
|
68
55
|
let uploaded = 0;
|
|
69
56
|
let totalBytes = 0;
|
|
70
57
|
console.error(`开始直连 MinIO 上传,共 ${files.length} 个文件…`);
|
|
71
|
-
await ensureBucket(
|
|
58
|
+
await minio.ensureBucket(bucket);
|
|
72
59
|
// 只清理与上传目录对应的对象前缀,避免误删同一分支下其它目录内容
|
|
73
|
-
await deleteObjectsByPrefix(
|
|
60
|
+
await minio.deleteObjectsByPrefix(bucket, `${cleanBranch}/dist/`);
|
|
74
61
|
for (const f of files) {
|
|
75
62
|
if (f.size > maxBytes) {
|
|
76
|
-
console.error(`文件过大,已拒绝:${f.relativePath}(${toMB(f.size)}MB > ${toMB(maxBytes)}MB)`);
|
|
63
|
+
console.error(`文件过大,已拒绝:${f.relativePath}(${(0, minio_1.toMB)(f.size)}MB > ${(0, minio_1.toMB)(maxBytes)}MB)`);
|
|
77
64
|
process.exit(1);
|
|
78
65
|
}
|
|
79
|
-
const buf = await (0,
|
|
80
|
-
const cleanRel = sanitizeRelativePath(f.relativePath);
|
|
81
|
-
const objectKey = toArtifactObjectKey({
|
|
66
|
+
const buf = await (0, minio_1.readArtifactFile)(f.absPath);
|
|
67
|
+
const cleanRel = (0, minio_1.sanitizeRelativePath)(f.relativePath);
|
|
68
|
+
const objectKey = (0, minio_1.toArtifactObjectKey)({
|
|
82
69
|
branchName: cleanBranch,
|
|
83
70
|
relativePath: cleanRel,
|
|
84
71
|
});
|
|
85
|
-
const mimeType = detectMimeType(f.relativePath).trim().toLowerCase() ||
|
|
72
|
+
const mimeType = (0, minio_1.detectMimeType)(f.relativePath).trim().toLowerCase() ||
|
|
86
73
|
"application/octet-stream";
|
|
87
|
-
await
|
|
74
|
+
await minio.putObject(bucket, objectKey, buf, {
|
|
88
75
|
"Content-Type": mimeType,
|
|
89
76
|
});
|
|
90
77
|
uploaded += 1;
|
|
@@ -92,7 +79,7 @@ function registerPublishCommands(program) {
|
|
|
92
79
|
console.error(`[${uploaded}/${files.length}] ${f.relativePath} -> ${objectKey}`);
|
|
93
80
|
}
|
|
94
81
|
console.error("正在设置桶策略(匿名可读对象,便于 HTTP 直链)…");
|
|
95
|
-
await setBucketPublicRead(
|
|
82
|
+
await minio.setBucketPublicRead(bucket);
|
|
96
83
|
console.log(JSON.stringify({
|
|
97
84
|
ok: true,
|
|
98
85
|
branchName: cleanBranch,
|
|
@@ -101,57 +88,16 @@ function registerPublishCommands(program) {
|
|
|
101
88
|
totalBytes,
|
|
102
89
|
bucketPublicRead: true,
|
|
103
90
|
}, null, 2));
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
/** 匿名可读桶内所有对象(仅 s3:GetObject),用于路径直链 */
|
|
113
|
-
function buildPublicReadPolicy(bucket) {
|
|
114
|
-
const policy = {
|
|
115
|
-
Version: "2012-10-17",
|
|
116
|
-
Statement: [
|
|
117
|
-
{
|
|
118
|
-
Effect: "Allow",
|
|
119
|
-
Principal: { AWS: ["*"] },
|
|
120
|
-
Action: ["s3:GetObject"],
|
|
121
|
-
Resource: [`arn:aws:s3:::${bucket}/*`],
|
|
122
|
-
},
|
|
123
|
-
],
|
|
124
|
-
};
|
|
125
|
-
return JSON.stringify(policy);
|
|
126
|
-
}
|
|
127
|
-
async function setBucketPublicRead(client, bucket) {
|
|
128
|
-
await client.setBucketPolicy(bucket, buildPublicReadPolicy(bucket));
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* minio 默认 listObjectsV2 每页最多 1000 条,单页 XML 在 fast-xml-parser 中会触发
|
|
132
|
-
* Entity expansion limit exceeded。用 listObjectsV2Query 缩小每页条数并分页列举。
|
|
133
|
-
*/
|
|
134
|
-
const LIST_OBJECTS_PAGE_MAX_KEYS = 500;
|
|
135
|
-
async function deleteObjectsByPrefix(client, bucket, prefix) {
|
|
136
|
-
let continuationToken = "";
|
|
137
|
-
const removeBatchSize = 1000;
|
|
138
|
-
for (;;) {
|
|
139
|
-
const result = await client.listObjectsV2Query(bucket, prefix, continuationToken, "", LIST_OBJECTS_PAGE_MAX_KEYS, "");
|
|
140
|
-
const keys = result.objects
|
|
141
|
-
.map((obj) => ("name" in obj && obj.name ? obj.name.trim() : ""))
|
|
142
|
-
.filter((name) => name.length > 0);
|
|
143
|
-
for (let i = 0; i < keys.length; i += removeBatchSize) {
|
|
144
|
-
await client.removeObjects(bucket, keys.slice(i, i + removeBatchSize));
|
|
91
|
+
const envTag = resolveEnvTag(opts.env ?? "测试环境");
|
|
92
|
+
if (opts.requirementId) {
|
|
93
|
+
await client_1.default.cli.resourceEnvironmentCreate({
|
|
94
|
+
requirementId: opts.requirementId,
|
|
95
|
+
name: cleanBranch,
|
|
96
|
+
tag: envTag,
|
|
97
|
+
type: "FRONTEND",
|
|
98
|
+
});
|
|
145
99
|
}
|
|
146
|
-
|
|
147
|
-
break;
|
|
148
|
-
continuationToken = result.nextContinuationToken ?? "";
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
function toArtifactObjectKey(input) {
|
|
152
|
-
return `${input.branchName}/dist/${input.relativePath}`
|
|
153
|
-
.replace(/\/+/g, "/")
|
|
154
|
-
.replace(/^\//, "");
|
|
100
|
+
});
|
|
155
101
|
}
|
|
156
102
|
function sanitizeBranchName(raw) {
|
|
157
103
|
const normalized = raw.replace(/\\/g, "/").replace(/^\/+/, "").trim();
|
|
@@ -164,38 +110,6 @@ function sanitizeBranchName(raw) {
|
|
|
164
110
|
}
|
|
165
111
|
return segs[segs.length - 1] ?? "";
|
|
166
112
|
}
|
|
167
|
-
function sanitizeRelativePath(raw) {
|
|
168
|
-
const normalized = raw.replace(/\\/g, "/").replace(/^\/+/, "").trim();
|
|
169
|
-
if (!normalized) {
|
|
170
|
-
throw new Error("relativePath 不能为空");
|
|
171
|
-
}
|
|
172
|
-
const segs = normalized.split("/");
|
|
173
|
-
if (segs.some((s) => s === "" || s === "." || s === "..")) {
|
|
174
|
-
throw new Error("relativePath 非法");
|
|
175
|
-
}
|
|
176
|
-
return segs.join("/");
|
|
177
|
-
}
|
|
178
|
-
async function collectFiles(rootDir) {
|
|
179
|
-
const out = [];
|
|
180
|
-
await walk(rootDir, rootDir, out);
|
|
181
|
-
out.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
|
|
182
|
-
return out;
|
|
183
|
-
}
|
|
184
|
-
async function walk(rootDir, currentDir, out) {
|
|
185
|
-
const entries = await (0, promises_1.readdir)(currentDir, { withFileTypes: true });
|
|
186
|
-
for (const ent of entries) {
|
|
187
|
-
const absPath = node_path_1.default.join(currentDir, ent.name);
|
|
188
|
-
if (ent.isDirectory()) {
|
|
189
|
-
await walk(rootDir, absPath, out);
|
|
190
|
-
continue;
|
|
191
|
-
}
|
|
192
|
-
if (!ent.isFile())
|
|
193
|
-
continue;
|
|
194
|
-
const st = await (0, promises_1.stat)(absPath);
|
|
195
|
-
const rel = node_path_1.default.relative(rootDir, absPath).split(node_path_1.default.sep).join("/");
|
|
196
|
-
out.push({ absPath, relativePath: rel, size: st.size });
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
113
|
function normalizeBranchName(raw) {
|
|
200
114
|
const normalized = raw.trim().replace(/\\/g, "/").replace(/^\/+/, "");
|
|
201
115
|
if (!normalized)
|
|
@@ -205,11 +119,12 @@ function normalizeBranchName(raw) {
|
|
|
205
119
|
return "";
|
|
206
120
|
return segs[segs.length - 1] ?? "";
|
|
207
121
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
122
|
+
/** `--env` 默认含逗号时取第一段作为标签(如「测试环境」) */
|
|
123
|
+
function resolveEnvTag(raw) {
|
|
124
|
+
const parts = raw
|
|
125
|
+
.split(",")
|
|
126
|
+
.map((s) => s.trim())
|
|
127
|
+
.filter((s) => s.length > 0);
|
|
128
|
+
return parts[0] ?? "测试环境";
|
|
214
129
|
}
|
|
215
130
|
//# sourceMappingURL=publish.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/cli/commands/publish.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/cli/commands/publish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/release.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqC9D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerReleaseCommands = registerReleaseCommands;
|
|
7
|
+
const client_1 = __importDefault(require("../../api/client"));
|
|
8
|
+
function parsePositiveInt(value, name) {
|
|
9
|
+
const n = Number.parseInt(value, 10);
|
|
10
|
+
if (!Number.isFinite(n) || n < 1) {
|
|
11
|
+
throw new Error(`无效的${name}: ${value}`);
|
|
12
|
+
}
|
|
13
|
+
return n;
|
|
14
|
+
}
|
|
15
|
+
function registerReleaseCommands(program) {
|
|
16
|
+
program
|
|
17
|
+
.command("release")
|
|
18
|
+
.description("测试通过:需求进入待上线并创建 PR(与飞书「测试通过」一致);使用 -f / --force 时另对该 PR 执行 squash 合并")
|
|
19
|
+
.argument("<requirementId>", "需求主键 ID")
|
|
20
|
+
.option("-f, --force", "创建 PR 后合并(squash)")
|
|
21
|
+
.requiredOption("-b, --branch <name>", "必填:仅对该分支名对应的开发者创建/合并 PR,或标记失败时指定同一开发分支")
|
|
22
|
+
.option("-r, --reason <reason>", "带有该参数表示上线流程失败,并给出失败原因,一般是合并代码出现冲突了(须与 -b 同用)")
|
|
23
|
+
.action(async (requirementIdStr, opts) => {
|
|
24
|
+
const id = parsePositiveInt(requirementIdStr, "需求 ID");
|
|
25
|
+
const branchName = opts.branch.trim();
|
|
26
|
+
if (!branchName) {
|
|
27
|
+
throw new Error("无效的 -b:分支名不能为空");
|
|
28
|
+
}
|
|
29
|
+
const reason = opts.reason?.trim();
|
|
30
|
+
await client_1.default.cli.resourceRequirementRelease({
|
|
31
|
+
id,
|
|
32
|
+
forceMerge: Boolean(opts.force),
|
|
33
|
+
branchName,
|
|
34
|
+
failureReason: reason,
|
|
35
|
+
});
|
|
36
|
+
console.log("操作完成");
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../../src/cli/commands/release.ts"],"names":[],"mappings":";;;;;AAWA,0DAqCC;AA/CD,8DAAmC;AAEnC,SAAS,gBAAgB,CAAC,KAAa,EAAE,IAAY;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAgB,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CACV,sEAAsE,CACvE;SACA,QAAQ,CAAC,iBAAiB,EAAE,SAAS,CAAC;SACtC,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAAC;SAC1C,cAAc,CACb,qBAAqB,EACrB,wCAAwC,CACzC;SACA,MAAM,CACL,uBAAuB,EACvB,8CAA8C,CAC/C;SACA,MAAM,CACL,KAAK,EACH,gBAAwB,EACxB,IAA0D,EAC1D,EAAE;QACF,MAAM,EAAE,GAAG,gBAAgB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QAEnC,MAAM,gBAAG,CAAC,GAAG,CAAC,0BAA0B,CAAC;YACvC,EAAE;YACF,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAC/B,UAAU;YACV,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CACF,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/parse.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,MAAO,MAAM,KAAG,MAM5C,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parsePositiveInt = void 0;
|
|
4
|
+
const parsePositiveInt = (v) => {
|
|
5
|
+
const n = Number.parseInt(String(v), 10);
|
|
6
|
+
if (!Number.isFinite(n) || n < 1) {
|
|
7
|
+
throw new Error("--requirement-id 须为正整数");
|
|
8
|
+
}
|
|
9
|
+
return n;
|
|
10
|
+
};
|
|
11
|
+
exports.parsePositiveInt = parsePositiveInt;
|
|
12
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/cli/utils/parse.ts"],"names":[],"mappings":";;;AAAO,MAAM,gBAAgB,GAAG,CAAC,CAAS,EAAU,EAAE;IACpD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AANW,QAAA,gBAAgB,oBAM3B"}
|
package/dist/cli.js
CHANGED
|
@@ -6,7 +6,9 @@ const auth_1 = require("./cli/commands/auth");
|
|
|
6
6
|
const config_1 = require("./cli/commands/config");
|
|
7
7
|
const get_1 = require("./cli/commands/get");
|
|
8
8
|
const init_1 = require("./cli/commands/init");
|
|
9
|
-
const
|
|
9
|
+
const deploy_backend_1 = require("./cli/commands/deploy-backend");
|
|
10
|
+
const deploy_frontend_1 = require("./cli/commands/deploy-frontend");
|
|
11
|
+
const release_1 = require("./cli/commands/release");
|
|
10
12
|
const set_1 = require("./cli/commands/set");
|
|
11
13
|
const status_1 = require("./cli/commands/status");
|
|
12
14
|
const update_1 = require("./cli/commands/update");
|
|
@@ -24,7 +26,9 @@ const program = new commander_1.Command()
|
|
|
24
26
|
(0, ws_1.registerWsCommands)(program);
|
|
25
27
|
(0, update_1.registerUpdateCommands)(program);
|
|
26
28
|
(0, init_1.registerInitCommands)(program);
|
|
27
|
-
(0,
|
|
29
|
+
(0, deploy_frontend_1.registerDeployFrontendCommands)(program);
|
|
30
|
+
(0, deploy_backend_1.registerDeployBackendCommands)(program);
|
|
31
|
+
(0, release_1.registerReleaseCommands)(program);
|
|
28
32
|
program.parseAsync(process.argv).catch((err) => {
|
|
29
33
|
console.error(err);
|
|
30
34
|
process.exit(1);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,8CAA2D;AAC3D,kDAA+D;AAC/D,4CAAyD;AACzD,8CAA2D;AAC3D,oDAAiE;AACjE,4CAAyD;AACzD,kDAA+D;AAC/D,kDAA+D;AAC/D,0CAAuD;AACvD,gDAAwE;AAExE,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE;KAC1B,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,+BAAmB,CAAC;KAChC,OAAO,CAAC,2BAAe,CAAC,CAAC;AAE5B,IAAA,+BAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,2BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,yBAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,yBAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,+BAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,uBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,+BAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,2BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,iCAAuB,EAAC,OAAO,CAAC,CAAC;AAEjC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,8CAA2D;AAC3D,kDAA+D;AAC/D,4CAAyD;AACzD,8CAA2D;AAC3D,kEAA8E;AAC9E,oEAAgF;AAChF,oDAAiE;AACjE,4CAAyD;AACzD,kDAA+D;AAC/D,kDAA+D;AAC/D,0CAAuD;AACvD,gDAAwE;AAExE,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE;KAC1B,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,+BAAmB,CAAC;KAChC,OAAO,CAAC,2BAAe,CAAC,CAAC;AAE5B,IAAA,+BAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,2BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,yBAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,yBAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,+BAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,uBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,+BAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,2BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,gDAA8B,EAAC,OAAO,CAAC,CAAC;AACxC,IAAA,8CAA6B,EAAC,OAAO,CAAC,CAAC;AACvC,IAAA,iCAAuB,EAAC,OAAO,CAAC,CAAC;AAEjC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1,3 +1,31 @@
|
|
|
1
|
+
/** 后端镜像部署(`apm deploy-backend`),连接信息放在此节,由你在 `.apm/apm.config.json` 中填写 */
|
|
2
|
+
export type ApmBackendDeploy = {
|
|
3
|
+
registryHost: string;
|
|
4
|
+
registryUser: string;
|
|
5
|
+
registryPassword: string;
|
|
6
|
+
remoteHost: string;
|
|
7
|
+
remotePort: number;
|
|
8
|
+
remoteProtocol: "https" | "http";
|
|
9
|
+
/** 可选;空字符串表示未配置 */
|
|
10
|
+
caPath?: string;
|
|
11
|
+
certPath?: string;
|
|
12
|
+
keyPath?: string;
|
|
13
|
+
/** 远程 pull 的 registry serveraddress;空则使用 `https://{registryHost}` */
|
|
14
|
+
remotePullServeraddress?: string;
|
|
15
|
+
/** 空则使用 registryUser */
|
|
16
|
+
remotePullUser?: string;
|
|
17
|
+
/** 空则使用 registryPassword */
|
|
18
|
+
remotePullPassword?: string;
|
|
19
|
+
/**
|
|
20
|
+
* 镜像仓库完整路径(**不含 tag**),与后续容器名一致时仅 tag 不同。
|
|
21
|
+
* 例:registry.cn-hangzhou.aliyuncs.com/my-ns/my-service
|
|
22
|
+
*/
|
|
23
|
+
imageRepository: string;
|
|
24
|
+
/**
|
|
25
|
+
* 与镜像对应的容器名;空则使用 imageRepository 路径最后一段(与镜像「短名」一致)。
|
|
26
|
+
*/
|
|
27
|
+
containerName?: string;
|
|
28
|
+
};
|
|
1
29
|
export type ApmConfig = {
|
|
2
30
|
auth: {
|
|
3
31
|
id: number;
|
|
@@ -7,7 +35,8 @@ export type ApmConfig = {
|
|
|
7
35
|
url: string;
|
|
8
36
|
wsPort: number;
|
|
9
37
|
};
|
|
10
|
-
deploy
|
|
38
|
+
/** 前端发布(MinIO 等),与 `apm deploy-frontend` 一致;服务端 `/cli/variables/get` 同步此节 */
|
|
39
|
+
frontendDeploy: {
|
|
11
40
|
endpoint: string;
|
|
12
41
|
port: number;
|
|
13
42
|
useSsl: boolean;
|
|
@@ -15,6 +44,36 @@ export type ApmConfig = {
|
|
|
15
44
|
accessKey: string;
|
|
16
45
|
secretKey: string;
|
|
17
46
|
};
|
|
47
|
+
/** 缺省时在解析时与默认合并 */
|
|
48
|
+
backendDeploy?: ApmBackendDeploy;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* 读取并校验 `apm.config.json` 中的 `backendDeploy`,供 `deploy-backend` 使用。
|
|
52
|
+
* 必填项缺失或非法时抛出带说明的 Error。
|
|
53
|
+
*/
|
|
54
|
+
export declare function resolveBackendDeployFromApmConfig(cfg: ApmConfig): {
|
|
55
|
+
registry: {
|
|
56
|
+
registryHost: string;
|
|
57
|
+
username: string;
|
|
58
|
+
password: string;
|
|
59
|
+
};
|
|
60
|
+
remoteDocker: {
|
|
61
|
+
host: string;
|
|
62
|
+
port: number;
|
|
63
|
+
protocol: "https" | "http";
|
|
64
|
+
caPath?: string;
|
|
65
|
+
certPath?: string;
|
|
66
|
+
keyPath?: string;
|
|
67
|
+
};
|
|
68
|
+
remotePullAuth: {
|
|
69
|
+
username: string;
|
|
70
|
+
password: string;
|
|
71
|
+
serveraddress: string;
|
|
72
|
+
};
|
|
73
|
+
/** 不含 tag,如 registry.cn-xxx.aliyuncs.com/ns/app */
|
|
74
|
+
imageRepository: string;
|
|
75
|
+
/** 与镜像短名一致,供后续 docker run --name 等使用 */
|
|
76
|
+
containerName: string;
|
|
18
77
|
};
|
|
19
78
|
export declare function loadApmConfig(): ApmConfig;
|
|
20
79
|
export declare function syncApmConfig(options: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apm-config.d.ts","sourceRoot":"","sources":["../../src/core/apm-config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE;QAEJ,EAAE,EAAE,MAAM,CAAC;QAEX,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE;QAEN,GAAG,EAAE,MAAM,CAAC;QAEZ,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,
|
|
1
|
+
{"version":3,"file":"apm-config.d.ts","sourceRoot":"","sources":["../../src/core/apm-config.ts"],"names":[],"mappings":"AAKA,2EAA2E;AAC3E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,wBAAwB;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4BAA4B;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE;QAEJ,EAAE,EAAE,MAAM,CAAC;QAEX,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE;QAEN,GAAG,EAAE,MAAM,CAAC;QAEZ,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,6EAA6E;IAC7E,cAAc,EAAE;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,mBAAmB;IACnB,aAAa,CAAC,EAAE,gBAAgB,CAAC;CAClC,CAAC;AAkBF;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,SAAS,GAAG;IACjE,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,YAAY,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,cAAc,EAAE;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;CACvB,CAkGA;AAoBD,wBAAgB,aAAa,IAAI,SAAS,CAazC;AAGD,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,iBAYxE;AAMD,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,QAKzC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,QA4BpE"}
|
package/dist/core/apm-config.js
CHANGED
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resolveBackendDeployFromApmConfig = resolveBackendDeployFromApmConfig;
|
|
6
7
|
exports.loadApmConfig = loadApmConfig;
|
|
7
8
|
exports.syncApmConfig = syncApmConfig;
|
|
8
9
|
exports.isApmConfigExists = isApmConfigExists;
|
|
@@ -12,14 +13,120 @@ const node_path_1 = __importDefault(require("node:path"));
|
|
|
12
13
|
const node_fs_1 = require("node:fs");
|
|
13
14
|
const node_process_1 = require("node:process");
|
|
14
15
|
const client_1 = __importDefault(require("../api/client"));
|
|
16
|
+
const DEFAULT_BACKEND_DEPLOY = {
|
|
17
|
+
registryHost: "",
|
|
18
|
+
registryUser: "",
|
|
19
|
+
registryPassword: "",
|
|
20
|
+
remoteHost: "",
|
|
21
|
+
remotePort: 2376,
|
|
22
|
+
remoteProtocol: "https",
|
|
23
|
+
caPath: "",
|
|
24
|
+
certPath: "",
|
|
25
|
+
keyPath: "",
|
|
26
|
+
remotePullServeraddress: "",
|
|
27
|
+
remotePullUser: "",
|
|
28
|
+
remotePullPassword: "",
|
|
29
|
+
imageRepository: "",
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* 读取并校验 `apm.config.json` 中的 `backendDeploy`,供 `deploy-backend` 使用。
|
|
33
|
+
* 必填项缺失或非法时抛出带说明的 Error。
|
|
34
|
+
*/
|
|
35
|
+
function resolveBackendDeployFromApmConfig(cfg) {
|
|
36
|
+
const b = { ...DEFAULT_BACKEND_DEPLOY, ...cfg.backendDeploy };
|
|
37
|
+
const registryHost = b.registryHost.trim();
|
|
38
|
+
const registryUser = b.registryUser.trim();
|
|
39
|
+
const registryPassword = b.registryPassword.trim();
|
|
40
|
+
const remoteHost = b.remoteHost.trim();
|
|
41
|
+
if (!registryHost) {
|
|
42
|
+
throw new Error("请在 .apm/apm.config.json 的 backendDeploy.registryHost 中配置镜像仓库主机名");
|
|
43
|
+
}
|
|
44
|
+
if (!registryUser) {
|
|
45
|
+
throw new Error("请在 .apm/apm.config.json 的 backendDeploy.registryUser 中配置 Registry 用户名");
|
|
46
|
+
}
|
|
47
|
+
if (!registryPassword) {
|
|
48
|
+
throw new Error("请在 .apm/apm.config.json 的 backendDeploy.registryPassword 中配置 Registry 密码");
|
|
49
|
+
}
|
|
50
|
+
if (!remoteHost) {
|
|
51
|
+
throw new Error("请在 .apm/apm.config.json 的 backendDeploy.remoteHost 中配置远程 Docker 地址");
|
|
52
|
+
}
|
|
53
|
+
const remotePort = Number(b.remotePort);
|
|
54
|
+
if (!Number.isFinite(remotePort) ||
|
|
55
|
+
remotePort < 1 ||
|
|
56
|
+
remotePort > 65535) {
|
|
57
|
+
throw new Error("请在 .apm/apm.config.json 的 backendDeploy.remotePort 中配置合法端口(1–65535)");
|
|
58
|
+
}
|
|
59
|
+
const protocol = b.remoteProtocol === "http"
|
|
60
|
+
? "http"
|
|
61
|
+
: b.remoteProtocol === "https"
|
|
62
|
+
? "https"
|
|
63
|
+
: (() => {
|
|
64
|
+
throw new Error("backendDeploy.remoteProtocol 仅支持 https 或 http");
|
|
65
|
+
})();
|
|
66
|
+
const trimOrUndef = (s) => {
|
|
67
|
+
const t = (s ?? "").trim();
|
|
68
|
+
return t.length > 0 ? t : undefined;
|
|
69
|
+
};
|
|
70
|
+
const remotePullServeraddress = trimOrUndef(b.remotePullServeraddress) ??
|
|
71
|
+
`https://${registryHost}`;
|
|
72
|
+
const remotePullUser = trimOrUndef(b.remotePullUser) ?? registryUser;
|
|
73
|
+
const remotePullPassword = trimOrUndef(b.remotePullPassword) ?? registryPassword;
|
|
74
|
+
const imageRepository = b.imageRepository.trim();
|
|
75
|
+
if (!imageRepository) {
|
|
76
|
+
throw new Error("请在 .apm/apm.config.json 的 backendDeploy.imageRepository 中配置镜像名(完整仓库路径,不含 tag)");
|
|
77
|
+
}
|
|
78
|
+
if (imageRepository.includes(":")) {
|
|
79
|
+
throw new Error("backendDeploy.imageRepository 不应包含 tag(不能出现 ':'),tag 由 `apm deploy-backend` 的位置参数 `<name>` 指定");
|
|
80
|
+
}
|
|
81
|
+
const containerName = trimOrUndef(b.containerName) ?? repositoryBaseName(imageRepository);
|
|
82
|
+
return {
|
|
83
|
+
registry: {
|
|
84
|
+
registryHost,
|
|
85
|
+
username: registryUser,
|
|
86
|
+
password: registryPassword,
|
|
87
|
+
},
|
|
88
|
+
remoteDocker: {
|
|
89
|
+
host: remoteHost,
|
|
90
|
+
port: remotePort,
|
|
91
|
+
protocol,
|
|
92
|
+
caPath: trimOrUndef(b.caPath),
|
|
93
|
+
certPath: trimOrUndef(b.certPath),
|
|
94
|
+
keyPath: trimOrUndef(b.keyPath),
|
|
95
|
+
},
|
|
96
|
+
remotePullAuth: {
|
|
97
|
+
username: remotePullUser,
|
|
98
|
+
password: remotePullPassword,
|
|
99
|
+
serveraddress: remotePullServeraddress,
|
|
100
|
+
},
|
|
101
|
+
imageRepository,
|
|
102
|
+
containerName,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function repositoryBaseName(imageRepositoryWithoutTag) {
|
|
106
|
+
const s = imageRepositoryWithoutTag.trim();
|
|
107
|
+
const i = s.lastIndexOf("/");
|
|
108
|
+
return i >= 0 ? s.slice(i + 1) : s;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 将历史键名 `deploy` 迁到 `frontendDeploy`(读入后删除旧键,下次写回即为新协议)。
|
|
112
|
+
*/
|
|
113
|
+
function migrateLegacyDeployKeyInPlace(raw) {
|
|
114
|
+
if (raw.frontendDeploy === undefined && raw.deploy !== undefined) {
|
|
115
|
+
raw.frontendDeploy = raw.deploy;
|
|
116
|
+
}
|
|
117
|
+
if (raw.deploy !== undefined) {
|
|
118
|
+
delete raw.deploy;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
15
121
|
function loadApmConfig() {
|
|
16
122
|
try {
|
|
17
123
|
const p = getApmConfigPath();
|
|
18
124
|
if (!(0, node_fs_1.existsSync)(p)) {
|
|
19
125
|
createApmConfig({ id: 0 });
|
|
20
126
|
}
|
|
21
|
-
const
|
|
22
|
-
|
|
127
|
+
const raw = JSON.parse((0, node_fs_1.readFileSync)(p, "utf8"));
|
|
128
|
+
migrateLegacyDeployKeyInPlace(raw);
|
|
129
|
+
return raw;
|
|
23
130
|
}
|
|
24
131
|
catch (e) {
|
|
25
132
|
console.error(e);
|
|
@@ -69,7 +176,7 @@ function createApmConfig(options) {
|
|
|
69
176
|
url: options.url || "http://localhost:3000",
|
|
70
177
|
wsPort: 4000,
|
|
71
178
|
},
|
|
72
|
-
|
|
179
|
+
frontendDeploy: {
|
|
73
180
|
endpoint: "",
|
|
74
181
|
port: 0,
|
|
75
182
|
useSsl: false,
|
|
@@ -77,6 +184,7 @@ function createApmConfig(options) {
|
|
|
77
184
|
accessKey: "",
|
|
78
185
|
secretKey: "",
|
|
79
186
|
},
|
|
187
|
+
backendDeploy: DEFAULT_BACKEND_DEPLOY,
|
|
80
188
|
}, null, 2));
|
|
81
189
|
}
|
|
82
190
|
//# sourceMappingURL=apm-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apm-config.js","sourceRoot":"","sources":["../../src/core/apm-config.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"apm-config.js","sourceRoot":"","sources":["../../src/core/apm-config.ts"],"names":[],"mappings":"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"}
|