From fbb66f3c4389489aa8a43b194d82bc8cf391607b Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sat, 22 Mar 2025 02:06:02 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=89=8B=E5=8A=A8=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E8=AF=81=E4=B9=A6=E9=83=A8=E7=BD=B2=E6=B5=81=E6=B0=B4=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/plugin/cert-plugin/base-convert.ts | 11 + .../src/plugin/cert-plugin/base.ts | 10 +- .../src/plugin/cert-plugin/custom/d.ts | 5 - .../src/plugin/cert-plugin/custom/index.ts | 62 +++--- .../plugins/plugin-cert/src/plugin/index.ts | 2 + packages/ui/certd-client/package.json | 1 + .../src/components/plugins/index.ts | 2 +- .../src/views/certd/monitor/cert/crud.tsx | 27 ++- .../src/views/certd/monitor/cert/index.vue | 8 +- .../src/views/certd/pipeline/api.ts | 28 +-- .../cert-upload}/index.vue | 46 ++-- .../views/certd/pipeline/cert-upload/use.tsx | 192 +++++++++-------- .../views/certd/pipeline/certd-form/use.ts | 3 +- .../component/shortcut/task-shortcut.vue | 3 +- .../component/shortcut/task-shortcuts.vue | 1 + .../views/certd/pipeline/pipeline/index.vue | 32 +-- .../src/views/certd/pipeline/utils.ts | 70 +++++- .../user/monitor/cert-info-controller.ts | 56 ++--- .../user/pipeline/handle-controller.ts | 4 - .../auto/auto-e-pipeline-emitter-register.ts | 14 +- .../monitor/service/cert-info-service.ts | 12 +- .../monitor/service/cert-upload-service.ts | 203 ------------------ .../service/cert-apply-upload-service.ts | 28 --- .../pipeline/service/pipeline-service.ts | 14 +- pnpm-lock.yaml | 6 + 25 files changed, 329 insertions(+), 511 deletions(-) delete mode 100644 packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/d.ts rename packages/ui/certd-client/src/views/certd/{monitor/cert/updater => pipeline/cert-upload}/index.vue (50%) delete mode 100644 packages/ui/certd-server/src/modules/monitor/service/cert-upload-service.ts delete mode 100644 packages/ui/certd-server/src/modules/pipeline/service/cert-apply-upload-service.ts diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base-convert.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base-convert.ts index 36da600a..9301e144 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base-convert.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base-convert.ts @@ -4,6 +4,7 @@ import type { CertInfo } from "./acme.js"; import { CertReader } from "./cert-reader.js"; import JSZip from "jszip"; import { CertConverter } from "./convert.js"; +export const EVENT_CERT_APPLY_SUCCESS = "CertApply.success"; export abstract class CertApplyBaseConvertPlugin extends AbstractTaskPlugin { @TaskInput({ @@ -76,6 +77,16 @@ export abstract class CertApplyBaseConvertPlugin extends AbstractTaskPlugin { abstract onInit(): Promise; + //必须output之后执行 + async emitCertApplySuccess() { + const emitter = this.ctx.emitter; + const value = { + cert: this.cert, + file: this._result.files[0].path, + }; + await emitter.emit(EVENT_CERT_APPLY_SUCCESS, value); + } + async output(certReader: CertReader, isNew: boolean) { const cert: CertInfo = certReader.toCertInfo(); this.cert = cert; diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts index fa5be9a6..46bf9efb 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts @@ -1,15 +1,9 @@ -import { NotificationBody, Step, TaskEmitter, TaskInput } from "@certd/pipeline"; +import { NotificationBody, Step, TaskInput } from "@certd/pipeline"; import dayjs from "dayjs"; import { CertReader } from "./cert-reader.js"; import { pick } from "lodash-es"; import { CertApplyBaseConvertPlugin } from "./base-convert.js"; -export const EVENT_CERT_APPLY_SUCCESS = "CertApply.success"; - -export async function emitCertApplySuccess(emitter: TaskEmitter, cert: CertReader) { - await emitter.emit(EVENT_CERT_APPLY_SUCCESS, cert); -} - export abstract class CertApplyBasePlugin extends CertApplyBaseConvertPlugin { @TaskInput({ title: "邮箱", @@ -75,7 +69,7 @@ export abstract class CertApplyBasePlugin extends CertApplyBaseConvertPlugin { if (cert != null) { await this.output(cert, true); - await emitCertApplySuccess(this.ctx.emitter, cert); + await this.emitCertApplySuccess(); //清空后续任务的状态,让后续任务能够重新执行 this.clearLastStatus(); diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/d.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/d.ts deleted file mode 100644 index 619ff4a4..00000000 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { CertInfo } from "../acme"; -export interface ICertApplyUploadService { - getCertInfo: (opts: { certId: number; userId: number }) => Promise; - updateCert: (opts: { certId: number; cert: CertInfo; userId: number }) => Promise; -} diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/index.ts index de57aa58..27566afb 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/index.ts @@ -2,9 +2,8 @@ import { IsTaskPlugin, pluginGroups, RunStrategy, Step, TaskInput, TaskOutput } import type { CertInfo } from "../acme.js"; import { CertReader } from "../cert-reader.js"; import { CertApplyBaseConvertPlugin } from "../base-convert.js"; -export * from "./d.js"; import dayjs from "dayjs"; -import { ICertApplyUploadService } from "./d"; + export { CertReader }; export type { CertInfo }; @IsTaskPlugin({ @@ -84,7 +83,7 @@ export class CertApplyUploadPlugin extends CertApplyBaseConvertPlugin { } `, }) - certInfoId!: string; + uploadCert!: CertInfo; @TaskOutput({ title: "证书MD5", @@ -100,14 +99,7 @@ export class CertApplyUploadPlugin extends CertApplyBaseConvertPlugin { async onInit(): Promise {} async getCertFromStore() { - const certApplyUploadService: ICertApplyUploadService = await this.ctx.serviceGetter.get("CertApplyUploadService"); - - const certInfo = await certApplyUploadService.getCertInfo({ - certId: Number(this.certInfoId), - userId: this.pipeline.userId, - }); - - const certReader = new CertReader(certInfo); + const certReader = new CertReader(this.uploadCert); if (!certReader.expires && certReader.expires < new Date().getTime()) { throw new Error("证书已过期,停止部署,请重新上传证书"); } @@ -121,39 +113,43 @@ export class CertApplyUploadPlugin extends CertApplyBaseConvertPlugin { const leftDays = dayjs(certReader.expires).diff(dayjs(), "day"); this.logger.info(`证书过期时间${dayjs(certReader.expires).format("YYYY-MM-DD HH:mm:ss")},剩余${leftDays}天`); - const lastCrtMd5 = this.lastStatus?.status?.output?.certMd5; - this.logger.info("证书MD5", crtMd5); - this.logger.info("上次证书MD5", lastCrtMd5); - if (lastCrtMd5 === crtMd5) { - this.logger.info("证书无变化,跳过"); - //输出证书MD5 - this.certMd5 = crtMd5; - await this.output(certReader, false); - return "skip"; + + if (!this.ctx.inputChanged) { + this.logger.info("输入参数无变化"); + const lastCrtMd5 = this.lastStatus?.status?.output?.certMd5; + this.logger.info("证书MD5", crtMd5); + this.logger.info("上次证书MD5", lastCrtMd5); + if (lastCrtMd5 === crtMd5) { + this.logger.info("证书无变化,跳过"); + //输出证书MD5 + this.certMd5 = crtMd5; + await this.output(certReader, false); + return "skip"; + } + this.logger.info("证书有变化,重新部署"); + } else { + this.logger.info("输入参数有变化,重新部署"); } - this.logger.info("证书有变化,重新部署"); + this.clearLastStatus(); //输出证书MD5 this.certMd5 = crtMd5; await this.output(certReader, true); + + //必须output之后执行 + await this.emitCertApplySuccess(); return; } async onCertUpdate(data: any) { - const certApplyUploadService = await this.ctx.serviceGetter.get("CertApplyUploadService"); - - const res = await certApplyUploadService.updateCert({ - certId: this.certInfoId, - userId: this.ctx.user.id, - cert: { - crt: data.crt, - key: data.key, - }, - }); - + const certReader = new CertReader(data); return { input: { - domains: res.domains, + uploadCert: { + crt: data.crt, + key: data.key, + }, + domains: certReader.getAllDomains(), }, }; } diff --git a/packages/plugins/plugin-cert/src/plugin/index.ts b/packages/plugins/plugin-cert/src/plugin/index.ts index 4cf3f4aa..f563084c 100644 --- a/packages/plugins/plugin-cert/src/plugin/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/index.ts @@ -1,3 +1,5 @@ +export { EVENT_CERT_APPLY_SUCCESS } from "./cert-plugin/base-convert.js"; + export * from "./cert-plugin/index.js"; export * from "./cert-plugin/lego/index.js"; export * from "./cert-plugin/custom/index.js"; diff --git a/packages/ui/certd-client/package.json b/packages/ui/certd-client/package.json index 2006cf96..7e5713b0 100644 --- a/packages/ui/certd-client/package.json +++ b/packages/ui/certd-client/package.json @@ -67,6 +67,7 @@ "lucide-vue-next": "^0.477.0", "mitt": "^3.0.1", "nanoid": "^4.0.0", + "node-forge": "^1.3.1", "nprogress": "^0.2.0", "object-assign": "^4.1.1", "pinia": "2.1.7", diff --git a/packages/ui/certd-client/src/components/plugins/index.ts b/packages/ui/certd-client/src/components/plugins/index.ts index edb9db49..aba2ab19 100644 --- a/packages/ui/certd-client/src/components/plugins/index.ts +++ b/packages/ui/certd-client/src/components/plugins/index.ts @@ -5,8 +5,8 @@ import OutputSelector from "/@/components/plugins/common/output-selector/index.v import DnsProviderSelector from "/@/components/plugins/cert/dns-provider-selector/index.vue"; import DomainsVerifyPlanEditor from "/@/components/plugins/cert/domains-verify-plan-editor/index.vue"; import AccessSelector from "/@/views/certd/access/access-selector/index.vue"; -import CertInfoUpdater from "/@/views/certd/monitor/cert/updater/index.vue"; import InputPassword from "./common/input-password.vue"; +import CertInfoUpdater from "/@/views/certd/pipeline/cert-upload/index.vue"; import ApiTest from "./common/api-test.vue"; export * from "./cert/index.js"; export default { diff --git a/packages/ui/certd-client/src/views/certd/monitor/cert/crud.tsx b/packages/ui/certd-client/src/views/certd/monitor/cert/crud.tsx index 3ed9e672..65dc4f9c 100644 --- a/packages/ui/certd-client/src/views/certd/monitor/cert/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/monitor/cert/crud.tsx @@ -109,24 +109,23 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat }, copy: { show: false }, edit: { show: false }, - upload: { - show: compute(({ row }) => { - return row.fromType === "upload"; - }), - order: 4, - title: "更新证书", - type: "link", - icon: "ion:upload", - async click({ row }) { - await openUpdateCertDialog({ - id: row.id, - }); - }, - }, remove: { order: 10, show: false, }, + download: { + order: 9, + title: "下载证书", + type: "link", + icon: "ant-design:download-outlined", + async click({ row }) { + if (!row.certFile) { + notification.error({ message: "证书还未生成,请先运行流水线" }); + return; + } + window.open("/api/monitor/cert/download?id=" + row.id); + }, + }, }, }, columns: { diff --git a/packages/ui/certd-client/src/views/certd/monitor/cert/index.vue b/packages/ui/certd-client/src/views/certd/monitor/cert/index.vue index 7a4a9e34..ad696cb4 100644 --- a/packages/ui/certd-client/src/views/certd/monitor/cert/index.vue +++ b/packages/ui/certd-client/src/views/certd/monitor/cert/index.vue @@ -3,7 +3,7 @@ @@ -11,12 +11,12 @@