snapshot-checker 0.1.6 → 0.2.1
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 +55 -36
- package/dist/commands/context_demo.d.ts +1 -1
- package/dist/commands/context_demo.d.ts.map +1 -1
- package/dist/commands/context_demo.js +19 -14
- package/dist/commands/context_demo.js.map +1 -1
- package/dist/commands/forkall.d.ts +1 -1
- package/dist/commands/forkall.d.ts.map +1 -1
- package/dist/commands/forkall.js +78 -62
- package/dist/commands/forkall.js.map +1 -1
- package/dist/commands/mac-example.d.ts +1 -1
- package/dist/commands/mac-example.js +9 -9
- package/dist/commands/report.d.ts +1 -1
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +63 -46
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/timeout_demo.d.ts +1 -1
- package/dist/commands/timeout_demo.d.ts.map +1 -1
- package/dist/commands/timeout_demo.js +8 -8
- package/dist/commands/timeout_demo.js.map +1 -1
- package/dist/src/cli.js +59 -56
- package/dist/src/cli.js.map +1 -1
- package/dist/src/executor.d.ts +4 -4
- package/dist/src/executor.js +2 -2
- package/dist/src/groupSpecs.d.ts +1 -1
- package/dist/src/groupSpecs.d.ts.map +1 -1
- package/dist/src/groupSpecs.js +5 -2
- package/dist/src/groupSpecs.js.map +1 -1
- package/dist/src/index.d.ts +5 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/common_groups.d.ts +2 -2
- package/dist/src/lib/common_groups.d.ts.map +1 -1
- package/dist/src/lib/common_groups.js +37 -33
- package/dist/src/lib/common_groups.js.map +1 -1
- package/dist/src/lib/programmatic.d.ts +2 -2
- package/dist/src/lib/programmatic.d.ts.map +1 -1
- package/dist/src/lib/programmatic.js +5 -4
- package/dist/src/lib/programmatic.js.map +1 -1
- package/dist/src/lib/trace_formatter.d.ts +1 -1
- package/dist/src/lib/trace_formatter.d.ts.map +1 -1
- package/dist/src/lib/trace_formatter.js +12 -11
- package/dist/src/lib/trace_formatter.js.map +1 -1
- package/dist/src/runCommand.d.ts +2 -2
- package/dist/src/runCommand.d.ts.map +1 -1
- package/dist/src/runCommand.js +77 -49
- package/dist/src/runCommand.js.map +1 -1
- package/dist/src/runGroups.d.ts +1 -1
- package/dist/src/runGroups.d.ts.map +1 -1
- package/dist/src/runGroups.js +30 -16
- package/dist/src/runGroups.js.map +1 -1
- package/dist/src/runners/builtinFunctionRunner.d.ts +2 -2
- package/dist/src/runners/builtinFunctionRunner.d.ts.map +1 -1
- package/dist/src/runners/builtinFunctionRunner.js +13 -13
- package/dist/src/runners/builtinFunctionRunner.js.map +1 -1
- package/dist/src/runners/embedRunner.d.ts +2 -2
- package/dist/src/runners/embedRunner.d.ts.map +1 -1
- package/dist/src/runners/embedRunner.js +17 -15
- package/dist/src/runners/embedRunner.js.map +1 -1
- package/dist/src/runners/index.d.ts +4 -4
- package/dist/src/runners/index.js +3 -3
- package/dist/src/runners/shellRunner.d.ts +2 -2
- package/dist/src/runners/shellRunner.d.ts.map +1 -1
- package/dist/src/runners/shellRunner.js +28 -28
- package/dist/src/runners/shellRunner.js.map +1 -1
- package/dist/src/runners/types.d.ts +2 -2
- package/dist/src/runners/types.d.ts.map +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +8 -4
- package/dist/src/types.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
## 命令类型
|
|
6
6
|
|
|
7
|
-
| kind
|
|
8
|
-
|
|
9
|
-
| `
|
|
10
|
-
| `mac`
|
|
11
|
-
| `
|
|
7
|
+
| kind | 说明 | 默认执行范围 |
|
|
8
|
+
| ------------------ | ---------------------------------- | ------------ |
|
|
9
|
+
| `windows` | Windows 下执行命令 | 仅 Windows |
|
|
10
|
+
| `mac` | 面向 macOS 的命令 | 仅 macOS |
|
|
11
|
+
| `linux` | 面向 Linux 的命令 | 仅 Linux |
|
|
12
|
+
| `embed` | 内置指令(如 `sleep` / `timeout`) | 全平台 |
|
|
13
|
+
| `builtin-function` | 内置函数命令(JS/TS 函数) | 全平台 |
|
|
12
14
|
|
|
13
15
|
## 安装与运行
|
|
14
16
|
|
|
@@ -22,10 +24,23 @@ npm start -- foo # 或: node dist/cli.js foo
|
|
|
22
24
|
|
|
23
25
|
```bash
|
|
24
26
|
npm run dev -- run
|
|
25
|
-
# 或
|
|
26
|
-
npm run run:example
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
+
## 测试
|
|
30
|
+
|
|
31
|
+
项目使用 `node:test` + `tsx` 运行测试,测试文件位于 `tests/*.test.ts`。
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm test
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
当前已覆盖的核心模块(`src/`):
|
|
38
|
+
|
|
39
|
+
- `src/groupSpecs.ts`:组参数解析(默认展开、`name:repeat`、非法 repeat 回退)
|
|
40
|
+
- `src/lib/programmatic.ts`:场景解析、group 参数规范化、按组执行的 stopOnError 行为
|
|
41
|
+
- `src/runGroups.ts`(通过 programmatic 入口间接覆盖):跨组共享命令上下文
|
|
42
|
+
- `src/lib/trace_formatter.ts`:profile 列表、未知 profile 回退、`dev` 配置映射
|
|
43
|
+
|
|
29
44
|
## 配置命令与组(commands 目录)
|
|
30
45
|
|
|
31
46
|
所有命令配置均放在项目根目录的 `commands/` 目录中:
|
|
@@ -37,15 +52,13 @@ npm run run:example
|
|
|
37
52
|
```ts
|
|
38
53
|
export const groups: Groups = {
|
|
39
54
|
env: [
|
|
40
|
-
{ kind:
|
|
41
|
-
{ kind:
|
|
42
|
-
],
|
|
43
|
-
list: [
|
|
44
|
-
{ kind: 'shell', description: '列出文件', run: 'ls -la' },
|
|
55
|
+
{ kind: "shell", description: "打印当前目录", run: "pwd" },
|
|
56
|
+
{ kind: "shell", description: "Node 版本", run: "node -v" },
|
|
45
57
|
],
|
|
58
|
+
list: [{ kind: "shell", description: "列出文件", run: "ls -la" }],
|
|
46
59
|
};
|
|
47
60
|
|
|
48
|
-
export const defaultGroupOrder: string[] = [
|
|
61
|
+
export const defaultGroupOrder: string[] = ["env", "list"];
|
|
49
62
|
```
|
|
50
63
|
|
|
51
64
|
- 不指定 `--group` 时:按 `defaultGroupOrder` 依次执行各组,且**只执行当前系统支持**的命令(shell 全平台;bat 仅 Windows;mac 仅 macOS)。
|
|
@@ -119,32 +132,32 @@ import { buildTag, buildUserGreeting } from '../src/lib/foo.js';
|
|
|
119
132
|
|
|
120
133
|
```ts
|
|
121
134
|
// commands/example.ts
|
|
122
|
-
import type { Groups } from
|
|
135
|
+
import type { Groups } from "../src/types.js";
|
|
123
136
|
|
|
124
137
|
export const groups: Groups = {
|
|
125
138
|
env: [
|
|
126
139
|
{
|
|
127
|
-
kind:
|
|
128
|
-
description:
|
|
129
|
-
run:
|
|
140
|
+
kind: "shell",
|
|
141
|
+
description: "获取当前用户名",
|
|
142
|
+
run: "whoami",
|
|
130
143
|
// 将整段 stdout 写入变量 user
|
|
131
144
|
// (比如 "alice"),供后续命令使用
|
|
132
145
|
// @ts-expect-error: 由执行器在运行时识别的扩展字段
|
|
133
146
|
captureToVar: {
|
|
134
|
-
name:
|
|
147
|
+
name: "user",
|
|
135
148
|
},
|
|
136
149
|
},
|
|
137
150
|
],
|
|
138
151
|
greet: [
|
|
139
152
|
{
|
|
140
|
-
kind:
|
|
141
|
-
description:
|
|
153
|
+
kind: "shell",
|
|
154
|
+
description: "使用上一条命令得到的用户名",
|
|
142
155
|
run: 'echo "hello, {{user}}"',
|
|
143
156
|
},
|
|
144
157
|
],
|
|
145
158
|
};
|
|
146
159
|
|
|
147
|
-
export const defaultGroupOrder = [
|
|
160
|
+
export const defaultGroupOrder = ["env", "greet"];
|
|
148
161
|
```
|
|
149
162
|
|
|
150
163
|
#### 仅提取输出的一部分
|
|
@@ -186,13 +199,13 @@ export const defaultGroupOrder = ['env', 'greet'];
|
|
|
186
199
|
// commands/foo.ts
|
|
187
200
|
export const groups: Groups = {
|
|
188
201
|
env: [
|
|
189
|
-
{ kind:
|
|
190
|
-
{ kind:
|
|
202
|
+
{ kind: "shell", description: "[foo] 打印当前目录", run: "pwd" },
|
|
203
|
+
{ kind: "shell", description: "[foo] 显示 Node 版本", run: "node -v" },
|
|
191
204
|
],
|
|
192
|
-
list: [{ kind:
|
|
205
|
+
list: [{ kind: "shell", description: "[foo] 列出当前目录", run: "ls -la" }],
|
|
193
206
|
};
|
|
194
207
|
|
|
195
|
-
export const defaultGroupOrder: string[] = [
|
|
208
|
+
export const defaultGroupOrder: string[] = ["env", "list"];
|
|
196
209
|
```
|
|
197
210
|
|
|
198
211
|
- 在 `commands/bar.ts` 中定义 `bar` 场景:
|
|
@@ -201,14 +214,20 @@ export const defaultGroupOrder: string[] = ['env', 'list'];
|
|
|
201
214
|
// commands/bar.ts
|
|
202
215
|
export const groups: Groups = {
|
|
203
216
|
env: [
|
|
204
|
-
{ kind:
|
|
205
|
-
{ kind:
|
|
217
|
+
{ kind: "shell", description: "[bar] 打印当前目录", run: "pwd" },
|
|
218
|
+
{ kind: "shell", description: "[bar] 显示 Node 版本", run: "node -v" },
|
|
219
|
+
],
|
|
220
|
+
list: [{ kind: "shell", description: "[bar] 列出当前目录", run: "ls -la" }],
|
|
221
|
+
extra: [
|
|
222
|
+
{
|
|
223
|
+
kind: "shell",
|
|
224
|
+
description: "[bar] 额外命令示例",
|
|
225
|
+
run: "echo extra from bar",
|
|
226
|
+
},
|
|
206
227
|
],
|
|
207
|
-
list: [{ kind: 'shell', description: '[bar] 列出当前目录', run: 'ls -la' }],
|
|
208
|
-
extra: [{ kind: 'shell', description: '[bar] 额外命令示例', run: 'echo extra from bar' }],
|
|
209
228
|
};
|
|
210
229
|
|
|
211
|
-
export const defaultGroupOrder: string[] = [
|
|
230
|
+
export const defaultGroupOrder: string[] = ["env", "extra", "list"];
|
|
212
231
|
```
|
|
213
232
|
|
|
214
233
|
CLI 会自动将 `commands` 目录下除 `config.*` 外的每个文件视为一个**场景命令**,文件名即子命令名:
|
|
@@ -281,14 +300,14 @@ npm install snapshot-checker
|
|
|
281
300
|
在业务项目中调用**运行接口**(入口与源码中 `src/index.ts` 导出一致),并从一个或多个**包内场景模块**生成命令组(发布产物中为 `dist/commands/*.js`,通过 `exports` 暴露):
|
|
282
301
|
|
|
283
302
|
```ts
|
|
284
|
-
import { resolveScenario, runScenarioGroups } from
|
|
285
|
-
import * as contextDemo from
|
|
286
|
-
import * as forkall from
|
|
303
|
+
import { resolveScenario, runScenarioGroups } from "snapshot-checker";
|
|
304
|
+
import * as contextDemo from "snapshot-checker/commands/context_demo";
|
|
305
|
+
import * as forkall from "snapshot-checker/commands/forkall";
|
|
287
306
|
|
|
288
307
|
const { groups, defaultGroupOrder } = resolveScenario(forkall, {
|
|
289
|
-
app:
|
|
290
|
-
eventPath:
|
|
291
|
-
mode:
|
|
308
|
+
app: "com.example.app",
|
|
309
|
+
eventPath: "snapshot/hmb_forkall_report_image_failure",
|
|
310
|
+
mode: "monitor",
|
|
292
311
|
});
|
|
293
312
|
|
|
294
313
|
await runScenarioGroups({ groups, defaultGroupOrder, stopOnError: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context_demo.d.ts","sourceRoot":"","sources":["../../commands/context_demo.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"context_demo.d.ts","sourceRoot":"","sources":["../../commands/context_demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EACZ,MAAM,iBAAiB,CAAC;AAMzB;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM,EAAE,MA8CpB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAKrC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CommandKind, getCurrentPlatformKind } from
|
|
2
|
-
import { buildTag, buildUserGreeting } from
|
|
1
|
+
import { CommandKind, getCurrentPlatformKind, } from "../src/types.js";
|
|
2
|
+
import { buildTag, buildUserGreeting } from "../src/lib/foo.js";
|
|
3
3
|
/** 与当前 OS 一致,避免示例在非 macOS 上被整组跳过 */
|
|
4
4
|
const kind = getCurrentPlatformKind();
|
|
5
5
|
/**
|
|
@@ -20,48 +20,53 @@ export const groups = {
|
|
|
20
20
|
getUser: [
|
|
21
21
|
{
|
|
22
22
|
kind,
|
|
23
|
-
description:
|
|
24
|
-
run:
|
|
23
|
+
description: "获取当前用户名,并写入变量 user",
|
|
24
|
+
run: "whoami",
|
|
25
25
|
captureToVar: {
|
|
26
|
-
name:
|
|
26
|
+
name: "user",
|
|
27
27
|
},
|
|
28
28
|
},
|
|
29
29
|
],
|
|
30
30
|
greet: [
|
|
31
31
|
{
|
|
32
32
|
kind,
|
|
33
|
-
description:
|
|
33
|
+
description: "使用上一条命令得到的用户名",
|
|
34
34
|
run: 'echo "hello, {{user}}"',
|
|
35
35
|
},
|
|
36
36
|
],
|
|
37
37
|
builtinFn: [
|
|
38
38
|
{
|
|
39
39
|
kind: CommandKind.BuiltinFunction,
|
|
40
|
-
description:
|
|
40
|
+
description: "调用 lib/foo 的工具函数写入变量",
|
|
41
41
|
func: (ctx) => {
|
|
42
|
-
const user = ctx.get(
|
|
43
|
-
ctx.set(
|
|
44
|
-
ctx.set(
|
|
42
|
+
const user = ctx.get("user") ?? "unknown";
|
|
43
|
+
ctx.set("builtinTag", buildTag("context_demo"));
|
|
44
|
+
ctx.set("fromFoo", buildUserGreeting(user));
|
|
45
45
|
},
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
kind,
|
|
49
|
-
description:
|
|
49
|
+
description: "读取内置函数写入的变量",
|
|
50
50
|
run: 'echo "{{builtinTag}} | {{fromFoo}}"',
|
|
51
51
|
},
|
|
52
52
|
],
|
|
53
53
|
builtinFail: [
|
|
54
54
|
{
|
|
55
55
|
kind: CommandKind.BuiltinFunction,
|
|
56
|
-
description:
|
|
56
|
+
description: "演示:返回 false 表示失败(可配合 --stop-on-error)",
|
|
57
57
|
func: () => false,
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
60
|
kind,
|
|
61
|
-
description:
|
|
61
|
+
description: "这条命令在 --stop-on-error 下不会执行",
|
|
62
62
|
run: 'echo "should not run when stop-on-error is enabled"',
|
|
63
63
|
},
|
|
64
64
|
],
|
|
65
65
|
};
|
|
66
|
-
export const defaultGroupOrder = [
|
|
66
|
+
export const defaultGroupOrder = [
|
|
67
|
+
"getUser",
|
|
68
|
+
"greet",
|
|
69
|
+
"builtinFn",
|
|
70
|
+
"builtinFail",
|
|
71
|
+
];
|
|
67
72
|
//# sourceMappingURL=context_demo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context_demo.js","sourceRoot":"","sources":["../../commands/context_demo.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"context_demo.js","sourceRoot":"","sources":["../../commands/context_demo.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,sBAAsB,GAGvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEhE,oCAAoC;AACpC,MAAM,IAAI,GAAG,sBAAsB,EAAE,CAAC;AAEtC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,OAAO,EAAE;QACP;YACE,IAAI;YACJ,WAAW,EAAE,oBAAoB;YACjC,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE;gBACZ,IAAI,EAAE,MAAM;aACb;SACF;KACF;IACD,KAAK,EAAE;QACL;YACE,IAAI;YACJ,WAAW,EAAE,eAAe;YAC5B,GAAG,EAAE,wBAAwB;SAC9B;KACF;IACD,SAAS,EAAE;QACT;YACE,IAAI,EAAE,WAAW,CAAC,eAAe;YACjC,WAAW,EAAE,sBAAsB;YACnC,IAAI,EAAE,CAAC,GAAmB,EAAE,EAAE;gBAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAS,MAAM,CAAC,IAAI,SAAS,CAAC;gBAClD,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;gBAChD,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9C,CAAC;SACF;QACD;YACE,IAAI;YACJ,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,qCAAqC;SAC3C;KACF;IACD,WAAW,EAAE;QACX;YACE,IAAI,EAAE,WAAW,CAAC,eAAe;YACjC,WAAW,EAAE,uCAAuC;YACpD,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK;SAClB;QACD;YACE,IAAI;YACJ,WAAW,EAAE,6BAA6B;YAC1C,GAAG,EAAE,qDAAqD;SAC3D;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAa;IACzC,SAAS;IACT,OAAO;IACP,WAAW;IACX,aAAa;CACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forkall.d.ts","sourceRoot":"","sources":["../../commands/forkall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA8B,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"forkall.d.ts","sourceRoot":"","sources":["../../commands/forkall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA8B,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAS1E;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,EAAE,MAAW,CAAC;AAEjC,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAKrC,CAAC;AAEF,eAAO,MAAM,OAAO;;;;;;;;IA0CnB,CAAC;AAEF,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAkJD;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;CACzB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CA+FlD"}
|
package/dist/commands/forkall.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { CommandKind } from
|
|
2
|
-
import path from
|
|
3
|
-
import { existsSync, mkdirSync } from
|
|
4
|
-
import { buildCommonAnalysisGroup, buildCommonCollectGroup, buildCommonInitEnvGroup } from
|
|
1
|
+
import { CommandKind } from "../src/types.js";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
4
|
+
import { buildCommonAnalysisGroup, buildCommonCollectGroup, buildCommonInitEnvGroup, } from "../src/lib/common_groups.js";
|
|
5
5
|
/**
|
|
6
6
|
* forkall 场景的基础占位配置。
|
|
7
7
|
* 实际要执行的命令会在 applyOptions 中,根据 CLI 传入的参数(eventPath/app 等)动态生成。
|
|
@@ -12,47 +12,63 @@ import { buildCommonAnalysisGroup, buildCommonCollectGroup, buildCommonInitEnvGr
|
|
|
12
12
|
* 完整示例见 demos/consumer-app。
|
|
13
13
|
*/
|
|
14
14
|
export const groups = {};
|
|
15
|
-
export const defaultGroupOrder = [
|
|
15
|
+
export const defaultGroupOrder = [
|
|
16
|
+
"reboot",
|
|
17
|
+
"monitor",
|
|
18
|
+
"collect",
|
|
19
|
+
"analysis",
|
|
20
|
+
];
|
|
16
21
|
export const options = [
|
|
17
|
-
{ flags:
|
|
18
|
-
{ flags:
|
|
19
|
-
{
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
{ flags: "--event-path <path>", description: "事件路径" },
|
|
23
|
+
{ flags: "--app <app>", description: "应用名" },
|
|
24
|
+
{
|
|
25
|
+
flags: "--system-symbol-file-path <path>",
|
|
26
|
+
description: "系统符号文件路径",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
flags: "--log-key <key>",
|
|
30
|
+
description: "日志过滤关键字(默认 pid)",
|
|
31
|
+
defaultValue: "pid",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
flags: "--duration <seconds>",
|
|
35
|
+
description: "采样持续时间(秒,默认 70)",
|
|
36
|
+
defaultValue: "70",
|
|
37
|
+
},
|
|
22
38
|
{
|
|
23
|
-
flags:
|
|
24
|
-
description:
|
|
25
|
-
defaultValue:
|
|
39
|
+
flags: "--default-timeout <seconds>",
|
|
40
|
+
description: "默认等待时间(秒,默认 90)",
|
|
41
|
+
defaultValue: "90",
|
|
26
42
|
},
|
|
27
43
|
{
|
|
28
|
-
flags:
|
|
29
|
-
description:
|
|
30
|
-
defaultValue:
|
|
44
|
+
flags: "--buffer-size <bytes>",
|
|
45
|
+
description: "缓冲区大小(字节,默认 512000)",
|
|
46
|
+
defaultValue: "512000",
|
|
31
47
|
},
|
|
32
48
|
{
|
|
33
|
-
flags:
|
|
34
|
-
description:
|
|
35
|
-
defaultValue:
|
|
49
|
+
flags: "--mode <mode>",
|
|
50
|
+
description: "执行模式:monitor 或 reboot-monitor",
|
|
51
|
+
defaultValue: "monitor",
|
|
36
52
|
},
|
|
37
53
|
{
|
|
38
|
-
flags:
|
|
39
|
-
description:
|
|
54
|
+
flags: "--output-dir <path>",
|
|
55
|
+
description: "本地输出目录(默认 .\\output)",
|
|
40
56
|
defaultValue: String.raw `.\output`,
|
|
41
57
|
},
|
|
42
58
|
{
|
|
43
|
-
flags:
|
|
44
|
-
description:
|
|
45
|
-
defaultValue:
|
|
59
|
+
flags: "--trace-format-profile <name>",
|
|
60
|
+
description: "trace 事件格式版本(默认 default)",
|
|
61
|
+
defaultValue: "default",
|
|
46
62
|
},
|
|
47
63
|
];
|
|
48
64
|
function buildRebootGroup(input) {
|
|
49
65
|
const { mode, eventPath, defaultTimeout } = input;
|
|
50
|
-
if (mode !==
|
|
66
|
+
if (mode !== "reboot-monitor")
|
|
51
67
|
return [];
|
|
52
68
|
return [
|
|
53
69
|
{
|
|
54
70
|
kind: CommandKind.Windows,
|
|
55
|
-
run:
|
|
71
|
+
run: "hdc shell remount",
|
|
56
72
|
},
|
|
57
73
|
{
|
|
58
74
|
kind: CommandKind.Windows,
|
|
@@ -64,32 +80,32 @@ function buildRebootGroup(input) {
|
|
|
64
80
|
},
|
|
65
81
|
{
|
|
66
82
|
kind: CommandKind.Windows,
|
|
67
|
-
description:
|
|
83
|
+
description: "上传hitrace配置文件",
|
|
68
84
|
run: String.raw `hdc file send .\config\hitrace\hitrace_utils_snapshot.json /system/etc/hiview/hitrace_utils.json`,
|
|
69
85
|
},
|
|
70
86
|
{
|
|
71
87
|
kind: CommandKind.Windows,
|
|
72
|
-
description:
|
|
88
|
+
description: "上传hiperf",
|
|
73
89
|
run: String.raw `hdc file send .\tools\host\hiperf\hiperf /bin/hiperf`,
|
|
74
90
|
},
|
|
75
91
|
{
|
|
76
92
|
kind: CommandKind.Windows,
|
|
77
|
-
description:
|
|
93
|
+
description: "配置自定义trace事件",
|
|
78
94
|
run: String.raw `hdc shell "sed -i 's|<TARGET_EVENT>|${eventPath}|g' /system/etc/hiview/hitrace_utils.json"`,
|
|
79
95
|
},
|
|
80
96
|
{
|
|
81
97
|
kind: CommandKind.Windows,
|
|
82
|
-
description:
|
|
98
|
+
description: "配置hiperf权限",
|
|
83
99
|
run: 'hdc shell "chmod 755 /bin/hiperf && chcon u:object_r:hiperf_exec:s0 /bin/hiperf"',
|
|
84
100
|
},
|
|
85
101
|
{
|
|
86
102
|
kind: CommandKind.Windows,
|
|
87
|
-
description:
|
|
88
|
-
run:
|
|
103
|
+
description: "重启设备",
|
|
104
|
+
run: "hdc shell reboot",
|
|
89
105
|
},
|
|
90
106
|
{
|
|
91
107
|
kind: CommandKind.Embed,
|
|
92
|
-
description:
|
|
108
|
+
description: "等待设备重启中,按任意键可跳过",
|
|
93
109
|
run: `timeout ${defaultTimeout}`,
|
|
94
110
|
},
|
|
95
111
|
];
|
|
@@ -99,59 +115,59 @@ function buildMonitorGroup(input) {
|
|
|
99
115
|
return [
|
|
100
116
|
{
|
|
101
117
|
kind: CommandKind.Windows,
|
|
102
|
-
description:
|
|
118
|
+
description: "收集日志到本地",
|
|
103
119
|
background: true,
|
|
104
120
|
run: `hdc shell "hilog -t kmsg | grep ${logKey}" >> ${snapshotLogFile}`,
|
|
105
121
|
},
|
|
106
122
|
{
|
|
107
123
|
kind: CommandKind.Windows,
|
|
108
|
-
run:
|
|
124
|
+
run: "hdc shell pidof apppool",
|
|
109
125
|
captureToVar: {
|
|
110
|
-
name:
|
|
126
|
+
name: "apppool_pids",
|
|
111
127
|
},
|
|
112
128
|
},
|
|
113
129
|
{
|
|
114
130
|
kind: CommandKind.BuiltinFunction,
|
|
115
|
-
description:
|
|
131
|
+
description: "提取检测目标信息",
|
|
116
132
|
func: (ctx) => {
|
|
117
|
-
const apppoolPids = ctx.get(
|
|
133
|
+
const apppoolPids = ctx.get("apppool_pids");
|
|
118
134
|
if (!apppoolPids) {
|
|
119
|
-
console.warn(
|
|
135
|
+
console.warn("[提取检测目标信息] apppool_pids 缺失或不是字符串,跳过处理");
|
|
120
136
|
return false;
|
|
121
137
|
}
|
|
122
|
-
const monitorTarget = apppoolPids.split(/\s+/).join(
|
|
123
|
-
ctx.set(
|
|
124
|
-
console.info(
|
|
138
|
+
const monitorTarget = apppoolPids.split(/\s+/).join(",");
|
|
139
|
+
ctx.set("monitor_target", monitorTarget);
|
|
140
|
+
console.info("提取检测目标: ", monitorTarget);
|
|
125
141
|
},
|
|
126
142
|
},
|
|
127
143
|
{
|
|
128
144
|
kind: CommandKind.Windows,
|
|
129
|
-
description:
|
|
145
|
+
description: "收集风险事件数据",
|
|
130
146
|
run: [
|
|
131
147
|
'hdc shell "',
|
|
132
148
|
`hitrace custom_event --overwrite -b ${bufferSize} -t ${duration} -o /data/local/tmp/snapshot_hitrace.txt & `,
|
|
133
149
|
eventName
|
|
134
150
|
? `hiperf record -e ${eventName} --period 1 -s fp --clockid boottime --cpu-limit 100 -o /data/local/tmp/perf.data -p {{monitor_target}} -d ${duration} & `
|
|
135
|
-
:
|
|
136
|
-
|
|
137
|
-
app ? `${startAppCommand} && ` :
|
|
151
|
+
: "",
|
|
152
|
+
"sleep 1 && ",
|
|
153
|
+
app ? `${startAppCommand} && ` : "",
|
|
138
154
|
`${checkStateCommand} & `,
|
|
139
|
-
|
|
155
|
+
"wait && ",
|
|
140
156
|
'hiperf dump -i /data/local/tmp/perf.data -o /data/local/tmp/snapshot_perf.data.txt"',
|
|
141
157
|
]
|
|
142
158
|
.filter(Boolean)
|
|
143
|
-
.join(
|
|
159
|
+
.join(""),
|
|
144
160
|
},
|
|
145
161
|
];
|
|
146
162
|
}
|
|
147
163
|
function buildAnalysisPreDecodeCommands(input) {
|
|
148
|
-
const { systemSymbolFilePath, snapshotPerfFile, parserSystemStackScript
|
|
164
|
+
const { systemSymbolFilePath, snapshotPerfFile, parserSystemStackScript } = input;
|
|
149
165
|
return [
|
|
150
166
|
...(systemSymbolFilePath
|
|
151
167
|
? [
|
|
152
168
|
{
|
|
153
169
|
kind: CommandKind.Windows,
|
|
154
|
-
description:
|
|
170
|
+
description: "系统栈解栈",
|
|
155
171
|
run: `python ${parserSystemStackScript} ${snapshotPerfFile} ${snapshotPerfFile} -S ${systemSymbolFilePath}`,
|
|
156
172
|
},
|
|
157
173
|
]
|
|
@@ -162,18 +178,18 @@ function buildAnalysisPreDecodeCommands(input) {
|
|
|
162
178
|
* 将 CLI 解析出来的参数应用到 forkall 场景,动态生成各阶段命令。
|
|
163
179
|
*/
|
|
164
180
|
export function applyOptions(ctx) {
|
|
165
|
-
const { eventPath =
|
|
166
|
-
const eventName = eventPath ? eventPath.replace(/\//g,
|
|
181
|
+
const { eventPath = "", app = "", systemSymbolFilePath = "", logKey = "pid", duration = "70", defaultTimeout = "90", bufferSize = "512000", mode = "monitor", outputDir = String.raw `.\output`, traceFormatProfile = "default", } = ctx.options ?? {};
|
|
182
|
+
const eventName = eventPath ? eventPath.replace(/\//g, ":") : "";
|
|
167
183
|
const checkStateCommand = "hidumper -s 1901 -a '-p libforkall_plugin.z.so --list'";
|
|
168
184
|
const outputDirNormalized = path.normalize(outputDir);
|
|
169
185
|
const outputDirWithSep = outputDirNormalized.endsWith(path.sep)
|
|
170
186
|
? outputDirNormalized
|
|
171
187
|
: `${outputDirNormalized}${path.sep}`;
|
|
172
|
-
const snapshotLogFile = path.join(outputDirNormalized,
|
|
173
|
-
const snapshotPerfFile = path.join(outputDirNormalized,
|
|
174
|
-
const dumpStackTxt = path.join(outputDirNormalized,
|
|
175
|
-
const dumpStackJson = path.join(outputDirNormalized,
|
|
176
|
-
const parserSystemStackScript = path.normalize(path.join(
|
|
188
|
+
const snapshotLogFile = path.join(outputDirNormalized, "snapshot_log.txt");
|
|
189
|
+
const snapshotPerfFile = path.join(outputDirNormalized, "snapshot_perf.data.txt");
|
|
190
|
+
const dumpStackTxt = path.join(outputDirNormalized, "dump_stack.txt");
|
|
191
|
+
const dumpStackJson = path.join(outputDirNormalized, "dump_stack.json");
|
|
192
|
+
const parserSystemStackScript = path.normalize(path.join(".", "tools", "host", "checker", "parse_system_stack.py"));
|
|
177
193
|
const startAppCommand = `hidumper -s 1901 -a '-p libforkall_plugin.z.so --create 100 ${app}'`;
|
|
178
194
|
if (!existsSync(outputDirNormalized)) {
|
|
179
195
|
mkdirSync(outputDirNormalized, { recursive: true });
|
|
@@ -215,8 +231,8 @@ export function applyOptions(ctx) {
|
|
|
215
231
|
dumpStackTxt,
|
|
216
232
|
dumpStackJson,
|
|
217
233
|
traceFormatProfile,
|
|
218
|
-
decodeStageName:
|
|
219
|
-
missingInputMessage:
|
|
234
|
+
decodeStageName: "风险调用栈数据分析",
|
|
235
|
+
missingInputMessage: "[风险调用栈数据分析] 输入文件缺失,跳过处理",
|
|
220
236
|
});
|
|
221
237
|
const resultGroups = {
|
|
222
238
|
reboot: rebootGroup,
|
|
@@ -225,9 +241,9 @@ export function applyOptions(ctx) {
|
|
|
225
241
|
collect: collectGroup,
|
|
226
242
|
analysis: analysisGroup,
|
|
227
243
|
};
|
|
228
|
-
const order = mode ===
|
|
229
|
-
? [
|
|
230
|
-
: [
|
|
244
|
+
const order = mode === "reboot-monitor"
|
|
245
|
+
? ["reboot", "init", "monitor", "collect", "analysis"]
|
|
246
|
+
: ["init", "monitor", "collect", "analysis"];
|
|
231
247
|
return {
|
|
232
248
|
groups: resultGroups,
|
|
233
249
|
defaultGroupOrder: order,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forkall.js","sourceRoot":"","sources":["../../commands/forkall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,
|
|
1
|
+
{"version":3,"file":"forkall.js","sourceRoot":"","sources":["../../commands/forkall.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CommandKind } from
|
|
1
|
+
import { CommandKind } from "../src/types.js";
|
|
2
2
|
/**
|
|
3
3
|
* Mac 示例场景:仅在 macOS 下执行,接收 --app 参数,参数不为空时打印 app。
|
|
4
4
|
*/
|
|
@@ -6,28 +6,28 @@ export const groups = {
|
|
|
6
6
|
info: [
|
|
7
7
|
{
|
|
8
8
|
kind: CommandKind.Mac,
|
|
9
|
-
description:
|
|
10
|
-
run:
|
|
9
|
+
description: "[mac-example] 当前系统",
|
|
10
|
+
run: "uname -a",
|
|
11
11
|
},
|
|
12
12
|
],
|
|
13
13
|
};
|
|
14
|
-
export const defaultGroupOrder = [
|
|
14
|
+
export const defaultGroupOrder = ["info", "app"];
|
|
15
15
|
export const options = [
|
|
16
|
-
{ flags:
|
|
16
|
+
{ flags: "--app <app>", description: "应用名,不为空时会打印该参数" },
|
|
17
17
|
];
|
|
18
18
|
export function applyOptions(ctx) {
|
|
19
19
|
const { groups: baseGroups, defaultGroupOrder } = ctx;
|
|
20
|
-
const app = ctx.options?.app?.trim() ??
|
|
21
|
-
const appGroup = app ===
|
|
20
|
+
const app = ctx.options?.app?.trim() ?? "";
|
|
21
|
+
const appGroup = app === ""
|
|
22
22
|
? []
|
|
23
23
|
: [
|
|
24
24
|
{
|
|
25
25
|
kind: CommandKind.Mac,
|
|
26
|
-
description:
|
|
26
|
+
description: "[mac-example] 打印 app 参数",
|
|
27
27
|
run: `echo ${app}`,
|
|
28
28
|
},
|
|
29
29
|
];
|
|
30
|
-
const order = appGroup.length > 0 ? [
|
|
30
|
+
const order = appGroup.length > 0 ? ["info", "app"] : ["info"];
|
|
31
31
|
return {
|
|
32
32
|
groups: {
|
|
33
33
|
...baseGroups,
|