@pisell/common 1.0.1 → 1.0.3
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/CHANGELOG.md +14 -0
- package/es/bin/pisell.js +2 -0
- package/es/index.d.ts +2 -0
- package/es/index.js +1 -0
- package/es/script/constants/index.js +13 -0
- package/es/script/deploy.js +47 -0
- package/es/script/index.js +40 -0
- package/es/script/package.json +4 -0
- package/es/script/release/index.js +161 -0
- package/es/script/release/release.js +163 -0
- package/es/script/uploadCode/index.js +278 -0
- package/es/script/uploadCode/uploadCode.js +401 -0
- package/es/script/utils/index.js +336 -0
- package/lib/bin/pisell.js +26 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +25 -0
- package/lib/script/constants/index.js +40 -0
- package/lib/{button/index.js → script/deploy.js} +28 -14
- package/lib/script/index.js +61 -0
- package/lib/script/package.json +4 -0
- package/lib/script/release/index.js +114 -0
- package/lib/script/release/release.js +87 -0
- package/lib/script/uploadCode/index.js +200 -0
- package/lib/script/uploadCode/uploadCode.js +206 -0
- package/lib/script/utils/index.js +252 -0
- package/package.json +10 -4
- package/src/bin/pisell.js +3 -0
- package/src/index.ts +1 -0
- package/src/script/constants/index.js +14 -0
- package/src/script/deploy.js +29 -0
- package/src/script/index.js +45 -0
- package/src/script/package.json +4 -0
- package/src/script/release/index.js +119 -0
- package/src/script/release/release.js +84 -0
- package/src/script/uploadCode/index.js +244 -0
- package/src/script/uploadCode/uploadCode.js +217 -0
- package/src/script/utils/index.js +275 -0
- package/es/button/index.d.ts +0 -18
- package/es/button/index.d.ts.map +0 -1
- package/es/button/index.js +0 -33
- package/lib/button/index.d.ts +0 -18
- package/lib/button/index.d.ts.map +0 -1
- package/src/button/index.md +0 -17
- package/src/button/index.tsx +0 -38
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
|
|
29
|
+
// src/script/utils/index.js
|
|
30
|
+
var utils_exports = {};
|
|
31
|
+
__export(utils_exports, {
|
|
32
|
+
connectServer: () => connectServer,
|
|
33
|
+
getCurrentProjectName: () => getCurrentProjectName,
|
|
34
|
+
getCurrentUserName: () => getCurrentUserName,
|
|
35
|
+
getGitCurrentBranch: () => getGitCurrentBranch,
|
|
36
|
+
getServerConfig: () => getServerConfig,
|
|
37
|
+
isWorkingTreeClean: () => isWorkingTreeClean,
|
|
38
|
+
loadJSON: () => loadJSON,
|
|
39
|
+
releaseProject: () => releaseProject,
|
|
40
|
+
sendWebhook: () => sendWebhook,
|
|
41
|
+
serverUnpack: () => serverUnpack,
|
|
42
|
+
serverUpload: () => serverUpload,
|
|
43
|
+
versionSort: () => versionSort
|
|
44
|
+
});
|
|
45
|
+
module.exports = __toCommonJS(utils_exports);
|
|
46
|
+
var dotenv = __toESM(require("dotenv"));
|
|
47
|
+
var import_path = __toESM(require("path"));
|
|
48
|
+
var import_ssh2 = __toESM(require("ssh2"));
|
|
49
|
+
var isWorkingTreeClean = async () => {
|
|
50
|
+
const v = await $`git status --porcelain`;
|
|
51
|
+
return v.stdout === "";
|
|
52
|
+
};
|
|
53
|
+
var getGitCurrentBranch = async () => {
|
|
54
|
+
const v = await $`git symbolic-ref --short HEAD`;
|
|
55
|
+
return v.stdout;
|
|
56
|
+
};
|
|
57
|
+
var monorepoProjectNameArr = ["admin"];
|
|
58
|
+
var getServerConfig = async (project) => {
|
|
59
|
+
if (monorepoProjectNameArr.includes(project)) {
|
|
60
|
+
return await fs.readJson("../../../lm_config.json");
|
|
61
|
+
}
|
|
62
|
+
return await fs.readJson("../lm_config.json");
|
|
63
|
+
};
|
|
64
|
+
var connectServer = (config2) => {
|
|
65
|
+
const conn = new import_ssh2.default.Client();
|
|
66
|
+
return new Promise((resolve, reject) => {
|
|
67
|
+
conn.on("ready", () => {
|
|
68
|
+
resolve(conn);
|
|
69
|
+
}).on("error", (err) => {
|
|
70
|
+
console.log(err, "connect error");
|
|
71
|
+
reject();
|
|
72
|
+
}).connect(config2);
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
var serverUpload = (conn, { localPath, remotePath }) => {
|
|
76
|
+
if (!conn)
|
|
77
|
+
return Promise.reject("未连接服务器");
|
|
78
|
+
return new Promise((resolve, reject) => {
|
|
79
|
+
conn.sftp((err, sftp) => {
|
|
80
|
+
if (err) {
|
|
81
|
+
console.log(err);
|
|
82
|
+
reject(err);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
sftp.fastPut(
|
|
86
|
+
localPath,
|
|
87
|
+
remotePath,
|
|
88
|
+
{
|
|
89
|
+
step: (total, nb, fsize) => {
|
|
90
|
+
console.table([
|
|
91
|
+
{
|
|
92
|
+
标题: "当前已上传",
|
|
93
|
+
值: `${(total / fsize * 100).toFixed(2)}%`
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
标题: "每次上传",
|
|
97
|
+
值: `${(nb / 1024 / 1024).toFixed(2)}M`
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
标题: "总大小",
|
|
101
|
+
值: `${(fsize / 1024 / 1024).toFixed(2)}M`
|
|
102
|
+
}
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
(err2) => {
|
|
107
|
+
if (err2) {
|
|
108
|
+
console.log(err2);
|
|
109
|
+
reject(err2);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
console.log("上传成功");
|
|
113
|
+
resolve(conn);
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
var serverUnpack = (conn, { path: path2, fileName, fullFileName, changelog }) => {
|
|
120
|
+
if (!conn)
|
|
121
|
+
return Promise.reject("未连接服务器");
|
|
122
|
+
return new Promise((resolve, reject) => {
|
|
123
|
+
conn.shell((err, stream) => {
|
|
124
|
+
if (err) {
|
|
125
|
+
console.log(err);
|
|
126
|
+
reject(err);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
stream.end(
|
|
130
|
+
`
|
|
131
|
+
cd ${path2}
|
|
132
|
+
unzip ${fullFileName} -d ${fileName} && mv ${fileName}/dist/* ${fileName}/ && rmdir ${fileName}/dist
|
|
133
|
+
rm -rf ${fullFileName}
|
|
134
|
+
echo "${changelog}" > ./${fileName}/changelog.md
|
|
135
|
+
sh deleteOldVersion.sh
|
|
136
|
+
exit
|
|
137
|
+
`
|
|
138
|
+
// 打开到path
|
|
139
|
+
// 解压 1.0.0.zip 文件到 1.0.0 移动dist中内容到 1.0.0内 删除dist
|
|
140
|
+
// 删除1.0.0.zip
|
|
141
|
+
// 写入changelog到changelog.md
|
|
142
|
+
// 执行deleteOldVersion脚本 删除过早版本
|
|
143
|
+
).on("data", (data) => {
|
|
144
|
+
console.log(data.toString());
|
|
145
|
+
}).on("close", () => {
|
|
146
|
+
console.log("✅上传完成");
|
|
147
|
+
resolve();
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
var releaseProject = (conn, { path: path2, fileName }) => {
|
|
153
|
+
return new Promise((resolve, reject) => {
|
|
154
|
+
conn.shell((err, stream) => {
|
|
155
|
+
if (err) {
|
|
156
|
+
console.log(err);
|
|
157
|
+
reject(err);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
stream.end(
|
|
161
|
+
`
|
|
162
|
+
cd ${path2}
|
|
163
|
+
cp -R -f pre-master next-master
|
|
164
|
+
rm -rf pre-master
|
|
165
|
+
\\cp -R -f ${fileName}/* next-master
|
|
166
|
+
cp -R -f ${fileName} pre-master
|
|
167
|
+
rm -rf master
|
|
168
|
+
cp -R next-master master
|
|
169
|
+
rm -rf next-master
|
|
170
|
+
exit
|
|
171
|
+
`
|
|
172
|
+
// 打开到path
|
|
173
|
+
// 复制pre-master到next-master
|
|
174
|
+
// 删除pre-master
|
|
175
|
+
// 复制1.0.0到next-master
|
|
176
|
+
// 复制1.0.0到pre-master
|
|
177
|
+
// 删除master
|
|
178
|
+
// 复制next-master到master
|
|
179
|
+
// 删除next-master
|
|
180
|
+
).on("data", (data) => {
|
|
181
|
+
console.log(data.toString());
|
|
182
|
+
}).on("close", () => {
|
|
183
|
+
console.log("✅发布完成");
|
|
184
|
+
resolve();
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
var versionSort = (versionList) => {
|
|
190
|
+
return versionList.sort((a, b) => {
|
|
191
|
+
const aParts = a.split(".");
|
|
192
|
+
const bParts = b.split(".");
|
|
193
|
+
for (let i = 0; i < aParts.length && i < bParts.length; i++) {
|
|
194
|
+
const aNum = parseInt(aParts[i]);
|
|
195
|
+
const bNum = parseInt(bParts[i]);
|
|
196
|
+
if (aNum !== bNum) {
|
|
197
|
+
return bNum - aNum;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return bParts.length - aParts.length;
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
var getCurrentProjectName = () => {
|
|
204
|
+
return loadJSON(import_path.default.join(process.cwd(), "./package.json")).name;
|
|
205
|
+
};
|
|
206
|
+
var loadJSON = (path2) => JSON.parse(fs.readFileSync(path2));
|
|
207
|
+
var getCurrentUserName = async () => {
|
|
208
|
+
const { stdout } = await $`git config user.name`;
|
|
209
|
+
return stdout;
|
|
210
|
+
};
|
|
211
|
+
var createFeishuMessageContent = (contentArr) => {
|
|
212
|
+
return JSON.stringify(
|
|
213
|
+
contentArr.map((item) => {
|
|
214
|
+
return [
|
|
215
|
+
{ tag: "text", text: `${item.key}: ` },
|
|
216
|
+
{ tag: "text", text: `${item.value}` }
|
|
217
|
+
];
|
|
218
|
+
})
|
|
219
|
+
);
|
|
220
|
+
};
|
|
221
|
+
var sendWebhook = async ({ title, content }) => {
|
|
222
|
+
var _a, _b, _c, _d;
|
|
223
|
+
const contentStr = createFeishuMessageContent(content);
|
|
224
|
+
if (!((_b = (_a = dotenv.config()) == null ? void 0 : _a.parsed) == null ? void 0 : _b.WEBHOOK))
|
|
225
|
+
return;
|
|
226
|
+
const response = await fetch((_d = (_c = dotenv.config()) == null ? void 0 : _c.parsed) == null ? void 0 : _d.WEBHOOK, {
|
|
227
|
+
headers: {
|
|
228
|
+
"Content-Type": "application/json"
|
|
229
|
+
},
|
|
230
|
+
method: "POST",
|
|
231
|
+
body: JSON.stringify({
|
|
232
|
+
msg_type: "post",
|
|
233
|
+
content: `{"post":{"zh_cn":{"title":"${title}","content":${contentStr}}}}`
|
|
234
|
+
})
|
|
235
|
+
});
|
|
236
|
+
return await response.json();
|
|
237
|
+
};
|
|
238
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
239
|
+
0 && (module.exports = {
|
|
240
|
+
connectServer,
|
|
241
|
+
getCurrentProjectName,
|
|
242
|
+
getCurrentUserName,
|
|
243
|
+
getGitCurrentBranch,
|
|
244
|
+
getServerConfig,
|
|
245
|
+
isWorkingTreeClean,
|
|
246
|
+
loadJSON,
|
|
247
|
+
releaseProject,
|
|
248
|
+
sendWebhook,
|
|
249
|
+
serverUnpack,
|
|
250
|
+
serverUpload,
|
|
251
|
+
versionSort
|
|
252
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pisell/common",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"sideEffects": [
|
|
5
5
|
"*.less"
|
|
6
6
|
],
|
|
@@ -8,10 +8,16 @@
|
|
|
8
8
|
"module": "./es/index.js",
|
|
9
9
|
"types": "./lib/index.d.ts",
|
|
10
10
|
"typings": "./lib/index.d.ts",
|
|
11
|
+
"bin": {
|
|
12
|
+
"pisell": "es/bin/pisell.js"
|
|
13
|
+
},
|
|
11
14
|
"dependencies": {
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
+
"zx": "^7.2.2",
|
|
16
|
+
"inquirer": "^6.2.6",
|
|
17
|
+
"archiver": "^5.3.1",
|
|
18
|
+
"dotenv": "^16.0.3",
|
|
19
|
+
"ssh2": "^1.13.0",
|
|
20
|
+
"@pisell/utils": "1.0.3"
|
|
15
21
|
},
|
|
16
22
|
"devDependencies": {
|
|
17
23
|
"father": "^4.1.6"
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const outPathMap = {
|
|
2
|
+
my_pisel_shop: {
|
|
3
|
+
prod: '../data/release/project/mypisel_shop',
|
|
4
|
+
release: '../data/release/project/my_pisel_shop',
|
|
5
|
+
pre: '../data/release/project/my_pisel_shop',
|
|
6
|
+
},
|
|
7
|
+
admin: {
|
|
8
|
+
prod: '../data/release/project/pisell_v2',
|
|
9
|
+
release: '../data/release/project/pisell_v2',
|
|
10
|
+
pre: '../data/release/project/pisell_v2',
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { outPathMap };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import release from './release/index.js';
|
|
3
|
+
import uploadCode from './uploadCode/index.js';
|
|
4
|
+
|
|
5
|
+
const actions = {
|
|
6
|
+
uploadCode: uploadCode,
|
|
7
|
+
release: release,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const inquirerResult = () => {
|
|
11
|
+
return inquirer.prompt([
|
|
12
|
+
{
|
|
13
|
+
type: 'list',
|
|
14
|
+
message: '请选择功能',
|
|
15
|
+
name: 'action',
|
|
16
|
+
choices: [
|
|
17
|
+
{ value: 'uploadCode', name: '上传代码' },
|
|
18
|
+
{ value: 'release', name: '发布代码' },
|
|
19
|
+
],
|
|
20
|
+
},
|
|
21
|
+
]);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const deploy = async () => {
|
|
25
|
+
let res = await inquirerResult();
|
|
26
|
+
return actions[res.action]();
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export default deploy;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { fileURLToPath } from 'url';
|
|
2
|
+
import deploy from './deploy.js';
|
|
3
|
+
import { loadJSON } from './utils/index.js';
|
|
4
|
+
|
|
5
|
+
const args = process.argv.slice(2);
|
|
6
|
+
|
|
7
|
+
const isVersion = (v) => {
|
|
8
|
+
return ['-v', '--version', '-V'].includes(v);
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const isHelp = (v) => {
|
|
12
|
+
return ['-h', '--help', '-H'].includes(v);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
|
|
17
|
+
(() => {
|
|
18
|
+
try {
|
|
19
|
+
const params = args.slice(1);
|
|
20
|
+
switch (true) {
|
|
21
|
+
case args[0] === 'deploy':
|
|
22
|
+
deploy(...params);
|
|
23
|
+
break;
|
|
24
|
+
case isVersion(args[0]):
|
|
25
|
+
console.log(
|
|
26
|
+
`@pisell/common@${
|
|
27
|
+
loadJSON(path.join(__dirname, '../../package.json')).version
|
|
28
|
+
}`,
|
|
29
|
+
);
|
|
30
|
+
break;
|
|
31
|
+
case isHelp(args[0]):
|
|
32
|
+
console.log('pisell -h --help -H [全部命令]');
|
|
33
|
+
|
|
34
|
+
console.log('pisell -v --version -V [显示版本]');
|
|
35
|
+
|
|
36
|
+
console.log('pisell deploy [上传代码|发布代码]');
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
} catch (e) {
|
|
42
|
+
console.error(e.stack);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
})();
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
#!/usr/bin/env zx
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import {
|
|
4
|
+
getCurrentProjectName,
|
|
5
|
+
getServerConfig,
|
|
6
|
+
versionSort,
|
|
7
|
+
} from '../utils/index.js';
|
|
8
|
+
import Release from './release.js';
|
|
9
|
+
|
|
10
|
+
const selectProject = () => {
|
|
11
|
+
return inquirer.prompt([
|
|
12
|
+
// {
|
|
13
|
+
// type: "list",
|
|
14
|
+
// message: "请选择项目",
|
|
15
|
+
// name: "project",
|
|
16
|
+
// choices: [
|
|
17
|
+
// {
|
|
18
|
+
// value: {
|
|
19
|
+
// fileName: "my_pisel_shop",
|
|
20
|
+
// path:"./",
|
|
21
|
+
// },
|
|
22
|
+
// name: "my_pisel_shop"
|
|
23
|
+
// },
|
|
24
|
+
// ],
|
|
25
|
+
// },
|
|
26
|
+
{
|
|
27
|
+
type: 'list',
|
|
28
|
+
message: '请选择发布环境',
|
|
29
|
+
name: 'env',
|
|
30
|
+
choices: ['release', 'pre', 'prod'],
|
|
31
|
+
},
|
|
32
|
+
]);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @Title: 选择器函数
|
|
37
|
+
* @Describe:
|
|
38
|
+
* @Author: Wzw
|
|
39
|
+
*/
|
|
40
|
+
const inquirerResult = (versionList) => {
|
|
41
|
+
return inquirer.prompt([
|
|
42
|
+
{
|
|
43
|
+
type: 'list',
|
|
44
|
+
message: '请选择发布版本号',
|
|
45
|
+
name: 'version',
|
|
46
|
+
default: versionList,
|
|
47
|
+
choices: versionList,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
type: 'confirm',
|
|
51
|
+
message: '确认发布',
|
|
52
|
+
name: 'is_release',
|
|
53
|
+
default: true,
|
|
54
|
+
},
|
|
55
|
+
]);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// 版本选择时过滤的文件夹
|
|
59
|
+
const ignoreName = ['master', '.git', 'pre-master'];
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @Title: 获取所选项目的版本号列表
|
|
63
|
+
* @Describe:
|
|
64
|
+
* @Author: Zsj
|
|
65
|
+
*/
|
|
66
|
+
const getVersionList = async ({ env, project }) => {
|
|
67
|
+
const config = await getServerConfig(project.fileName);
|
|
68
|
+
|
|
69
|
+
let host = config[env].host;
|
|
70
|
+
if (env === 'release') {
|
|
71
|
+
host = config.cn[env].host;
|
|
72
|
+
}
|
|
73
|
+
let projectName = project.fileName;
|
|
74
|
+
if (projectName === 'my_pisel_shop' && env === 'prod') {
|
|
75
|
+
projectName = 'mypisel_shop';
|
|
76
|
+
}
|
|
77
|
+
// 域名
|
|
78
|
+
const versionList = await fetch(
|
|
79
|
+
`http://${host}:3600/version?projectName=${projectName}`,
|
|
80
|
+
).then((res) => res.json());
|
|
81
|
+
|
|
82
|
+
return versionSort(versionList.filter((item) => !ignoreName.includes(item)));
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
async function init() {
|
|
86
|
+
/** 选择项目 */
|
|
87
|
+
let projectAndEnv = await selectProject();
|
|
88
|
+
|
|
89
|
+
/** 之前选择项目模式改为获取当前主项目 */
|
|
90
|
+
projectAndEnv.project = {
|
|
91
|
+
path: './',
|
|
92
|
+
fileName: getCurrentProjectName(),
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/** 通过项目和环境查询对应版本号 */
|
|
96
|
+
const versionList = await getVersionList(projectAndEnv);
|
|
97
|
+
|
|
98
|
+
const res = await inquirerResult(versionList);
|
|
99
|
+
|
|
100
|
+
const releaseInstance = new Release({ ...res, ...projectAndEnv });
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
/** 设置连接服务器配置 */
|
|
104
|
+
await releaseInstance.setConfig();
|
|
105
|
+
|
|
106
|
+
/** 连接服务器 */
|
|
107
|
+
await releaseInstance.connectServer();
|
|
108
|
+
|
|
109
|
+
/** 发布 */
|
|
110
|
+
await releaseInstance.release();
|
|
111
|
+
|
|
112
|
+
/** 断开 */
|
|
113
|
+
await releaseInstance.disconnectServer();
|
|
114
|
+
} catch (error) {
|
|
115
|
+
console.log(error);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export default init;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { outPathMap } from '../constants/index.js';
|
|
2
|
+
import {
|
|
3
|
+
connectServer,
|
|
4
|
+
getServerConfig,
|
|
5
|
+
releaseProject,
|
|
6
|
+
} from '../utils/index.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @Title: 执行发布类
|
|
10
|
+
* @Describe:
|
|
11
|
+
* @Author: Zsj
|
|
12
|
+
*/
|
|
13
|
+
class Release {
|
|
14
|
+
constructor(props) {
|
|
15
|
+
const { project, env, version, conn } = props;
|
|
16
|
+
this.projectName = project.fileName;
|
|
17
|
+
this.env = env;
|
|
18
|
+
this.version = version;
|
|
19
|
+
|
|
20
|
+
this.conn = conn;
|
|
21
|
+
this.outPath = outPathMap[this.projectName][this.env];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @Title: 设置连接服务器配置
|
|
26
|
+
* @Describe:
|
|
27
|
+
* @Author: Zsj
|
|
28
|
+
*/
|
|
29
|
+
async setConfig() {
|
|
30
|
+
const serverConfigMap = await getServerConfig(this.projectName);
|
|
31
|
+
|
|
32
|
+
let serverConfig = serverConfigMap[this.env];
|
|
33
|
+
|
|
34
|
+
// 选择release默认用国内cn服务器
|
|
35
|
+
if (this.env === 'release') {
|
|
36
|
+
serverConfig = serverConfigMap.cn[this.env];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (this.env === 'prod') {
|
|
40
|
+
serverConfig.privateKey = fs.readFileSync(
|
|
41
|
+
path.join(process.env.HOME, '.ssh', 'id_rsa'),
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
this.serverConfig = serverConfig;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @Title: 连接服务器
|
|
50
|
+
* @Describe:
|
|
51
|
+
* @Author: Zsj
|
|
52
|
+
*/
|
|
53
|
+
async connectServer() {
|
|
54
|
+
if (!this.serverConfig) {
|
|
55
|
+
console.log('未找到发布配置!');
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
this.conn = await connectServer(this.serverConfig);
|
|
59
|
+
return this.conn;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @Title: 执行发布操作
|
|
64
|
+
* @Describe:
|
|
65
|
+
* @Author: Zsj
|
|
66
|
+
*/
|
|
67
|
+
async release() {
|
|
68
|
+
return await releaseProject(this.conn, {
|
|
69
|
+
path: this.outPath,
|
|
70
|
+
fileName: `${this.version}`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @Title: 断开服务连接
|
|
76
|
+
* @Describe:
|
|
77
|
+
* @Author: Zsj
|
|
78
|
+
*/
|
|
79
|
+
async disconnectServer() {
|
|
80
|
+
return await this.conn.end();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export default Release;
|