@simplysm/sd-cli 14.2.14 → 14.2.18
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/dist/commands/publish/deployment-phase.d.ts +1 -1
- package/dist/commands/publish/deployment-phase.d.ts.map +1 -1
- package/dist/commands/publish/deployment-phase.js +63 -51
- package/dist/commands/publish/deployment-phase.js.map +1 -1
- package/dist/commands/publish/npm-publisher.d.ts +13 -2
- package/dist/commands/publish/npm-publisher.d.ts.map +1 -1
- package/dist/commands/publish/npm-publisher.js +113 -11
- package/dist/commands/publish/npm-publisher.js.map +1 -1
- package/dist/commands/publish/publish-command.d.ts +2 -0
- package/dist/commands/publish/publish-command.d.ts.map +1 -1
- package/dist/commands/publish/publish-command.js +55 -9
- package/dist/commands/publish/publish-command.js.map +1 -1
- package/dist/commands/publish/version-upgrade.d.ts.map +1 -1
- package/dist/commands/publish/version-upgrade.js +0 -8
- package/dist/commands/publish/version-upgrade.js.map +1 -1
- package/dist/sd-cli-entry.d.ts.map +1 -1
- package/dist/sd-cli-entry.js +5 -0
- package/dist/sd-cli-entry.js.map +1 -1
- package/package.json +5 -5
- package/src/commands/publish/deployment-phase.ts +89 -48
- package/src/commands/publish/npm-publisher.ts +131 -13
- package/src/commands/publish/publish-command.ts +63 -9
- package/src/commands/publish/version-upgrade.ts +0 -14
- package/src/sd-cli-entry.ts +5 -0
- package/tests/commands/deployment-phase.acc.spec.ts +148 -11
- package/tests/commands/npm-publisher.acc.spec.ts +360 -0
- package/tests/commands/version-upgrade.acc.spec.ts +0 -46
- package/tests/sd-cli-entry.spec.ts +20 -0
package/dist/sd-cli-entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-cli-entry.js","sourceRoot":"","sources":["../src/sd-cli-entry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sd-cli-entry.js","sourceRoot":"","sources":["../src/sd-cli-entry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/sd-cli",
|
|
3
|
-
"version": "14.2.
|
|
3
|
+
"version": "14.2.18",
|
|
4
4
|
"description": "Simplysm package - CLI tool",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "simplysm",
|
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
"@angular/compiler-cli": "^22.1.0",
|
|
24
24
|
"@fastify/http-proxy": "^11.6.0",
|
|
25
25
|
"@inquirer/prompts": "^8.5.2",
|
|
26
|
+
"@simplysm/core-common": "14.2.18",
|
|
27
|
+
"@simplysm/core-node": "14.2.18",
|
|
28
|
+
"@simplysm/storage": "14.2.18",
|
|
26
29
|
"acorn": "^8.18.0",
|
|
27
30
|
"acorn-walk": "^8.3.5",
|
|
28
31
|
"browserslist-to-esbuild": "^2.1.1",
|
|
@@ -43,10 +46,7 @@
|
|
|
43
46
|
"typescript": "~6.0.3",
|
|
44
47
|
"ws": "^8.21.1",
|
|
45
48
|
"yaml": "^2.9.0",
|
|
46
|
-
"yargs": "^18.1.0"
|
|
47
|
-
"@simplysm/core-common": "14.2.14",
|
|
48
|
-
"@simplysm/core-node": "14.2.14",
|
|
49
|
-
"@simplysm/storage": "14.2.14"
|
|
49
|
+
"yargs": "^18.1.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@angular/core": "^22.1.0",
|
|
@@ -24,11 +24,12 @@ async function publishPackage(
|
|
|
24
24
|
projectPath: string,
|
|
25
25
|
logger: ConsolaInstance,
|
|
26
26
|
dryRun: boolean,
|
|
27
|
+
otp: string | undefined,
|
|
27
28
|
): Promise<void> {
|
|
28
29
|
const pkgName = path.basename(pkgPath);
|
|
29
30
|
|
|
30
31
|
if (publishConfig.type === "npm") {
|
|
31
|
-
await publishNpm(pkgPath, pkgName, version, logger, dryRun);
|
|
32
|
+
await publishNpm(pkgPath, pkgName, version, logger, dryRun, otp);
|
|
32
33
|
} else if (publishConfig.type === "local-directory") {
|
|
33
34
|
const targetPath = replaceEnvVariables(publishConfig.path, version, projectPath);
|
|
34
35
|
await publishToLocal(pkgPath, pkgName, targetPath, logger, dryRun);
|
|
@@ -37,6 +38,80 @@ async function publishPackage(
|
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
|
|
41
|
+
/** 개별 패키지 배포 결과. `error` 가 있으면 실패다. */
|
|
42
|
+
interface PublishResult {
|
|
43
|
+
name: string;
|
|
44
|
+
error?: unknown;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 패키지 하나를 배포한다 (백오프 재시도 포함)
|
|
49
|
+
*
|
|
50
|
+
* npm 배포는 재시도하지 않는다. 실패 사유가 대개 인증, 권한, 버전 충돌이라 다시 걸어도 같은 결과이고,
|
|
51
|
+
* 재시도할 때마다 npm 인증 UI 가 다시 떠서 사용자를 붙잡는다. 네트워크가 관건인 나머지 배포만 재시도한다.
|
|
52
|
+
*/
|
|
53
|
+
async function publishWithRetry(
|
|
54
|
+
pkg: DeploymentPackage,
|
|
55
|
+
version: string,
|
|
56
|
+
projectPath: string,
|
|
57
|
+
logger: ConsolaInstance,
|
|
58
|
+
dryRun: boolean,
|
|
59
|
+
otp: string | undefined,
|
|
60
|
+
): Promise<PublishResult> {
|
|
61
|
+
const maxRetries = pkg.config.type === "npm" ? 1 : 3;
|
|
62
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
63
|
+
try {
|
|
64
|
+
await publishPackage(pkg.path, pkg.config, version, projectPath, logger, dryRun, otp);
|
|
65
|
+
if (dryRun) {
|
|
66
|
+
logger.info(`[DRY-RUN] ${pkg.name}`);
|
|
67
|
+
} else {
|
|
68
|
+
logger.debug(pkg.name);
|
|
69
|
+
}
|
|
70
|
+
return { name: pkg.name };
|
|
71
|
+
} catch (err) {
|
|
72
|
+
if (attempt === maxRetries) {
|
|
73
|
+
return { name: pkg.name, error: err };
|
|
74
|
+
}
|
|
75
|
+
const delay = attempt * 5_000;
|
|
76
|
+
logger.warn(`${pkg.name} 배포 실패. ${delay / 1000}초 후 재시도 (${attempt + 1}/${maxRetries})`);
|
|
77
|
+
await wait.time(delay);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// TypeScript 타입 체커를 위한 폴백 (실제로 도달 불가)
|
|
81
|
+
return { name: pkg.name, error: new Error("알 수 없는 에러") };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* 한 레벨의 패키지를 배포한다.
|
|
86
|
+
*
|
|
87
|
+
* npm 배포는 순차로 돈다. npm 이 2FA 인증을 직접 처리하며 터미널을 점유하므로(브라우저 안내,
|
|
88
|
+
* OTP 프롬프트), 동시에 띄우면 서로 입력을 뺏는다. 나머지 배포는 그대로 병렬로 돈다.
|
|
89
|
+
*/
|
|
90
|
+
async function publishLevel(
|
|
91
|
+
pkgs: DeploymentPackage[],
|
|
92
|
+
version: string,
|
|
93
|
+
projectPath: string,
|
|
94
|
+
logger: ConsolaInstance,
|
|
95
|
+
dryRun: boolean,
|
|
96
|
+
otp: string | undefined,
|
|
97
|
+
): Promise<PublishResult[]> {
|
|
98
|
+
const run = async (pkg: DeploymentPackage): Promise<PublishResult> =>
|
|
99
|
+
publishWithRetry(pkg, version, projectPath, logger, dryRun, otp);
|
|
100
|
+
|
|
101
|
+
const [npmResults, otherResults] = await Promise.all([
|
|
102
|
+
(async () => {
|
|
103
|
+
const results: PublishResult[] = [];
|
|
104
|
+
for (const pkg of pkgs.filter((p) => p.config.type === "npm")) {
|
|
105
|
+
results.push(await run(pkg));
|
|
106
|
+
}
|
|
107
|
+
return results;
|
|
108
|
+
})(),
|
|
109
|
+
Promise.all(pkgs.filter((p) => p.config.type !== "npm").map(run)),
|
|
110
|
+
]);
|
|
111
|
+
|
|
112
|
+
return [...npmResults, ...otherResults];
|
|
113
|
+
}
|
|
114
|
+
|
|
40
115
|
/**
|
|
41
116
|
* 의존성 레벨별 순차 배포 (레벨 내 병렬, 재시도 포함)
|
|
42
117
|
*/
|
|
@@ -46,65 +121,31 @@ export async function runDeployment(
|
|
|
46
121
|
projectPath: string,
|
|
47
122
|
logger: ConsolaInstance,
|
|
48
123
|
dryRun: boolean,
|
|
124
|
+
otp: string | undefined,
|
|
49
125
|
): Promise<void> {
|
|
50
126
|
const levels = await computePublishLevels(publishPackages);
|
|
51
127
|
const publishedPackages: string[] = [];
|
|
52
|
-
let publishFailed = false;
|
|
53
128
|
|
|
54
129
|
// 레벨별 순차 실행
|
|
55
130
|
for (let levelIdx = 0; levelIdx < levels.length; levelIdx++) {
|
|
56
|
-
if (publishFailed) break;
|
|
57
|
-
|
|
58
131
|
const levelPkgs = levels[levelIdx];
|
|
59
132
|
logger.start(`Level ${levelIdx + 1}/${levels.length}`);
|
|
60
133
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
logger.debug(pkg.name);
|
|
71
|
-
}
|
|
72
|
-
publishedPackages.push(pkg.name);
|
|
73
|
-
return { status: "success" as const, name: pkg.name };
|
|
74
|
-
} catch (err) {
|
|
75
|
-
if (attempt < maxRetries) {
|
|
76
|
-
const delay = attempt * 5_000;
|
|
77
|
-
if (dryRun) {
|
|
78
|
-
logger.info(`[DRY-RUN] ${pkg.name} (retry ${attempt + 1}/${maxRetries})`);
|
|
79
|
-
} else {
|
|
80
|
-
logger.debug(`${pkg.name} (retry ${attempt + 1}/${maxRetries})`);
|
|
81
|
-
}
|
|
82
|
-
await wait.time(delay);
|
|
83
|
-
} else {
|
|
84
|
-
throw err;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
// TypeScript 타입 체커를 위한 폴백 (실제로 도달 불가)
|
|
89
|
-
return { status: "error" as const, name: pkg.name, error: new Error("알 수 없는 에러") };
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
const results = await Promise.allSettled(publishPromises);
|
|
93
|
-
|
|
94
|
-
// 레벨 내 실패 확인
|
|
95
|
-
const rejectedResults = results.filter(
|
|
96
|
-
(r): r is PromiseRejectedResult => r.status === "rejected",
|
|
97
|
-
);
|
|
98
|
-
if (rejectedResults.length > 0) {
|
|
99
|
-
publishFailed = true;
|
|
100
|
-
for (const r of rejectedResults) {
|
|
101
|
-
logger.error(errNs.message(r.reason));
|
|
102
|
-
logger.debug(`배포 실패 스택:\n${errNs.stack(r.reason)}`);
|
|
134
|
+
const results = await publishLevel(levelPkgs, version, projectPath, logger, dryRun, otp);
|
|
135
|
+
|
|
136
|
+
publishedPackages.push(...results.filter((r) => r.error == null).map((r) => r.name));
|
|
137
|
+
const failures = results.filter((r) => r.error != null);
|
|
138
|
+
|
|
139
|
+
if (failures.length > 0) {
|
|
140
|
+
for (const f of failures) {
|
|
141
|
+
logger.error(errNs.message(f.error));
|
|
142
|
+
logger.debug(`배포 실패 스택:\n${errNs.stack(f.error)}`);
|
|
103
143
|
}
|
|
104
144
|
logger.error(`Level ${levelIdx + 1}/${levels.length}`);
|
|
105
|
-
|
|
106
|
-
logger.success(`Level ${levelIdx + 1}/${levels.length}`);
|
|
145
|
+
break;
|
|
107
146
|
}
|
|
147
|
+
|
|
148
|
+
logger.success(`Level ${levelIdx + 1}/${levels.length}`);
|
|
108
149
|
}
|
|
109
150
|
|
|
110
151
|
// 실패한 패키지 확인
|
|
@@ -1,9 +1,78 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import os from "os";
|
|
1
3
|
import semver from "semver";
|
|
2
4
|
import type { ConsolaInstance } from "consola";
|
|
5
|
+
import { err as errNs } from "@simplysm/core-common";
|
|
6
|
+
import { fsx } from "@simplysm/core-node";
|
|
3
7
|
import { shellSpawn } from "../../utils/shell-spawn";
|
|
4
8
|
|
|
9
|
+
/** npm classic OTP 형식 (6자리 숫자) */
|
|
10
|
+
const OTP_PATTERN = /^\d{6}$/;
|
|
11
|
+
|
|
12
|
+
/** 로그, 에러 메시지에 OTP 코드 대신 남길 문자열 */
|
|
13
|
+
const OTP_MASK = "******";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* OTP 코드 형식을 검증한다.
|
|
17
|
+
*
|
|
18
|
+
* 셸을 거쳐 `--otp` 인자로 전달되므로, 형식을 벗어난 값은 주입 위험이 있어 거부한다.
|
|
19
|
+
*/
|
|
20
|
+
export function validateOtp(otp: string): string {
|
|
21
|
+
const trimmed = otp.trim();
|
|
22
|
+
if (!OTP_PATTERN.test(trimmed)) {
|
|
23
|
+
throw new Error("OTP 는 6자리 숫자여야 합니다.");
|
|
24
|
+
}
|
|
25
|
+
return trimmed;
|
|
26
|
+
}
|
|
27
|
+
|
|
5
28
|
/**
|
|
6
|
-
*
|
|
29
|
+
* 배포에 쓸 dist-tag 를 정한다. `undefined` 면 태그 없이 올려 `latest` 를 갱신한다.
|
|
30
|
+
*
|
|
31
|
+
* 레지스트리의 `latest` 보다 낮은 버전을 태그 없이 올리면 npm 이 거부한다. `--tag latest` 로
|
|
32
|
+
* 밀어붙이면 `latest` 가 끌어내려져 상위 라인 사용자가 깨지므로, `latest-14` 같은 별도 태그를 붙인다.
|
|
33
|
+
*
|
|
34
|
+
* 태그 이름에 `v14`, `14.x` 는 쓸 수 없다. npm 은 semver 범위로 해석되는 이름을 거부한다.
|
|
35
|
+
*/
|
|
36
|
+
async function resolveDistTag(
|
|
37
|
+
npmName: string,
|
|
38
|
+
version: string,
|
|
39
|
+
logger: ConsolaInstance,
|
|
40
|
+
): Promise<string | undefined> {
|
|
41
|
+
// prerelease 는 절대 latest 가 되면 안 되므로 반드시 태그를 붙인다.
|
|
42
|
+
const prereleaseInfo = semver.prerelease(version);
|
|
43
|
+
if (prereleaseInfo != null) {
|
|
44
|
+
// 식별자가 숫자(`14.3.0-1`)이거나 범위로 읽히면 태그 이름으로 쓸 수 없다.
|
|
45
|
+
const identifier = String(prereleaseInfo[0]);
|
|
46
|
+
return semver.validRange(identifier) == null
|
|
47
|
+
? identifier
|
|
48
|
+
: `pre-${semver.major(version)}`;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
let latest: string;
|
|
52
|
+
try {
|
|
53
|
+
const { stdout } = await shellSpawn("npm", ["view", `"${npmName}"`, "dist-tags.latest"]);
|
|
54
|
+
latest = stdout.trim();
|
|
55
|
+
} catch {
|
|
56
|
+
// 아직 배포된 적 없거나 레지스트리 조회가 실패한 경우. 태그 없이 올린다.
|
|
57
|
+
// 조회 실패로 태그를 놓쳐도 npm 이 "latest 보다 낮다"며 거부하므로 조용히 잘못되지 않는다.
|
|
58
|
+
logger.debug(`[${npmName}] latest 조회 실패. 태그 없이 배포합니다.`);
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (semver.valid(latest) == null || !semver.lt(version, latest)) return undefined;
|
|
63
|
+
|
|
64
|
+
const tag = `latest-${semver.major(version)}`;
|
|
65
|
+
logger.info(`[${npmName}] latest(${latest})가 더 높아 '${tag}' 태그로 배포합니다.`);
|
|
66
|
+
return tag;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* npm 레지스트리에 패키지를 배포한다.
|
|
71
|
+
*
|
|
72
|
+
* `pnpm pack` 으로 tarball 을 만든 뒤 `npm publish` 로 올린다. 두 단계로 나누는 이유:
|
|
73
|
+
* - `workspace:*` 치환과 `publishConfig` 머지는 pnpm 만 해준다. → pack 을 pnpm 으로 한다.
|
|
74
|
+
* - 2FA 인증(브라우저 로그인 창, OTP 프롬프트)은 npm 이 처리해준다. → publish 를 npm 으로 하고
|
|
75
|
+
* TTY 를 그대로 물려줘(`stdio: "inherit"`) npm 이 사용자와 직접 대화하게 한다.
|
|
7
76
|
*/
|
|
8
77
|
export async function publishNpm(
|
|
9
78
|
pkgPath: string,
|
|
@@ -11,20 +80,69 @@ export async function publishNpm(
|
|
|
11
80
|
version: string,
|
|
12
81
|
logger: ConsolaInstance,
|
|
13
82
|
dryRun: boolean,
|
|
83
|
+
otp: string | undefined,
|
|
14
84
|
): Promise<void> {
|
|
15
|
-
const
|
|
16
|
-
|
|
85
|
+
const tmpDir = path.join(os.tmpdir(), `sd-cli-pack-${pkgName}-${Date.now().toString(36)}`);
|
|
86
|
+
await fsx.mkdir(tmpDir);
|
|
17
87
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
88
|
+
try {
|
|
89
|
+
logger.debug(`[${pkgName}] pnpm pack`);
|
|
90
|
+
await shellSpawn("pnpm", ["pack", "--pack-destination", `"${tmpDir}"`], { cwd: pkgPath });
|
|
21
91
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
logger.debug(`[${pkgName}] pnpm ${args.join(" ")}`);
|
|
27
|
-
}
|
|
92
|
+
const tarball = (await fsx.readdir(tmpDir)).find((f) => f.endsWith(".tgz"));
|
|
93
|
+
if (tarball == null) {
|
|
94
|
+
throw new Error(`[${pkgName}] pack 결과 tarball 을 찾을 수 없습니다.`);
|
|
95
|
+
}
|
|
28
96
|
|
|
29
|
-
|
|
97
|
+
const args = ["publish", `"${path.join(tmpDir, tarball)}"`, "--access", "public"];
|
|
98
|
+
|
|
99
|
+
const { name: npmName } = await fsx.readJson<{ name: string }>(
|
|
100
|
+
path.resolve(pkgPath, "package.json"),
|
|
101
|
+
);
|
|
102
|
+
const tag = await resolveDistTag(npmName, version, logger);
|
|
103
|
+
if (tag != null) {
|
|
104
|
+
args.push("--tag", tag);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// 명령줄에 들어가는 값과 마스킹 대상이 어긋나지 않도록 검증본 하나만 쓴다.
|
|
108
|
+
const otpCode = otp == null ? undefined : validateOtp(otp);
|
|
109
|
+
if (otpCode != null) {
|
|
110
|
+
args.push("--otp", otpCode);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (dryRun) {
|
|
114
|
+
args.push("--dry-run");
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// OTP 코드가 로그에 남지 않도록 마스킹한다.
|
|
118
|
+
const maskedArgs = args.map((arg, i) => (args[i - 1] === "--otp" ? OTP_MASK : arg));
|
|
119
|
+
if (dryRun) {
|
|
120
|
+
logger.info(`[DRY-RUN] [${pkgName}] npm ${maskedArgs.join(" ")}`);
|
|
121
|
+
} else {
|
|
122
|
+
logger.debug(`[${pkgName}] npm ${maskedArgs.join(" ")}`);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
// stdio 를 물려주므로 npm 출력이 화면에 그대로 나온다. 인증이 필요하면 npm 이 직접 안내한다.
|
|
127
|
+
await shellSpawn("npm", args, { cwd: pkgPath, stdio: "inherit" });
|
|
128
|
+
} catch (err) {
|
|
129
|
+
// stdio 를 넘겼으므로 실패 사유는 캡처되지 않고 화면에만 남는다. 어디를 봐야 하는지 알린다.
|
|
130
|
+
const hint = `\n실패 사유는 위 npm 출력을 확인하세요.`;
|
|
131
|
+
// 실패 메시지에는 실행된 명령줄이 그대로 담기므로 OTP 코드를 마스킹한다.
|
|
132
|
+
const mask = (s: string): string =>
|
|
133
|
+
otpCode == null ? s : s.replaceAll(otpCode, OTP_MASK);
|
|
134
|
+
|
|
135
|
+
const wrapped = new Error(mask(errNs.message(err)) + hint);
|
|
136
|
+
// 원본 스택을 잃지 않도록 마스킹한 스택을 그대로 옮긴다.
|
|
137
|
+
wrapped.stack = mask(errNs.stack(err));
|
|
138
|
+
throw wrapped;
|
|
139
|
+
}
|
|
140
|
+
} finally {
|
|
141
|
+
// 정리 실패가 원래 배포 실패를 덮지 않도록 삼킨다.
|
|
142
|
+
try {
|
|
143
|
+
await fsx.rm(tmpDir);
|
|
144
|
+
} catch (err) {
|
|
145
|
+
logger.debug(`[${pkgName}] 임시 디렉터리 정리 실패: ${errNs.message(err)}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
30
148
|
}
|
|
@@ -13,6 +13,7 @@ import { type PackageJson, upgradeVersion } from "./version-upgrade";
|
|
|
13
13
|
import { waitWithCountdown } from "./env-utils";
|
|
14
14
|
import { ensureCleanWorkingTree, commitTagAndPush } from "./git-phase";
|
|
15
15
|
import { runDeployment } from "./deployment-phase";
|
|
16
|
+
import { validateOtp } from "./npm-publisher";
|
|
16
17
|
import { runPostPublish } from "./post-publish-phase";
|
|
17
18
|
|
|
18
19
|
//#region Types
|
|
@@ -27,6 +28,8 @@ export interface PublishOptions {
|
|
|
27
28
|
noBuild: boolean;
|
|
28
29
|
/** 실제 배포 없이 시뮬레이션 */
|
|
29
30
|
dryRun: boolean;
|
|
31
|
+
/** npm 2FA OTP 코드 (미지정 시 npm 이 배포 중 직접 인증을 처리한다) */
|
|
32
|
+
otp?: string;
|
|
30
33
|
/** sd.config.ts에 전달할 추가 옵션 */
|
|
31
34
|
options: string[];
|
|
32
35
|
}
|
|
@@ -123,15 +126,24 @@ export async function runPublish(options: PublishOptions): Promise<void> {
|
|
|
123
126
|
//#region Phase 1: Pre-validation
|
|
124
127
|
|
|
125
128
|
// npm 인증 검증 (npm publish 설정이 있는 경우)
|
|
126
|
-
|
|
129
|
+
const hasNpmPublish = publishPackages.some((p) => p.config.type === "npm");
|
|
130
|
+
|
|
131
|
+
if (hasNpmPublish) {
|
|
127
132
|
logger.debug("npm 인증 검증 중...");
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
133
|
+
let npmUser = await getNpmUser();
|
|
134
|
+
if (npmUser == null) {
|
|
135
|
+
// 토큰이 없으면 npm publish 는 로그인 창 없이 ENEEDAUTH 로 실패한다. 브라우저 로그인은
|
|
136
|
+
// npm login 만 시작하므로 여기서 TTY 를 물려줘 npm 이 사용자와 직접 로그인을 진행하게 한다.
|
|
137
|
+
logger.info("npm 로그인이 필요합니다. 브라우저 로그인을 시작합니다...");
|
|
138
|
+
try {
|
|
139
|
+
await shellSpawn("npm", ["login"], { stdio: "inherit" });
|
|
140
|
+
} catch (err) {
|
|
141
|
+
logger.debug(`npm login 실패: ${errNs.message(err)}`);
|
|
132
142
|
}
|
|
133
|
-
|
|
134
|
-
}
|
|
143
|
+
npmUser = await getNpmUser();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (npmUser == null) {
|
|
135
147
|
logger.error(
|
|
136
148
|
"npm 인증 실패. 로그인 상태를 확인해주세요.\n" +
|
|
137
149
|
" npm whoami # 현재 로그인 확인\n" +
|
|
@@ -141,6 +153,20 @@ export async function runPublish(options: PublishOptions): Promise<void> {
|
|
|
141
153
|
process.exitCode = 1;
|
|
142
154
|
return;
|
|
143
155
|
}
|
|
156
|
+
logger.debug(`npm 로그인 확인됨: ${npmUser}`);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// --otp 값 형식 검증 (--dry-run 이라도 사전 점검 용도로 쓸 수 있게 항상 검증한다)
|
|
160
|
+
// 값을 주지 않으면 2FA 인증은 npm 이 배포 단계에서 직접 처리한다(브라우저 로그인 창 등).
|
|
161
|
+
let otpOption: string | undefined;
|
|
162
|
+
if (options.otp != null) {
|
|
163
|
+
try {
|
|
164
|
+
otpOption = validateOtp(options.otp);
|
|
165
|
+
} catch (err) {
|
|
166
|
+
logger.error(errNs.message(err));
|
|
167
|
+
process.exitCode = 1;
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
144
170
|
}
|
|
145
171
|
|
|
146
172
|
// SSH 키 인증 검증 (비밀번호 없는 SFTP publish 설정이 있는 경우)
|
|
@@ -236,8 +262,25 @@ export async function runPublish(options: PublishOptions): Promise<void> {
|
|
|
236
262
|
|
|
237
263
|
//#region Phase 4: Deployment
|
|
238
264
|
|
|
239
|
-
|
|
240
|
-
|
|
265
|
+
// 배포 단계에서 멈추면 버전 상향과 git commit/tag/push 는 이미 끝난 상태다.
|
|
266
|
+
// 다시 `pnpm pub` 을 돌리면 버전이 또 올라가므로, 같은 버전으로 이어서 배포하는 방법을 알린다.
|
|
267
|
+
const reportResumeHint = (): void => {
|
|
268
|
+
if (dryRun || noBuild) return;
|
|
269
|
+
logger.error(
|
|
270
|
+
`v${version} 커밋, 태그는 이미 생성되었습니다. 같은 버전으로 이어서 배포하려면:\n` +
|
|
271
|
+
" pnpm pub:no-build # 버전 상향, 빌드 없이 배포만 재실행",
|
|
272
|
+
);
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
if (hasNpmPublish && !dryRun && otpOption == null) {
|
|
276
|
+
logger.info("npm 이 2FA 인증을 요구하면 화면 안내(브라우저 로그인 등)에 따라 진행하세요.");
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
await runDeployment(publishPackages, version, cwd, logger, dryRun, otpOption);
|
|
280
|
+
if (process.exitCode === 1) {
|
|
281
|
+
reportResumeHint();
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
241
284
|
|
|
242
285
|
//#endregion
|
|
243
286
|
|
|
@@ -256,4 +299,15 @@ export async function runPublish(options: PublishOptions): Promise<void> {
|
|
|
256
299
|
}
|
|
257
300
|
}
|
|
258
301
|
|
|
302
|
+
/** 현재 npm 로그인 사용자명. 토큰이 없거나 유효하지 않으면 undefined. */
|
|
303
|
+
async function getNpmUser(): Promise<string | undefined> {
|
|
304
|
+
try {
|
|
305
|
+
const { stdout } = await shellSpawn("npm", ["whoami"]);
|
|
306
|
+
const user = stdout.trim();
|
|
307
|
+
return user === "" ? undefined : user;
|
|
308
|
+
} catch {
|
|
309
|
+
return undefined;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
259
313
|
//#endregion
|
|
@@ -76,20 +76,6 @@ export async function upgradeVersion(
|
|
|
76
76
|
);
|
|
77
77
|
changedFiles.push(...templateChangedFiles.filter((f) => f != null));
|
|
78
78
|
|
|
79
|
-
const pluginManifestPaths = await fsx.glob(
|
|
80
|
-
path.resolve(cwd, "plugins/*/*-plugin/plugin.json"),
|
|
81
|
-
{ dot: true },
|
|
82
|
-
);
|
|
83
|
-
const pluginManifestChangedFiles = await Promise.all(
|
|
84
|
-
pluginManifestPaths.map(async (pluginManifestPath) => {
|
|
85
|
-
const pluginManifest = await fsx.readJson<{ version: string }>(pluginManifestPath);
|
|
86
|
-
pluginManifest.version = newVersion;
|
|
87
|
-
await fsx.write(pluginManifestPath, json.stringify(pluginManifest, { space: 2 }) + "\n");
|
|
88
|
-
return pluginManifestPath;
|
|
89
|
-
}),
|
|
90
|
-
);
|
|
91
|
-
changedFiles.push(...pluginManifestChangedFiles);
|
|
92
|
-
|
|
93
79
|
return { version: newVersion, changedFiles };
|
|
94
80
|
}
|
|
95
81
|
|
package/src/sd-cli-entry.ts
CHANGED
|
@@ -245,6 +245,10 @@ export function createCliParser(argv: string[]): Argv {
|
|
|
245
245
|
describe: "Simulate without actual deployment",
|
|
246
246
|
default: false,
|
|
247
247
|
},
|
|
248
|
+
"otp": {
|
|
249
|
+
type: "string",
|
|
250
|
+
describe: "npm 2FA one-time password (omit to let npm handle auth interactively)",
|
|
251
|
+
},
|
|
248
252
|
"opt": {
|
|
249
253
|
type: "string",
|
|
250
254
|
array: true,
|
|
@@ -259,6 +263,7 @@ export function createCliParser(argv: string[]): Argv {
|
|
|
259
263
|
targets: args.target,
|
|
260
264
|
noBuild: !args.build,
|
|
261
265
|
dryRun: args.dryRun,
|
|
266
|
+
otp: args.otp,
|
|
262
267
|
options: args.opt,
|
|
263
268
|
});
|
|
264
269
|
},
|