添加依赖管理

This commit is contained in:
whyour
2021-10-24 17:07:06 +08:00
parent bd8953ea81
commit 0c2a2af308
12 changed files with 270 additions and 159 deletions
+18
View File
@@ -87,6 +87,24 @@ export default (app: Router) => {
},
);
route.delete(
'/dependencies/force',
celebrate({
body: Joi.array().items(Joi.string().required()),
}),
async (req: Request, res: Response, next: NextFunction) => {
const logger: Logger = Container.get('logger');
try {
const dependenceService = Container.get(DependenceService);
const data = await dependenceService.removeDb(req.body);
return res.send({ code: 200, data });
} catch (e) {
logger.error('🔥 error: %o', e);
return next(e);
}
},
);
route.get(
'/dependencies/:id',
celebrate({
+5 -2
View File
@@ -24,6 +24,9 @@ export enum DependenceStatus {
'installing',
'installed',
'installFailed',
'removing',
'removed',
'removeFailed',
}
export enum DependenceTypes {
@@ -33,13 +36,13 @@ export enum DependenceTypes {
}
export enum InstallDependenceCommandTypes {
'pnpm install -g',
'npm i -g',
'pip3 install',
'apk add --no-cache',
}
export enum unInstallDependenceCommandTypes {
'pnpm uninstall -g',
'npm uninstall -g',
'pip3 uninstall',
'apk del',
}
+2 -2
View File
@@ -26,8 +26,8 @@ export default async () => {
{ multi: true },
);
// 初始化时安装所有依赖
dependenceDb.find({}).exec((err, docs) => {
// 初始化时安装所有处于安装中,安装成功,安装失败的依赖
dependenceDb.find({ status: { $in: [0, 1, 2] } }).exec((err, docs) => {
const groups = _.groupBy(docs, 'type');
for (const key in groups) {
if (Object.prototype.hasOwnProperty.call(groups, key)) {
+2
View File
@@ -30,6 +30,8 @@ export default async ({ server }: { server: Server }) => {
});
return;
} else {
conn.write(JSON.stringify({ type: 'ping', message: '404' }));
}
}
+51 -27
View File
@@ -85,11 +85,15 @@ export default class DependenceService {
public async remove(ids: string[]) {
return new Promise((resolve: any) => {
this.dependenceDb.find({ _id: { $in: ids } }).exec((err, docs) => {
this.installOrUninstallDependencies(docs, false);
this.removeDb(ids);
resolve();
});
this.dependenceDb.update(
{ _id: { $in: ids } },
{ $set: { status: DependenceStatus.removing, log: [] } },
{ multi: true, returnUpdatedDocs: true },
async (err, num, docs: Dependence[]) => {
this.installOrUninstallDependencies(docs, false);
resolve(docs);
},
);
});
}
@@ -189,19 +193,20 @@ export default class DependenceService {
? InstallDependenceCommandTypes
: unInstallDependenceCommandTypes
)[dependencies[0].type as any];
const actionText = isInstall ? '安装' : '删除';
const depIds = dependencies.map((x) => x._id) as string[];
const cp = spawn(`${depRunCommand} ${depNames}`, { shell: '/bin/bash' });
const startTime = Date.now();
this.sockService.sendMessage({
type: 'installDependence',
message: `开始安装依赖 ${depNames},开始时间 ${new Date(
message: `开始${actionText}依赖 ${depNames},开始时间 ${new Date(
startTime,
).toLocaleString()}`,
references: depIds,
});
this.updateLog(
depIds,
`开始安装依赖 ${depNames},开始时间 ${new Date(
`开始${actionText}依赖 ${depNames},开始时间 ${new Date(
startTime,
).toLocaleString()}\n`,
);
@@ -211,7 +216,7 @@ export default class DependenceService {
message: data.toString(),
references: depIds,
});
isInstall && this.updateLog(depIds, data.toString());
this.updateLog(depIds, data.toString());
});
cp.stderr.on('data', (data) => {
@@ -220,7 +225,7 @@ export default class DependenceService {
message: data.toString(),
references: depIds,
});
isInstall && this.updateLog(depIds, data.toString());
this.updateLog(depIds, data.toString());
});
cp.on('error', (err) => {
@@ -229,34 +234,53 @@ export default class DependenceService {
message: JSON.stringify(err),
references: depIds,
});
isInstall && this.updateLog(depIds, JSON.stringify(err));
this.updateLog(depIds, JSON.stringify(err));
});
cp.on('close', (code) => {
const endTime = Date.now();
const isSucceed = code === 0;
const resultText = isSucceed ? '成功' : '失败';
this.sockService.sendMessage({
type: 'installDependence',
message: `依赖安装结束,结束时间 ${new Date(
message: `依赖${actionText}${resultText},结束时间 ${new Date(
endTime,
).toLocaleString()},耗时 ${(endTime - startTime) / 1000}`,
references: depIds,
});
isInstall &&
this.updateLog(
depIds,
`依赖安装结束,结束时间 ${new Date(endTime).toLocaleString()},耗时 ${
(endTime - startTime) / 1000
}`,
);
isInstall &&
this.dependenceDb.update(
{ _id: { $in: depIds } },
{
$set: { status: DependenceStatus.installed },
$unset: { pid: true },
},
{ multi: true },
);
this.updateLog(
depIds,
`依赖${actionText}${resultText},结束时间 ${new Date(
endTime,
).toLocaleString()},耗时 ${(endTime - startTime) / 1000}`,
);
let status = null;
if (isSucceed) {
status = isInstall
? DependenceStatus.installed
: DependenceStatus.removed;
} else {
status = isInstall
? DependenceStatus.installFailed
: DependenceStatus.removeFailed;
}
this.dependenceDb.update(
{ _id: { $in: depIds } },
{
$set: { status },
$unset: { pid: true },
},
{ multi: true },
);
// 如果删除依赖成功,3秒后删除数据库记录
if (isSucceed && !isInstall) {
setTimeout(() => {
this.removeDb(depIds);
}, 5000);
}
});
}
}