long-git-cli 1.0.11 → 1.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 +148 -0
- package/dist/commands/config.d.ts +9 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +33 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +14 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +342 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/tag.d.ts.map +1 -1
- package/dist/commands/tag.js +4 -4
- package/dist/commands/tag.js.map +1 -1
- package/dist/devops/api/bitbucket-client.d.ts +101 -0
- package/dist/devops/api/bitbucket-client.d.ts.map +1 -0
- package/dist/devops/api/bitbucket-client.js +335 -0
- package/dist/devops/api/bitbucket-client.js.map +1 -0
- package/dist/devops/api/jenkins-client.d.ts +96 -0
- package/dist/devops/api/jenkins-client.d.ts.map +1 -0
- package/dist/devops/api/jenkins-client.js +240 -0
- package/dist/devops/api/jenkins-client.js.map +1 -0
- package/dist/devops/config/config-manager.d.ts +96 -0
- package/dist/devops/config/config-manager.d.ts.map +1 -0
- package/dist/devops/config/config-manager.js +331 -0
- package/dist/devops/config/config-manager.js.map +1 -0
- package/dist/devops/config/encryption.d.ts +39 -0
- package/dist/devops/config/encryption.d.ts.map +1 -0
- package/dist/devops/config/encryption.js +133 -0
- package/dist/devops/config/encryption.js.map +1 -0
- package/dist/devops/config/storage.d.ts +37 -0
- package/dist/devops/config/storage.d.ts.map +1 -0
- package/dist/devops/config/storage.js +132 -0
- package/dist/devops/config/storage.js.map +1 -0
- package/dist/devops/constants.d.ts +51 -0
- package/dist/devops/constants.d.ts.map +1 -0
- package/dist/devops/constants.js +95 -0
- package/dist/devops/constants.js.map +1 -0
- package/dist/devops/deployer/full-deployer.d.ts +77 -0
- package/dist/devops/deployer/full-deployer.d.ts.map +1 -0
- package/dist/devops/deployer/full-deployer.js +221 -0
- package/dist/devops/deployer/full-deployer.js.map +1 -0
- package/dist/devops/deployer/jenkins-deployer.d.ts +55 -0
- package/dist/devops/deployer/jenkins-deployer.d.ts.map +1 -0
- package/dist/devops/deployer/jenkins-deployer.js +110 -0
- package/dist/devops/deployer/jenkins-deployer.js.map +1 -0
- package/dist/devops/monitor/pipeline-monitor.d.ts +48 -0
- package/dist/devops/monitor/pipeline-monitor.d.ts.map +1 -0
- package/dist/devops/monitor/pipeline-monitor.js +170 -0
- package/dist/devops/monitor/pipeline-monitor.js.map +1 -0
- package/dist/devops/test-ui.d.ts +6 -0
- package/dist/devops/test-ui.d.ts.map +1 -0
- package/dist/devops/test-ui.js +31 -0
- package/dist/devops/test-ui.js.map +1 -0
- package/dist/devops/types.d.ts +138 -0
- package/dist/devops/types.d.ts.map +1 -0
- package/dist/devops/types.js +20 -0
- package/dist/devops/types.js.map +1 -0
- package/dist/devops/ui/server.d.ts +53 -0
- package/dist/devops/ui/server.d.ts.map +1 -0
- package/dist/devops/ui/server.js +1310 -0
- package/dist/devops/ui/server.js.map +1 -0
- package/dist/index.js +31 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/message.d.ts +0 -2
- package/dist/utils/message.d.ts.map +1 -1
- package/dist/utils/message.js +7 -15
- package/dist/utils/message.js.map +1 -1
- package/dist/utils/tag.d.ts +65 -6
- package/dist/utils/tag.d.ts.map +1 -1
- package/dist/utils/tag.js +148 -14
- package/dist/utils/tag.js.map +1 -1
- package/package.json +19 -2
package/README.md
CHANGED
|
@@ -37,6 +37,64 @@ long commit
|
|
|
37
37
|
- commit 后再次确认,自动 push
|
|
38
38
|
- 支持 Bitbucket/GitHub/GitLab,push 后友好提示
|
|
39
39
|
|
|
40
|
+
### 快速部署(frontend-msg-admin 专用)
|
|
41
|
+
```bash
|
|
42
|
+
long deploy
|
|
43
|
+
```
|
|
44
|
+
- 专门为 `frontend-msg-admin` 项目定制的快速部署工具
|
|
45
|
+
- 支持 4 个测试环境:test-01, test-02, test-03, test-04
|
|
46
|
+
- 自动创建 tag 并触发构建和部署
|
|
47
|
+
- 实时监听构建和部署状态
|
|
48
|
+
- 支持在仓库目录内外执行
|
|
49
|
+
|
|
50
|
+
**使用方式**:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# 交互式选择环境
|
|
54
|
+
long deploy
|
|
55
|
+
|
|
56
|
+
# 直接指定环境(1-4)
|
|
57
|
+
long deploy -e 1
|
|
58
|
+
long deploy --env 2
|
|
59
|
+
|
|
60
|
+
# 测试 Bitbucket 和 Jenkins 连接
|
|
61
|
+
long deploy --test
|
|
62
|
+
long deploy -t
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**首次使用**:
|
|
66
|
+
|
|
67
|
+
1. 运行 `long config` 打开 Web UI 配置界面
|
|
68
|
+
2. 配置 Bitbucket API Token 和 Jenkins API Token
|
|
69
|
+
3. 配置完成后运行 `long deploy --test` 测试连接
|
|
70
|
+
4. 测试通过后即可使用 `long deploy` 命令部署
|
|
71
|
+
|
|
72
|
+
**硬编码配置**:
|
|
73
|
+
|
|
74
|
+
- **Bitbucket**: `https://bitbucket.org/vantagefxcrm/frontend-msg-admin`
|
|
75
|
+
- **Jenkins**: `https://jenkins.app-alpha.com`
|
|
76
|
+
- **环境**: test-01, test-02, test-03, test-04
|
|
77
|
+
|
|
78
|
+
**执行流程**:
|
|
79
|
+
|
|
80
|
+
1. 检查 API Token 配置
|
|
81
|
+
2. 选择部署环境(1-4)
|
|
82
|
+
3. 验证仓库路径
|
|
83
|
+
- 在目标仓库目录:使用本地 Git 创建 tag
|
|
84
|
+
- 不在目标仓库目录:通过 API 创建 tag
|
|
85
|
+
4. 监听构建状态(AWS CodeBuild)
|
|
86
|
+
5. 触发 Jenkins 部署
|
|
87
|
+
6. 监听部署状态
|
|
88
|
+
7. 显示部署结果
|
|
89
|
+
|
|
90
|
+
### 配置管理
|
|
91
|
+
```bash
|
|
92
|
+
long config
|
|
93
|
+
```
|
|
94
|
+
- 打开 Web UI 配置界面
|
|
95
|
+
- 配置 Bitbucket 和 Jenkins API Token
|
|
96
|
+
- 配置项目和环境信息(用于 Web UI)
|
|
97
|
+
|
|
40
98
|
|
|
41
99
|
|
|
42
100
|
## 交互流程示例
|
|
@@ -79,12 +137,102 @@ feat(core): 支持交互式 commit
|
|
|
79
137
|
💡 提示:在 Bitbucket 中,你可以在 "Commits" 页面查看
|
|
80
138
|
```
|
|
81
139
|
|
|
140
|
+
#### long deploy
|
|
141
|
+
```
|
|
142
|
+
Frontend Msg Admin 部署工具
|
|
143
|
+
|
|
144
|
+
? 选择部署环境: 1. test-01 (app-test-hy-service/frontend-msg-admin)
|
|
145
|
+
|
|
146
|
+
部署到: test-01
|
|
147
|
+
Jenkins Job: app-test-hy-service/frontend-msg-admin
|
|
148
|
+
|
|
149
|
+
[1/4] 创建 Tag (本地 Git)
|
|
150
|
+
拉取最新 tag...
|
|
151
|
+
当前最新: test-v00.00.0262
|
|
152
|
+
新 tag: test-v00.00.0263
|
|
153
|
+
推送到 Bitbucket...
|
|
154
|
+
Tag 已创建: test-v00.00.0263
|
|
155
|
+
|
|
156
|
+
[2/4] 监听构建状态
|
|
157
|
+
获取 commit hash: abc123d
|
|
158
|
+
等待 build status 出现...
|
|
159
|
+
AWS CodeBuild us-east-1 (frontend-msg-admin-ci): INPROGRESS (0分15秒)
|
|
160
|
+
AWS CodeBuild us-east-1 (frontend-msg-admin-ci): SUCCESSFUL (1分45秒)
|
|
161
|
+
构建完成
|
|
162
|
+
|
|
163
|
+
[3/4] 触发 Jenkins 部署
|
|
164
|
+
触发 Jenkins 部署: app-test-hy-service/frontend-msg-admin
|
|
165
|
+
构建已加入队列: 12345
|
|
166
|
+
等待构建开始...
|
|
167
|
+
构建已开始: #678
|
|
168
|
+
|
|
169
|
+
[4/4] 监听部署状态
|
|
170
|
+
构建状态: BUILDING (0分10秒)
|
|
171
|
+
构建状态: SUCCESS (0分35秒)
|
|
172
|
+
|
|
173
|
+
部署成功!
|
|
174
|
+
|
|
175
|
+
Tag: test-v00.00.0263
|
|
176
|
+
Jenkins 构建: #678 - SUCCESS
|
|
177
|
+
构建 URL: https://jenkins.example.com/job/app-test-hy-service/job/frontend-msg-admin/678/
|
|
178
|
+
```
|
|
179
|
+
|
|
82
180
|
## 扩展性说明
|
|
83
181
|
|
|
84
182
|
- 所有 git 操作、tag 处理、交互、常量、类型均已抽取为公共模块
|
|
85
183
|
- 新增命令/支持更多平台/自定义交互,只需在 utils/constants/types 里维护
|
|
86
184
|
- 代码高度解耦,便于单元测试和团队协作
|
|
87
185
|
|
|
186
|
+
## 配置文件
|
|
187
|
+
|
|
188
|
+
配置文件位置:`~/.long-cli/config.json`
|
|
189
|
+
|
|
190
|
+
该文件存储:
|
|
191
|
+
- Bitbucket API Token(加密)
|
|
192
|
+
- Jenkins API Token(加密)
|
|
193
|
+
- 项目和环境配置(用于 Web UI)
|
|
194
|
+
|
|
195
|
+
**注意**:
|
|
196
|
+
- `long deploy` 命令只使用 API Token 配置,项目和环境配置是硬编码的
|
|
197
|
+
- `long config` 打开的 Web UI 可以配置多项目多环境,用于更灵活的部署场景
|
|
198
|
+
|
|
199
|
+
## 故障排除
|
|
200
|
+
|
|
201
|
+
### long deploy 提示"未找到配置"
|
|
202
|
+
|
|
203
|
+
**解决方法**:
|
|
204
|
+
1. 运行 `long config` 打开 Web UI
|
|
205
|
+
2. 配置 Bitbucket API Token 和 Jenkins API Token
|
|
206
|
+
3. 保存配置后重新运行 `long deploy`
|
|
207
|
+
|
|
208
|
+
### long deploy 提示"Bitbucket 配置不完整"
|
|
209
|
+
|
|
210
|
+
**解决方法**:
|
|
211
|
+
1. 运行 `long config` 打开 Web UI
|
|
212
|
+
2. 检查 Bitbucket 配置是否完整(用户名和 API Token)
|
|
213
|
+
3. 重新保存配置
|
|
214
|
+
|
|
215
|
+
### long deploy 提示"未找到 Jenkins (app) 配置"
|
|
216
|
+
|
|
217
|
+
**解决方法**:
|
|
218
|
+
1. 运行 `long config` 打开 Web UI
|
|
219
|
+
2. 添加 Jenkins 实例,类型选择 "app"
|
|
220
|
+
3. 填写 Jenkins URL、用户名和 API Token
|
|
221
|
+
4. 保存配置
|
|
222
|
+
|
|
223
|
+
### 如何重新配置
|
|
224
|
+
|
|
225
|
+
如果需要重新配置 API Token:
|
|
226
|
+
1. 运行 `long config` 打开 Web UI
|
|
227
|
+
2. 在配置界面重新输入新的 Token
|
|
228
|
+
3. 保存配置
|
|
229
|
+
|
|
230
|
+
或者直接删除配置文件:
|
|
231
|
+
```bash
|
|
232
|
+
rm ~/.long-cli/config.json
|
|
233
|
+
```
|
|
234
|
+
然后重新运行 `long config` 进行配置。
|
|
235
|
+
|
|
88
236
|
## 贡献
|
|
89
237
|
|
|
90
238
|
欢迎提 issue 或 PR,或根据自身需求 fork 扩展!
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBnD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Config 命令
|
|
4
|
+
* 启动 Web UI 配置界面
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.configCommand = configCommand;
|
|
11
|
+
const server_1 = require("../devops/ui/server");
|
|
12
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
13
|
+
/**
|
|
14
|
+
* Config 命令处理函数
|
|
15
|
+
*/
|
|
16
|
+
async function configCommand() {
|
|
17
|
+
try {
|
|
18
|
+
console.log(chalk_1.default.cyan("正在启动 Web UI 配置界面...\n"));
|
|
19
|
+
const server = new server_1.WebUIServer();
|
|
20
|
+
await server.start();
|
|
21
|
+
await server.openBrowser();
|
|
22
|
+
console.log(chalk_1.default.green("Web UI 已启动"));
|
|
23
|
+
console.log(chalk_1.default.gray("在浏览器中完成配置后,可以关闭此窗口\n"));
|
|
24
|
+
console.log(chalk_1.default.yellow("按 Ctrl+C 停止服务器"));
|
|
25
|
+
/** 保持进程运行 */
|
|
26
|
+
await new Promise(() => { });
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
console.error(chalk_1.default.red("启动失败:"), error.message);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAQH,sCAkBC;AAxBD,gDAAkD;AAClD,kDAA0B;AAE1B;;GAEG;AACI,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,IAAI,oBAAW,EAAE,CAAC;QACjC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAE3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAE5C,aAAa;QACb,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deploy 命令
|
|
3
|
+
* 专门为 frontend-msg-admin 项目定制的快速部署工具
|
|
4
|
+
*/
|
|
5
|
+
interface DeployOptions {
|
|
6
|
+
env?: number;
|
|
7
|
+
test?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Deploy 命令处理函数
|
|
11
|
+
*/
|
|
12
|
+
export declare function deployCommand(options: DeployOptions): Promise<void>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=deploy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoDH,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+PzE"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deploy 命令
|
|
4
|
+
* 专门为 frontend-msg-admin 项目定制的快速部署工具
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.deployCommand = deployCommand;
|
|
11
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
13
|
+
const config_manager_1 = require("../devops/config/config-manager");
|
|
14
|
+
const bitbucket_client_1 = require("../devops/api/bitbucket-client");
|
|
15
|
+
const jenkins_client_1 = require("../devops/api/jenkins-client");
|
|
16
|
+
const pipeline_monitor_1 = require("../devops/monitor/pipeline-monitor");
|
|
17
|
+
const jenkins_deployer_1 = require("../devops/deployer/jenkins-deployer");
|
|
18
|
+
const tag_1 = require("./tag");
|
|
19
|
+
const simple_git_1 = require("simple-git");
|
|
20
|
+
const git = (0, simple_git_1.simpleGit)();
|
|
21
|
+
// 硬编码配置
|
|
22
|
+
const DEPLOY_CONFIG = {
|
|
23
|
+
project: {
|
|
24
|
+
workspace: "vantagefxcrm",
|
|
25
|
+
repoSlug: "frontend-msg-admin",
|
|
26
|
+
repoUrl: "https://bitbucket.org/vantagefxcrm/frontend-msg-admin",
|
|
27
|
+
tagFormat: "test-v00.00.0000",
|
|
28
|
+
},
|
|
29
|
+
bitbucket: {
|
|
30
|
+
baseUrl: "https://bitbucket.org/vantagefxcrm/frontend-msg-admin",
|
|
31
|
+
},
|
|
32
|
+
jenkins: {
|
|
33
|
+
baseUrl: "https://jenkins.app-alpha.com",
|
|
34
|
+
},
|
|
35
|
+
environments: [
|
|
36
|
+
{
|
|
37
|
+
id: 1,
|
|
38
|
+
name: "test-01",
|
|
39
|
+
jenkinsJob: "app-test-hy-service/frontend-msg-admin",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: 2,
|
|
43
|
+
name: "test-02",
|
|
44
|
+
jenkinsJob: "app-test-hy-service/frontend-msg-admin2",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: 3,
|
|
48
|
+
name: "test-03",
|
|
49
|
+
jenkinsJob: "app-test-hy-service/frontend-msg-admin3",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: 4,
|
|
53
|
+
name: "test-04",
|
|
54
|
+
jenkinsJob: "app-test-hy-service/frontend-msg-admin4",
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Deploy 命令处理函数
|
|
60
|
+
*/
|
|
61
|
+
async function deployCommand(options) {
|
|
62
|
+
// 添加 SIGINT 处理
|
|
63
|
+
process.on("SIGINT", () => {
|
|
64
|
+
console.log(chalk_1.default.yellow("\n\n部署已中断"));
|
|
65
|
+
console.log(chalk_1.default.gray("注意: 已触发的构建和部署可能仍在进行中"));
|
|
66
|
+
process.exit(0);
|
|
67
|
+
});
|
|
68
|
+
try {
|
|
69
|
+
console.log(chalk_1.default.cyan("Frontend Msg Admin 部署工具\n"));
|
|
70
|
+
// 1. 检查配置
|
|
71
|
+
const configManager = new config_manager_1.ConfigManager();
|
|
72
|
+
const hasConfig = await configManager.configExists();
|
|
73
|
+
if (!hasConfig) {
|
|
74
|
+
console.log(chalk_1.default.yellow("未找到配置,需要配置 API Token\n"));
|
|
75
|
+
// 交互式输入 Bitbucket Token
|
|
76
|
+
console.log(chalk_1.default.cyan("配置 Bitbucket API Token"));
|
|
77
|
+
const bitbucketAnswers = await inquirer_1.default.prompt([
|
|
78
|
+
{
|
|
79
|
+
type: "input",
|
|
80
|
+
name: "username",
|
|
81
|
+
message: "Bitbucket 用户名 (邮箱):",
|
|
82
|
+
validate: (input) => (input.trim() ? true : "用户名不能为空"),
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
type: "password",
|
|
86
|
+
name: "token",
|
|
87
|
+
message: "Bitbucket API Token:",
|
|
88
|
+
validate: (input) => (input.trim() ? true : "Token 不能为空"),
|
|
89
|
+
},
|
|
90
|
+
]);
|
|
91
|
+
// 保存 Bitbucket 配置
|
|
92
|
+
await configManager.updateBitbucketConfig(bitbucketAnswers.username, bitbucketAnswers.token);
|
|
93
|
+
console.log(chalk_1.default.green("Bitbucket 配置已保存\n"));
|
|
94
|
+
// 交互式输入 Jenkins Token
|
|
95
|
+
console.log(chalk_1.default.cyan("配置 Jenkins API Token"));
|
|
96
|
+
const jenkinsAnswers = await inquirer_1.default.prompt([
|
|
97
|
+
{
|
|
98
|
+
type: "input",
|
|
99
|
+
name: "username",
|
|
100
|
+
message: "Jenkins 用户名:",
|
|
101
|
+
validate: (input) => (input.trim() ? true : "用户名不能为空"),
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
type: "password",
|
|
105
|
+
name: "token",
|
|
106
|
+
message: "Jenkins API Token:",
|
|
107
|
+
validate: (input) => (input.trim() ? true : "Token 不能为空"),
|
|
108
|
+
},
|
|
109
|
+
]);
|
|
110
|
+
// 保存 Jenkins 配置
|
|
111
|
+
await configManager.addJenkinsInstance("app", DEPLOY_CONFIG.jenkins.baseUrl, jenkinsAnswers.username, jenkinsAnswers.token);
|
|
112
|
+
console.log(chalk_1.default.green("Jenkins 配置已保存\n"));
|
|
113
|
+
}
|
|
114
|
+
const config = await configManager.loadConfig();
|
|
115
|
+
// 验证配置完整性
|
|
116
|
+
if (!config.bitbucket?.username || !config.bitbucket?.appPasswordHash) {
|
|
117
|
+
console.log(chalk_1.default.yellow("Bitbucket 配置不完整"));
|
|
118
|
+
console.log(chalk_1.default.cyan("请运行 long config 完成配置\n"));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// 查找 app 类型的 Jenkins 实例
|
|
122
|
+
const jenkinsConfig = config.jenkins?.find((j) => j.type === "app");
|
|
123
|
+
if (!jenkinsConfig) {
|
|
124
|
+
console.log(chalk_1.default.yellow("未找到 Jenkins (app) 配置"));
|
|
125
|
+
console.log(chalk_1.default.cyan("请运行 long config 添加 Jenkins 配置\n"));
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// 如果是测试连接模式
|
|
129
|
+
if (options.test) {
|
|
130
|
+
await testConnections(configManager, config, jenkinsConfig);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// 2. 选择环境
|
|
134
|
+
let envId = options.env;
|
|
135
|
+
if (!envId) {
|
|
136
|
+
const answer = await inquirer_1.default.prompt([
|
|
137
|
+
{
|
|
138
|
+
type: "list",
|
|
139
|
+
name: "envId",
|
|
140
|
+
message: "选择部署环境:",
|
|
141
|
+
choices: DEPLOY_CONFIG.environments.map((env) => ({
|
|
142
|
+
name: `${env.id}. ${env.name} (${env.jenkinsJob})`,
|
|
143
|
+
value: env.id,
|
|
144
|
+
})),
|
|
145
|
+
},
|
|
146
|
+
]);
|
|
147
|
+
envId = answer.envId;
|
|
148
|
+
}
|
|
149
|
+
const environment = DEPLOY_CONFIG.environments.find((e) => e.id === envId);
|
|
150
|
+
if (!environment) {
|
|
151
|
+
console.log(chalk_1.default.red(`错误: 环境 ${envId} 不存在`));
|
|
152
|
+
console.log(chalk_1.default.yellow("可用环境: 1, 2, 3, 4"));
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
console.log(chalk_1.default.gray(`\n部署到: ${environment.name}`));
|
|
156
|
+
console.log(chalk_1.default.gray(`Jenkins Job: ${environment.jenkinsJob}\n`));
|
|
157
|
+
// 3. 验证仓库路径
|
|
158
|
+
let isGitRepo = false;
|
|
159
|
+
let isLocalRepo = false;
|
|
160
|
+
try {
|
|
161
|
+
isGitRepo = await git.checkIsRepo();
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
isGitRepo = false;
|
|
165
|
+
}
|
|
166
|
+
if (isGitRepo) {
|
|
167
|
+
try {
|
|
168
|
+
const remotes = await git.getRemotes(true);
|
|
169
|
+
const originUrl = remotes.find((r) => r.name === "origin")?.refs.fetch || "";
|
|
170
|
+
isLocalRepo = originUrl.includes(DEPLOY_CONFIG.project.repoSlug);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
isLocalRepo = false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// 4. 创建 Tag
|
|
177
|
+
let tagName;
|
|
178
|
+
if (isLocalRepo) {
|
|
179
|
+
console.log(chalk_1.default.cyan("[1/4] 创建 Tag (本地 Git)"));
|
|
180
|
+
// 复用 long tag 命令
|
|
181
|
+
await (0, tag_1.tagCommand)({ pass: true });
|
|
182
|
+
// 获取最新 tag
|
|
183
|
+
const tags = await git.tags();
|
|
184
|
+
tagName = tags.latest || "";
|
|
185
|
+
console.log(chalk_1.default.green(` Tag 已创建: ${tagName}\n`));
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
console.log(chalk_1.default.cyan("[1/4] 创建 Tag (Bitbucket API)"));
|
|
189
|
+
// 询问分支
|
|
190
|
+
const branchAnswer = await inquirer_1.default.prompt([
|
|
191
|
+
{
|
|
192
|
+
type: "input",
|
|
193
|
+
name: "branch",
|
|
194
|
+
message: "要从哪个分支创建 tag:",
|
|
195
|
+
validate: (input) => (input.trim() ? true : "分支名称不能为空"),
|
|
196
|
+
},
|
|
197
|
+
]);
|
|
198
|
+
// 通过 API 创建 tag
|
|
199
|
+
const bitbucketToken = await configManager.getBitbucketPassword();
|
|
200
|
+
if (!bitbucketToken) {
|
|
201
|
+
throw new Error("未找到 Bitbucket Token");
|
|
202
|
+
}
|
|
203
|
+
const bitbucketClient = new bitbucket_client_1.BitbucketClient(config.bitbucket.username, bitbucketToken);
|
|
204
|
+
// 获取分支最新 commit
|
|
205
|
+
const commitHash = await bitbucketClient.getBranchLatestCommit(DEPLOY_CONFIG.project.workspace, DEPLOY_CONFIG.project.repoSlug, branchAnswer.branch);
|
|
206
|
+
// 生成 tag 名称
|
|
207
|
+
tagName = await generateNextTag(bitbucketClient);
|
|
208
|
+
// 创建 tag
|
|
209
|
+
await bitbucketClient.createTag(DEPLOY_CONFIG.project.workspace, DEPLOY_CONFIG.project.repoSlug, tagName, commitHash);
|
|
210
|
+
console.log(chalk_1.default.green(` Tag 已创建: ${tagName}\n`));
|
|
211
|
+
}
|
|
212
|
+
// 5. 监听构建状态
|
|
213
|
+
console.log(chalk_1.default.cyan("[2/4] 监听构建状态"));
|
|
214
|
+
const bitbucketToken = await configManager.getBitbucketPassword();
|
|
215
|
+
if (!bitbucketToken) {
|
|
216
|
+
throw new Error("未找到 Bitbucket Token");
|
|
217
|
+
}
|
|
218
|
+
const bitbucketClient = new bitbucket_client_1.BitbucketClient(config.bitbucket.username, bitbucketToken);
|
|
219
|
+
const pipelineMonitor = new pipeline_monitor_1.PipelineMonitor(bitbucketClient);
|
|
220
|
+
await pipelineMonitor.monitorBuildStatus(DEPLOY_CONFIG.project.workspace, DEPLOY_CONFIG.project.repoSlug, tagName);
|
|
221
|
+
console.log(chalk_1.default.green(" 构建完成\n"));
|
|
222
|
+
// 6. 触发 Jenkins 部署
|
|
223
|
+
console.log(chalk_1.default.cyan("[3/4] 触发 Jenkins 部署"));
|
|
224
|
+
const jenkinsToken = await configManager.getJenkinsToken("app");
|
|
225
|
+
if (!jenkinsToken) {
|
|
226
|
+
throw new Error("未找到 Jenkins Token");
|
|
227
|
+
}
|
|
228
|
+
const jenkinsClient = new jenkins_client_1.JenkinsClient(DEPLOY_CONFIG.jenkins.baseUrl, jenkinsConfig.username, jenkinsToken);
|
|
229
|
+
const jenkinsDeployer = new jenkins_deployer_1.JenkinsDeployer(jenkinsClient);
|
|
230
|
+
console.log(chalk_1.default.cyan("[4/4] 监听部署状态"));
|
|
231
|
+
const buildInfo = await jenkinsDeployer.deploy(environment.jenkinsJob, {
|
|
232
|
+
TAG_VERSION: tagName,
|
|
233
|
+
action: "approve",
|
|
234
|
+
});
|
|
235
|
+
// 7. 显示结果
|
|
236
|
+
console.log(chalk_1.default.green("\n部署成功!\n"));
|
|
237
|
+
console.log(chalk_1.default.hex('#FFA500')(`Tag: ${tagName}`));
|
|
238
|
+
console.log(chalk_1.default.hex('#FFA500')(`Jenkins 构建: #${buildInfo.number} - ${buildInfo.result}`));
|
|
239
|
+
console.log(chalk_1.default.hex('#FFA500')(`构建 URL: ${buildInfo.url}\n`));
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
console.error(chalk_1.default.red("\n部署失败:"), error.message);
|
|
243
|
+
process.exit(1);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* 生成下一个 tag
|
|
248
|
+
*/
|
|
249
|
+
async function generateNextTag(client) {
|
|
250
|
+
try {
|
|
251
|
+
// 获取所有 test-v 开头的 tag
|
|
252
|
+
const tags = await client.getTags(DEPLOY_CONFIG.project.workspace, DEPLOY_CONFIG.project.repoSlug);
|
|
253
|
+
// 过滤出 test-v 开头的 tag
|
|
254
|
+
const testTags = tags
|
|
255
|
+
.filter((tag) => tag.name.startsWith("test-v"))
|
|
256
|
+
.map((tag) => tag.name);
|
|
257
|
+
if (testTags.length === 0) {
|
|
258
|
+
return "test-v00.00.0001";
|
|
259
|
+
}
|
|
260
|
+
// 解析版本号并找到最大值
|
|
261
|
+
let maxVersion = 0;
|
|
262
|
+
for (const tag of testTags) {
|
|
263
|
+
const match = tag.match(/test-v(\d+)\.(\d+)\.(\d+)/);
|
|
264
|
+
if (match) {
|
|
265
|
+
const version = parseInt(match[3], 10);
|
|
266
|
+
if (version > maxVersion) {
|
|
267
|
+
maxVersion = version;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// 生成新版本号
|
|
272
|
+
const newVersion = maxVersion + 1;
|
|
273
|
+
const versionStr = String(newVersion).padStart(4, "0");
|
|
274
|
+
return `test-v00.00.${versionStr}`;
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
console.log(chalk_1.default.yellow(" 无法获取现有 tag,使用默认版本"));
|
|
278
|
+
return "test-v00.00.0001";
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* 测试 Bitbucket 和 Jenkins 连接
|
|
283
|
+
*/
|
|
284
|
+
async function testConnections(configManager, config, jenkinsConfig) {
|
|
285
|
+
console.log(chalk_1.default.cyan("测试连接\n"));
|
|
286
|
+
let allSuccess = true;
|
|
287
|
+
// 测试 Bitbucket 连接
|
|
288
|
+
console.log(chalk_1.default.cyan("[1/2] 测试 Bitbucket 连接"));
|
|
289
|
+
console.log(chalk_1.default.gray(` URL: ${DEPLOY_CONFIG.bitbucket.baseUrl}`));
|
|
290
|
+
console.log(chalk_1.default.gray(` 用户名: ${config.bitbucket.username}`));
|
|
291
|
+
try {
|
|
292
|
+
const bitbucketToken = await configManager.getBitbucketPassword();
|
|
293
|
+
if (!bitbucketToken) {
|
|
294
|
+
throw new Error("未找到 Bitbucket Token");
|
|
295
|
+
}
|
|
296
|
+
const bitbucketClient = new bitbucket_client_1.BitbucketClient(config.bitbucket.username, bitbucketToken);
|
|
297
|
+
const success = await bitbucketClient.testConnection();
|
|
298
|
+
if (success) {
|
|
299
|
+
console.log(chalk_1.default.green(" 连接成功\n"));
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
console.log(chalk_1.default.red(" 连接失败\n"));
|
|
303
|
+
allSuccess = false;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
console.log(chalk_1.default.red(` 连接失败: ${error.message}\n`));
|
|
308
|
+
allSuccess = false;
|
|
309
|
+
}
|
|
310
|
+
// 测试 Jenkins 连接
|
|
311
|
+
console.log(chalk_1.default.cyan("[2/2] 测试 Jenkins 连接"));
|
|
312
|
+
console.log(chalk_1.default.gray(` URL: ${DEPLOY_CONFIG.jenkins.baseUrl}`));
|
|
313
|
+
console.log(chalk_1.default.gray(` 用户名: ${jenkinsConfig.username}`));
|
|
314
|
+
try {
|
|
315
|
+
const jenkinsToken = await configManager.getJenkinsToken("app");
|
|
316
|
+
if (!jenkinsToken) {
|
|
317
|
+
throw new Error("未找到 Jenkins Token");
|
|
318
|
+
}
|
|
319
|
+
const jenkinsClient = new jenkins_client_1.JenkinsClient(DEPLOY_CONFIG.jenkins.baseUrl, jenkinsConfig.username, jenkinsToken);
|
|
320
|
+
const success = await jenkinsClient.testConnection();
|
|
321
|
+
if (success) {
|
|
322
|
+
console.log(chalk_1.default.green(" 连接成功\n"));
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
console.log(chalk_1.default.red(" 连接失败\n"));
|
|
326
|
+
allSuccess = false;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
console.log(chalk_1.default.red(` 连接失败: ${error.message}\n`));
|
|
331
|
+
allSuccess = false;
|
|
332
|
+
}
|
|
333
|
+
// 显示总结
|
|
334
|
+
if (allSuccess) {
|
|
335
|
+
console.log(chalk_1.default.green("所有连接测试通过\n"));
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
console.log(chalk_1.default.red("部分连接测试失败,请检查配置\n"));
|
|
339
|
+
process.exit(1);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD5E"}
|
package/dist/commands/tag.js
CHANGED
|
@@ -74,11 +74,11 @@ async function tagCommand(options) {
|
|
|
74
74
|
}
|
|
75
75
|
// 5. 解析当前 tag
|
|
76
76
|
const currentTagInfo = (0, tag_1.parseTag)(latestTag);
|
|
77
|
-
(0, message_1.
|
|
77
|
+
(0, message_1.printSuccess)(`🏷️ 当前最新 tag: ${latestTag}`);
|
|
78
78
|
// 6. 生成新版本号
|
|
79
79
|
const newTagInfo = (0, tag_1.incrementVersion)(currentTagInfo);
|
|
80
|
-
const newTag = (0, tag_1.formatTag)(newTagInfo);
|
|
81
|
-
(0, message_1.
|
|
80
|
+
const newTag = (0, tag_1.formatTag)(newTagInfo, { prefix: 'test-v', pattern: '00.00.0000' });
|
|
81
|
+
(0, message_1.printInfo)(`新 tag: ${newTag}`);
|
|
82
82
|
// 7. 询问用户是否确认
|
|
83
83
|
if (!(options && options.pass)) {
|
|
84
84
|
const confirmed = await prompt.confirm(`是否确认创建并推送新 tag: ${newTag}?`);
|
|
@@ -89,7 +89,7 @@ async function tagCommand(options) {
|
|
|
89
89
|
}
|
|
90
90
|
// 8. 创建并推送新 tag
|
|
91
91
|
await createAndPushTag(newTag, remoteInfo);
|
|
92
|
-
(0, message_1.printSuccess)('Tag 创建并推送成功!');
|
|
92
|
+
(0, message_1.printSuccess)('✅ Tag 创建并推送成功!');
|
|
93
93
|
}
|
|
94
94
|
catch (error) {
|
|
95
95
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
package/dist/commands/tag.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"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"}
|