perf: 支持邮件模版设置

This commit is contained in:
xiaojunnuo
2025-12-14 01:36:20 +08:00
parent 437d956cad
commit a6c0d2c6f1
31 changed files with 703 additions and 214 deletions
+29 -12
View File
@@ -423,31 +423,46 @@ export class Executor {
let subject = "";
let content = "";
const errorMessage = error?.message;
const templateData: any = {
pipelineId: this.pipeline.id,
historyId: this.runtime.id,
pipelineTitle: this.pipeline.title,
};
let pipelineResult = "";
let errors = "";
if (when === "start") {
subject = `开始执行,${this.pipeline.title}${this.pipeline.id}`;
pipelineResult = "开始执行";
subject = `${pipelineResult}${this.pipeline.title}${this.pipeline.id}`;
content = `流水线ID:${this.pipeline.id},运行ID:${this.runtime.id}`;
} else if (when === "success") {
subject = `执行成功,${this.pipeline.title}${this.pipeline.id}`;
pipelineResult = "执行成功";
subject = `${pipelineResult}${this.pipeline.title}${this.pipeline.id}`;
content = `流水线ID:${this.pipeline.id},运行ID:${this.runtime.id}`;
} else if (when === "turnToSuccess") {
subject = `执行成功(失败转成功)${this.pipeline.title}${this.pipeline.id}`;
pipelineResult = "执行成功(失败转成功)";
subject = `${pipelineResult}${this.pipeline.title}${this.pipeline.id}`;
content = `流水线ID:${this.pipeline.id},运行ID:${this.runtime.id}`;
} else if (when === "error") {
subject = `执行失败,${this.pipeline.title}${this.pipeline.id}`;
pipelineResult = "执行失败";
subject = `${pipelineResult}${this.pipeline.title}${this.pipeline.id}`;
if (error instanceof RunnableError) {
const runnableError = error as RunnableError;
content = `流水线ID:${this.pipeline.id},运行ID:${this.runtime.id}\n\n`;
for (const re of runnableError.errors) {
content += ` - ${re.runnable.title} 执行失败,错误详情:${re.e?.message || re.e?.error?.message}\n\n`;
errors += ` - ${re.runnable.title} 执行失败,错误详情:${re.e?.message || re.e?.error?.message}\n\n`;
}
content += errors;
} else {
errors = error.message;
content = `流水线ID:${this.pipeline.id},运行ID:${this.runtime.id}\n\n${this.currentStatusMap?.currentStep?.title} 执行失败\n\n错误详情:${error.message}`;
}
} else {
return;
}
templateData.errors = errors;
templateData.pipelineResult = pipelineResult;
for (const notification of this.pipeline.notifications) {
if (!notification.when.includes(when)) {
continue;
@@ -455,10 +470,12 @@ export class Executor {
if (notification.type === "email" && notification.options?.receivers) {
try {
await this.options.emailService?.send({
subject,
content,
receivers: notification.options?.receivers,
await this.options.emailService?.sendByTemplate({
type: "pipelineResult",
data: templateData,
email: {
receivers: notification.options?.receivers,
},
});
} catch (e) {
logger.error("send email error", e);
@@ -472,15 +489,15 @@ export class Executor {
useEmail: false,
logger: this.logger,
body: {
notificationType: "pipelineResult",
title: subject,
content,
userId: this.pipeline.userId,
pipeline: this.pipeline,
result: this.lastRuntime?.pipeline?.status,
pipelineId: this.pipeline.id,
historyId: this.runtime.id,
errorMessage,
url,
...templateData,
},
});
} catch (e) {
@@ -15,6 +15,11 @@ export type NotificationBody = {
historyId?: number;
errorMessage?: string;
url?: string;
notificationType?: string;
attachments?: any[];
pipelineResult?: string;
pipelineTitle?: string;
errors?: string;
};
export type NotificationRequestHandleReqInput<T = any> = {
@@ -6,6 +6,13 @@ export type EmailSend = {
html?: string;
};
export type EmailSendByTemplateReq = {
type: string;
data: any;
email: { receivers: string[]; attachments?: any[] };
};
export interface IEmailService {
send(email: EmailSend): Promise<void>;
sendByTemplate(req: EmailSendByTemplateReq): Promise<void>;
}