From 5c270b6b9d45a2152f9fdb3c07bd98b7c803cb8e Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 9 Sep 2024 16:01:42 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=94=AF=E6=8C=81=E7=BE=A4=E6=99=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/pipeline/src/context/index.ts | 2 - packages/core/pipeline/src/core/executor.ts | 16 +++---- .../core/pipeline/src/core/run-history.ts | 4 +- packages/core/pipeline/src/plugin/api.ts | 5 ++- packages/core/pipeline/src/utils/index.ts | 5 ++- .../core/pipeline/src/utils/util.request.ts | 43 +++++++++++++------ .../src/plugin/cert-plugin/base.ts | 17 +++----- .../src/plugin/cert-plugin/cert-reader.ts | 4 +- packages/ui/certd-server/package.json | 2 + .../src/plugins/plugin-doge/lib/index.ts | 6 +-- packages/ui/certd-server/src/utils/http.ts | 2 +- 11 files changed, 60 insertions(+), 46 deletions(-) diff --git a/packages/core/pipeline/src/context/index.ts b/packages/core/pipeline/src/context/index.ts index 5c8c6b16f..a46875744 100644 --- a/packages/core/pipeline/src/context/index.ts +++ b/packages/core/pipeline/src/context/index.ts @@ -1,6 +1,4 @@ -import { AxiosInstance } from "axios"; import { IContext } from "../core/index.js"; -export type HttpClient = AxiosInstance; export type UserContext = IContext; export type PipelineContext = IContext; diff --git a/packages/core/pipeline/src/core/executor.ts b/packages/core/pipeline/src/core/executor.ts index 110d8aed9..619c69338 100644 --- a/packages/core/pipeline/src/core/executor.ts +++ b/packages/core/pipeline/src/core/executor.ts @@ -93,7 +93,7 @@ export class Executor { await this.notification("success"); } catch (e: any) { await this.notification("error", e); - this.logger.error("pipeline 执行失败", e.stack); + this.logger.error("pipeline 执行失败", e); } finally { clearInterval(intervalFlushLogId); await this.onChanged(this.runtime); @@ -237,14 +237,13 @@ export class Executor { //判断是否需要跳过 const lastNode = this.lastStatusMap.get(step.id); const lastResult = lastNode?.status?.status; + let inputChanged = true; + const lastInputHash = lastNode?.status?.inputHash; + if (lastInputHash && newInputHash && lastInputHash === newInputHash) { + //参数有变化 + inputChanged = false; + } if (step.strategy?.runStrategy === RunStrategy.SkipWhenSucceed) { - //如果是成功后跳过策略 - let inputChanged = true; - const lastInputHash = lastNode?.status?.inputHash; - if (lastInputHash && newInputHash && lastInputHash === newInputHash) { - //参数有变化 - inputChanged = false; - } if (lastResult != null && lastResult === ResultType.success && !inputChanged) { step.status!.output = lastNode?.status?.output; step.status!.files = lastNode?.status?.files; @@ -259,6 +258,7 @@ export class Executor { lastStatus, http, logger: currentLogger, + inputChanged, accessService: this.options.accessService, emailService: this.options.emailService, pipelineContext: this.pipelineContext, diff --git a/packages/core/pipeline/src/core/run-history.ts b/packages/core/pipeline/src/core/run-history.ts index 4e4e6833b..641b18712 100644 --- a/packages/core/pipeline/src/core/run-history.ts +++ b/packages/core/pipeline/src/core/run-history.ts @@ -107,8 +107,8 @@ export class RunHistory { logError(runnable: Runnable, e: Error) { // @ts-ignore - const errorInfo = runnable.runnableType == "step" ? e.stack : e.message; - this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}] :${errorInfo}`); + const errorInfo = runnable.runnableType === "step" ? e : e.message; + this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}] :`, errorInfo); } finally(runnable: Runnable) { diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index 559f0c54c..1bc9cd3c4 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -5,8 +5,8 @@ import { Logger } from "log4js"; import { IAccessService } from "../access/index.js"; import { IEmailService } from "../service/index.js"; import { IContext } from "../core/index.js"; -import { AxiosInstance } from "axios"; import { ILogger, logger } from "../utils/index.js"; +import { HttpClient } from "../utils/util.request"; export enum ContextScope { global, @@ -60,11 +60,12 @@ export type TaskInstanceContext = { pipeline: Pipeline; step: Step; logger: Logger; + inputChanged: boolean; accessService: IAccessService; emailService: IEmailService; pipelineContext: IContext; userContext: IContext; - http: AxiosInstance; + http: HttpClient; fileStore: FileStore; lastStatus?: Runnable; signal: AbortSignal; diff --git a/packages/core/pipeline/src/utils/index.ts b/packages/core/pipeline/src/utils/index.ts index 76faa0407..7ebd48ff2 100644 --- a/packages/core/pipeline/src/utils/index.ts +++ b/packages/core/pipeline/src/utils/index.ts @@ -1,5 +1,6 @@ import sleep from "./util.sleep.js"; -import { request } from "./util.request.js"; +import { http } from "./util.request.js"; +export * from "./util.request.js"; export * from "./util.log.js"; export * from "./util.file.js"; export * from "./util.sp.js"; @@ -7,5 +8,5 @@ export * as promises from "./util.promise.js"; export * from "./util.hash.js"; export const utils = { sleep, - http: request, + http, }; diff --git a/packages/core/pipeline/src/utils/util.request.ts b/packages/core/pipeline/src/utils/util.request.ts index e9a22bd6e..8ea3d8aad 100644 --- a/packages/core/pipeline/src/utils/util.request.ts +++ b/packages/core/pipeline/src/utils/util.request.ts @@ -1,29 +1,39 @@ -import axios from "axios"; +import axios, { AxiosRequestConfig } from "axios"; import { logger } from "./util.log.js"; import { Logger } from "log4js"; export class HttpError extends Error { - request?: { url: string; method: string; data?: any }; - response?: { data: any }; status?: number; statusText?: string; + code?: string; + request?: { url: string; method: string; params?: any; data?: any }; + response?: { data: any }; + cause?: any; constructor(error: any) { if (!error) { return; } super(error.message); this.name = error.name; - this.stack = error.stack; - this.status = error?.response?.status; - this.statusText = error?.response?.statusText; + this.code = error.code; + this.cause = error.cause; + + this.status = error.response?.status; + this.statusText = error.response?.statusText; this.request = { - url: error?.response?.config?.url, - method: error?.response?.config?.method, - data: error?.response?.config?.data, + url: error.config?.url, + method: error.config?.method, + params: error.config?.params, + data: error.config?.data, }; this.response = { - data: error?.response?.data, + data: error.response?.data, }; + + delete error.response; + delete error.config; + delete error.request; + logger.error(error); } } /** @@ -35,7 +45,7 @@ export function createAxiosService({ logger }: { logger: Logger }) { // 请求拦截 service.interceptors.request.use( (config: any) => { - logger.info(`http request:${config.url},method:${config.method}`); + logger.info(`http request:${config.url},method:${config.method},params:${JSON.stringify(config.params)}`); return config; }, (error: Error) => { @@ -67,9 +77,10 @@ export function createAxiosService({ logger }: { logger: Logger }) { // default: break // } logger.error( - `请求出错:status:${error?.response?.status},statusText:${error?.response?.statusText},url:${error?.config?.url},method:${error?.config?.method}。` + `请求出错:status:${error.response?.status},statusText:${error.response?.statusText},url:${error.config?.url},method:${error.config?.method}。` ); - logger.error("返回数据:", JSON.stringify(error?.response?.data)); + logger.error("返回数据:", JSON.stringify(error.response?.data)); + if (error instanceof AggregateError) { logger.error(error); } @@ -80,4 +91,8 @@ export function createAxiosService({ logger }: { logger: Logger }) { return service; } -export const request = createAxiosService({ logger }); +export const http = createAxiosService({ logger }) as HttpClient; +export type HttpClientResponse = any; +export type HttpClient = { + request(config: AxiosRequestConfig): Promise>; +}; 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 e919be7a5..26efb8953 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts @@ -45,7 +45,7 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin { email!: string; @TaskInput({ - title: "PFX密码", + title: "PFX证书密码", component: { name: "a-input-password", vModel: "value", @@ -191,14 +191,14 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin { */ async condition() { if (this.forceUpdate) { + this.logger.info("强制更新证书选项已勾选,准备申请新证书"); return null; } - let inputChanged = false; - const oldInput = JSON.stringify(this.lastStatus?.input?.domains); - const thisInput = JSON.stringify(this.domains); - if (oldInput !== thisInput) { - inputChanged = true; + const inputChanged = this.ctx.inputChanged; + if (inputChanged) { + this.logger.info("输入参数变更,准备申请新证书"); + return null; } let oldCert: CertReader | undefined = undefined; @@ -212,11 +212,6 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin { return null; } - if (inputChanged) { - this.logger.info("输入参数变更,申请新证书"); - return null; - } - const ret = this.isWillExpire(oldCert.expires, this.renewDays); if (!ret.isWillExpire) { this.logger.info(`证书还未过期:过期时间${dayjs(oldCert.expires).format("YYYY-MM-DD HH:mm:ss")},剩余${ret.leftDays}天`); diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts index 0702b0f37..606a2aa47 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts @@ -69,13 +69,15 @@ export class CertReader { const tmpDerPath = this.saveToFile("der"); logger.info("本地文件写入成功"); try { - await opts.handle({ + return await opts.handle({ reader: this, tmpCrtPath: tmpCrtPath, tmpKeyPath: tmpKeyPath, tmpPfxPath: tmpPfxPath, tmpDerPath: tmpDerPath, }); + } catch (err) { + throw err; } finally { //删除临时文件 logger.info("删除临时文件"); diff --git a/packages/ui/certd-server/package.json b/packages/ui/certd-server/package.json index 05bd35b68..e7a183914 100644 --- a/packages/ui/certd-server/package.json +++ b/packages/ui/certd-server/package.json @@ -47,6 +47,7 @@ "cache-manager": "^3.6.3", "cron-parser": "^4.9.0", "dayjs": "^1.11.7", + "form-data": "^4.0.0", "glob": "^10.4.5", "https-proxy-agent": "^7.0.5", "iconv-lite": "^0.6.3", @@ -67,6 +68,7 @@ "ssh2": "^1.15.0", "strip-ansi": "^7.1.0", "svg-captcha": "^1.4.0", + "syno": "^2.2.0", "tencentcloud-sdk-nodejs": "^4.0.44", "typeorm": "^0.3.20" }, diff --git a/packages/ui/certd-server/src/plugins/plugin-doge/lib/index.ts b/packages/ui/certd-server/src/plugins/plugin-doge/lib/index.ts index 60de94b7c..04a41beec 100644 --- a/packages/ui/certd-server/src/plugins/plugin-doge/lib/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-doge/lib/index.ts @@ -1,13 +1,13 @@ import crypto from 'crypto'; import querystring from 'querystring'; import { DogeCloudAccess } from '../access.js'; -import { AxiosInstance } from 'axios'; +import { HttpClient } from '@certd/pipeline'; export class DogeClient { accessKey: string; secretKey: string; - http: AxiosInstance; - constructor(access: DogeCloudAccess, http: AxiosInstance) { + http: HttpClient; + constructor(access: DogeCloudAccess, http: HttpClient) { this.accessKey = access.accessKey; this.secretKey = access.secretKey; this.http = http; diff --git a/packages/ui/certd-server/src/utils/http.ts b/packages/ui/certd-server/src/utils/http.ts index a8dea0bdf..f25733217 100644 --- a/packages/ui/certd-server/src/utils/http.ts +++ b/packages/ui/certd-server/src/utils/http.ts @@ -2,7 +2,7 @@ import { utils } from '@certd/pipeline'; export async function request(config: any): Promise { try { - return await utils.http(config); + return await utils.http.request(config); } catch (e) { const data = e.data || e.response?.data; if (data) {