tuyoo-devflow 0.1.3 → 0.1.4
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
CHANGED
|
@@ -84,6 +84,24 @@ tdf agent install
|
|
|
84
84
|
- 首次输入的两行 Agent 命令会保存到本地临时文件
|
|
85
85
|
- 再次执行 `install` 时会询问是否修改(默认不修改,直接复用继续)
|
|
86
86
|
|
|
87
|
+
卸载模式:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
tdf agent uninstall
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
卸载命令说明:
|
|
94
|
+
|
|
95
|
+
- 默认会尝试从本地安装命令缓存推断 `workDir` 与服务名
|
|
96
|
+
- 也支持显式指定参数:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
tdf agent uninstall --work-dir /path/to/workDir --service-name jenkins-agent-xxx
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
- Linux 会尝试停止并卸载 `systemd` 服务,macOS 会尝试卸载 `launchctl` 服务
|
|
103
|
+
- 会删除启动脚本与 `agent.jar`,并清理本地安装命令缓存
|
|
104
|
+
|
|
87
105
|
启动 Agent:
|
|
88
106
|
|
|
89
107
|
```bash
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { registerDoctorCommand } from "./doctor.js";
|
|
2
2
|
import { registerInstallCommand } from "./install.js";
|
|
3
|
+
import { registerUninstallCommand } from "./uninstall.js";
|
|
3
4
|
export function registerAgentCommand(program) {
|
|
4
5
|
const agentCommand = program.command("agent").description("Jenkins Agent 安装与运维命令");
|
|
5
6
|
registerDoctorCommand(agentCommand);
|
|
6
7
|
registerInstallCommand(agentCommand);
|
|
8
|
+
registerUninstallCommand(agentCommand);
|
|
7
9
|
}
|
|
8
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/agent/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/agent/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;IACnF,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACpC,sBAAsB,CAAC,YAAY,CAAC,CAAC;IACrC,wBAAwB,CAAC,YAAY,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type InstallCommandCache } from "../../core/store/installCommandCache.js";
|
|
3
|
+
export interface InferredUninstallTarget {
|
|
4
|
+
workDir?: string;
|
|
5
|
+
serviceName?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function inferUninstallTargetFromInstallCache(cache: InstallCommandCache | null): InferredUninstallTarget;
|
|
8
|
+
export declare function registerUninstallCommand(agentCommand: Command): void;
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { confirm, input } from "@inquirer/prompts";
|
|
3
|
+
import fs from "fs-extra";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { parseAgentCommand } from "../../core/jenkins/parseAgentCommand.js";
|
|
7
|
+
import { safeErrorMessage } from "../../core/log/redact.js";
|
|
8
|
+
import { getSupportedPlatform } from "../../core/platform.js";
|
|
9
|
+
import { clearInstallCommandCache, loadInstallCommandCache, } from "../../core/store/installCommandCache.js";
|
|
10
|
+
import { runCommand } from "../../core/shell/commandRunner.js";
|
|
11
|
+
import { buildMacLaunchServiceTarget, resolveMacGuiUid } from "../../core/generator/macLaunchd.js";
|
|
12
|
+
import { CheckReport } from "../../ui/CheckReport.js";
|
|
13
|
+
import { renderOnce } from "../../ui/renderOnce.js";
|
|
14
|
+
function sanitizeName(value) {
|
|
15
|
+
return value
|
|
16
|
+
.toLowerCase()
|
|
17
|
+
.replace(/[^a-z0-9_-]+/g, "-")
|
|
18
|
+
.replace(/-+/g, "-")
|
|
19
|
+
.replace(/^-|-$/g, "");
|
|
20
|
+
}
|
|
21
|
+
function defaultServiceName(nodeName) {
|
|
22
|
+
const base = sanitizeName(nodeName ?? "agent");
|
|
23
|
+
return `jenkins-agent-${base || "default"}`;
|
|
24
|
+
}
|
|
25
|
+
function shellQuote(value) {
|
|
26
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
27
|
+
}
|
|
28
|
+
export function inferUninstallTargetFromInstallCache(cache) {
|
|
29
|
+
if (!cache) {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const parsed = parseAgentCommand({
|
|
34
|
+
curlLine: cache.curlLine,
|
|
35
|
+
javaLine: cache.javaLine,
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
workDir: parsed.workDir,
|
|
39
|
+
serviceName: defaultServiceName(parsed.nodeName),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function resolveUninstallTarget(platform, options) {
|
|
47
|
+
const cache = await loadInstallCommandCache();
|
|
48
|
+
const inferred = inferUninstallTargetFromInstallCache(cache);
|
|
49
|
+
let workDir = options.workDir?.trim() || inferred.workDir;
|
|
50
|
+
if (!workDir) {
|
|
51
|
+
workDir = await input({
|
|
52
|
+
message: "请输入 Agent workDir(安装命令中的 -workDir)",
|
|
53
|
+
validate(value) {
|
|
54
|
+
return value.trim().length > 0 ? true : "workDir 不能为空";
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (platform === "windows") {
|
|
59
|
+
return {
|
|
60
|
+
workDir,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
let serviceName = options.serviceName?.trim() || inferred.serviceName;
|
|
64
|
+
if (!serviceName) {
|
|
65
|
+
serviceName = await input({
|
|
66
|
+
message: "请输入服务名(默认: jenkins-agent-agent)",
|
|
67
|
+
default: "jenkins-agent-agent",
|
|
68
|
+
validate(value) {
|
|
69
|
+
return value.trim().length > 0 ? true : "服务名不能为空";
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
workDir,
|
|
75
|
+
serviceName,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function startupScriptPath(platform, workDir) {
|
|
79
|
+
const scriptName = platform === "windows" ? "start_jenkins_agent.bat" : "start_jenkins_agent.sh";
|
|
80
|
+
return path.join(workDir, scriptName);
|
|
81
|
+
}
|
|
82
|
+
async function removePathResult(name, targetPath) {
|
|
83
|
+
try {
|
|
84
|
+
if (!(await fs.pathExists(targetPath))) {
|
|
85
|
+
return {
|
|
86
|
+
name,
|
|
87
|
+
status: "pass",
|
|
88
|
+
detail: `未找到,无需处理: ${targetPath}`,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
await fs.remove(targetPath);
|
|
92
|
+
return {
|
|
93
|
+
name,
|
|
94
|
+
status: "pass",
|
|
95
|
+
detail: `已删除: ${targetPath}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
return {
|
|
100
|
+
name,
|
|
101
|
+
status: "warn",
|
|
102
|
+
detail: `删除失败: ${targetPath}`,
|
|
103
|
+
hint: safeErrorMessage(error),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async function uninstallLinuxService(serviceName, workDir) {
|
|
108
|
+
const results = [];
|
|
109
|
+
const service = serviceName.trim();
|
|
110
|
+
const disableResult = await runCommand(`systemctl disable --now ${service}`, { allowFailure: true });
|
|
111
|
+
results.push({
|
|
112
|
+
name: "停止/禁用 systemd 服务",
|
|
113
|
+
status: disableResult.code === 0 ? "pass" : "warn",
|
|
114
|
+
detail: disableResult.code === 0
|
|
115
|
+
? `已尝试停止并禁用: ${service}`
|
|
116
|
+
: `未能自动停止/禁用: ${service}`,
|
|
117
|
+
hint: disableResult.code === 0
|
|
118
|
+
? undefined
|
|
119
|
+
: `请手动执行: sudo systemctl disable --now ${service}`,
|
|
120
|
+
});
|
|
121
|
+
const systemUnitPath = path.join("/etc/systemd/system", `${service}.service`);
|
|
122
|
+
if (await fs.pathExists(systemUnitPath)) {
|
|
123
|
+
try {
|
|
124
|
+
await fs.remove(systemUnitPath);
|
|
125
|
+
results.push({
|
|
126
|
+
name: "删除 systemd 服务文件",
|
|
127
|
+
status: "pass",
|
|
128
|
+
detail: `已删除: ${systemUnitPath}`,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
results.push({
|
|
133
|
+
name: "删除 systemd 服务文件",
|
|
134
|
+
status: "warn",
|
|
135
|
+
detail: `删除失败: ${systemUnitPath}`,
|
|
136
|
+
hint: `请手动执行: sudo rm -f ${shellQuote(systemUnitPath)}(${safeErrorMessage(error)})`,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
results.push({
|
|
142
|
+
name: "删除 systemd 服务文件",
|
|
143
|
+
status: "pass",
|
|
144
|
+
detail: `未找到,无需处理: ${systemUnitPath}`,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
results.push(await removePathResult("删除本地回落服务文件", path.join(workDir, `${service}.service`)));
|
|
148
|
+
results.push(await removePathResult("删除本地 systemd 预览文件", path.join(workDir, "systemd.preview.txt")));
|
|
149
|
+
const daemonReload = await runCommand("systemctl daemon-reload", { allowFailure: true });
|
|
150
|
+
results.push({
|
|
151
|
+
name: "重载 systemd 配置",
|
|
152
|
+
status: daemonReload.code === 0 ? "pass" : "warn",
|
|
153
|
+
detail: daemonReload.code === 0 ? "已执行 systemctl daemon-reload" : "重载 systemd 配置失败",
|
|
154
|
+
hint: daemonReload.code === 0 ? undefined : "请手动执行: sudo systemctl daemon-reload",
|
|
155
|
+
});
|
|
156
|
+
return results;
|
|
157
|
+
}
|
|
158
|
+
async function uninstallMacService(serviceName, workDir) {
|
|
159
|
+
const results = [];
|
|
160
|
+
try {
|
|
161
|
+
const guiUid = await resolveMacGuiUid();
|
|
162
|
+
const serviceTarget = buildMacLaunchServiceTarget(guiUid, serviceName);
|
|
163
|
+
const bootoutResult = await runCommand(`launchctl bootout ${serviceTarget}`, { allowFailure: true });
|
|
164
|
+
results.push({
|
|
165
|
+
name: "卸载 launchctl 服务",
|
|
166
|
+
status: bootoutResult.code === 0 ? "pass" : "warn",
|
|
167
|
+
detail: bootoutResult.code === 0
|
|
168
|
+
? `已执行 bootout: ${serviceTarget}`
|
|
169
|
+
: `未能自动 bootout: ${serviceTarget}`,
|
|
170
|
+
hint: bootoutResult.code === 0
|
|
171
|
+
? undefined
|
|
172
|
+
: `请手动执行: launchctl bootout ${serviceTarget}`,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
results.push({
|
|
177
|
+
name: "卸载 launchctl 服务",
|
|
178
|
+
status: "warn",
|
|
179
|
+
detail: "未能自动解析并卸载 launchctl 服务",
|
|
180
|
+
hint: safeErrorMessage(error),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
const launchAgentPath = path.join(os.homedir(), "Library", "LaunchAgents", `${serviceName}.plist`);
|
|
184
|
+
results.push(await removePathResult("删除 LaunchAgent plist", launchAgentPath));
|
|
185
|
+
results.push(await removePathResult("删除本地回落 plist", path.join(workDir, `${serviceName}.plist`)));
|
|
186
|
+
return results;
|
|
187
|
+
}
|
|
188
|
+
function uninstallPlanLines(platform, target) {
|
|
189
|
+
const lines = [
|
|
190
|
+
`workDir: ${target.workDir}`,
|
|
191
|
+
`删除启动脚本: ${startupScriptPath(platform, target.workDir)}`,
|
|
192
|
+
`删除 agent.jar: ${path.join(target.workDir, "agent.jar")}`,
|
|
193
|
+
];
|
|
194
|
+
if (platform === "linux" && target.serviceName) {
|
|
195
|
+
lines.push(`停止并卸载 systemd 服务: ${target.serviceName}`);
|
|
196
|
+
}
|
|
197
|
+
else if (platform === "macos" && target.serviceName) {
|
|
198
|
+
lines.push(`卸载 launchctl 服务: ${target.serviceName}`);
|
|
199
|
+
}
|
|
200
|
+
return lines;
|
|
201
|
+
}
|
|
202
|
+
export function registerUninstallCommand(agentCommand) {
|
|
203
|
+
agentCommand
|
|
204
|
+
.command("uninstall")
|
|
205
|
+
.description("卸载 Jenkins Agent 服务与启动产物")
|
|
206
|
+
.option("--work-dir <dir>", "Agent workDir(安装命令中的 -workDir)")
|
|
207
|
+
.option("--service-name <name>", "服务名(Linux systemd / macOS launchd)")
|
|
208
|
+
.option("-y, --yes", "跳过确认,直接执行卸载")
|
|
209
|
+
.action(async (options) => {
|
|
210
|
+
try {
|
|
211
|
+
const platform = getSupportedPlatform();
|
|
212
|
+
const target = await resolveUninstallTarget(platform, options);
|
|
213
|
+
const results = [];
|
|
214
|
+
console.log("即将执行 Agent 卸载:");
|
|
215
|
+
for (const line of uninstallPlanLines(platform, target)) {
|
|
216
|
+
console.log(`- ${line}`);
|
|
217
|
+
}
|
|
218
|
+
if (!options.yes) {
|
|
219
|
+
const approved = await confirm({
|
|
220
|
+
message: "确认继续执行卸载?",
|
|
221
|
+
default: true,
|
|
222
|
+
});
|
|
223
|
+
if (!approved) {
|
|
224
|
+
console.log("已取消卸载。");
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (platform === "linux" && target.serviceName) {
|
|
229
|
+
results.push(...(await uninstallLinuxService(target.serviceName, target.workDir)));
|
|
230
|
+
}
|
|
231
|
+
else if (platform === "macos" && target.serviceName) {
|
|
232
|
+
results.push(...(await uninstallMacService(target.serviceName, target.workDir)));
|
|
233
|
+
}
|
|
234
|
+
results.push(await removePathResult("删除启动脚本", startupScriptPath(platform, target.workDir)));
|
|
235
|
+
results.push(await removePathResult("删除 agent.jar", path.join(target.workDir, "agent.jar")));
|
|
236
|
+
await clearInstallCommandCache();
|
|
237
|
+
results.push({
|
|
238
|
+
name: "清理安装命令缓存",
|
|
239
|
+
status: "pass",
|
|
240
|
+
detail: "已清理本地安装命令缓存",
|
|
241
|
+
});
|
|
242
|
+
await renderOnce(_jsx(CheckReport, { title: "\u5378\u8F7D\u7ED3\u679C", results: results }));
|
|
243
|
+
const hasWarn = results.some((item) => item.status === "warn");
|
|
244
|
+
if (hasWarn) {
|
|
245
|
+
process.exitCode = 1;
|
|
246
|
+
console.error("卸载完成,但存在告警项,请按提示手动处理。");
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
console.log("卸载完成。");
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
process.exitCode = 1;
|
|
254
|
+
console.error(`uninstall 执行失败: ${safeErrorMessage(error)}`);
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/agent/uninstall.tsx"],"names":[],"mappings":"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"}
|