diff --git a/packages/core/pipeline/src/core/executor.ts b/packages/core/pipeline/src/core/executor.ts index 1a629deee..d1e2f7d57 100644 --- a/packages/core/pipeline/src/core/executor.ts +++ b/packages/core/pipeline/src/core/executor.ts @@ -1,7 +1,7 @@ import { ConcurrencyStrategy, NotificationWhen, Pipeline, ResultType, Runnable, RunStrategy, Stage, Step, Task } from "../d.ts"; import _ from "lodash"; import { RunHistory, RunnableCollection } from "./run-history"; -import { AbstractTaskPlugin, PluginDefine, pluginRegistry } from "../plugin"; +import { AbstractTaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext } from "../plugin"; import { ContextFactory, IContext } from "./context"; import { IStorage } from "./storage"; import { logger } from "../utils/util.log"; @@ -11,6 +11,7 @@ import { IAccessService } from "../access"; import { RegistryItem } from "../registry"; import { Decorator } from "../decorator"; import { IEmailService } from "../service"; +import { FileStore } from "./file-store"; export type ExecutorOptions = { userId: any; @@ -19,6 +20,7 @@ export type ExecutorOptions = { onChanged: (history: RunHistory) => Promise; accessService: IAccessService; emailService: IEmailService; + fileRootDir?: string; }; export class Executor { pipeline: Pipeline; @@ -59,7 +61,7 @@ export class Executor { }); await this.notification("success"); } catch (e) { - await this.notification("error"); + await this.notification("error", e); this.logger.error("pipeline 执行失败", e); } finally { await this.pipelineContext.setObj("lastRuntime", this.runtime); @@ -185,28 +187,38 @@ export class Executor { } }); - const context: any = { + const taskCtx: TaskInstanceContext = { + pipeline: this.pipeline, + step, + lastStatus, + http: request, logger: this.runtime._loggers[step.id], accessService: this.options.accessService, + emailService: this.options.emailService, pipelineContext: this.pipelineContext, - lastStatus, userContext: this.contextFactory.getContext("user", this.options.userId), - http: request, + fileStore: new FileStore({ + scope: this.pipeline.id, + parent: this.runtime.id, + rootDir: this.options.fileRootDir, + }), }; - Decorator.inject(define.autowire, instance, context); + instance.setCtx(taskCtx); await instance.onInstance(); await instance.execute(); - if (instance.result.clearLastStatus) { + if (instance._result.clearLastStatus) { this.lastStatusMap.clear(); } //输出到output context _.forEach(define.output, (item, key) => { - step!.status!.output[key] = instance[key]; + step.status!.output[key] = instance[key]; const stepOutputKey = `step.${step.id}.${key}`; this.runtime.context[stepOutputKey] = instance[key]; }); + + step.status!.files = instance.getFiles(); } async notification(when: NotificationWhen, error?: any) { diff --git a/packages/core/pipeline/src/core/file-store.ts b/packages/core/pipeline/src/core/file-store.ts new file mode 100644 index 000000000..89183ec80 --- /dev/null +++ b/packages/core/pipeline/src/core/file-store.ts @@ -0,0 +1,38 @@ +import { fileUtils } from "../utils/util.file"; +import dayjs from "dayjs"; +import path from "path"; +import fs from "fs"; + +export type FileStoreOptions = { + rootDir?: string; + scope: string; + parent: string; +}; + +export class FileStore { + rootDir: string; + scope: string; + parent: string; + constructor(options?: FileStoreOptions) { + this.rootDir = fileUtils.getFileRootDir(options?.rootDir); + this.scope = options?.scope || "0"; + this.parent = options?.parent || "0"; + } + + readFile(filePath: string) { + if (!fs.existsSync(filePath)) { + return null; + } + return fs.readFileSync(filePath); + } + + writeFile(filename: string, file: Buffer) { + const localPath = this.buildFilePath(filename); + fs.writeFileSync(localPath, file); + return localPath; + } + + private buildFilePath(filename: string) { + return path.join(this.rootDir, this.scope, dayjs().format("YYYY-MM-DD"), this.parent, filename); + } +} diff --git a/packages/core/pipeline/src/core/storage.ts b/packages/core/pipeline/src/core/storage.ts index 409eb23f5..fa0ab1778 100644 --- a/packages/core/pipeline/src/core/storage.ts +++ b/packages/core/pipeline/src/core/storage.ts @@ -1,7 +1,6 @@ import fs from "fs"; import path from "path"; - - +import { fileUtils } from "../utils/util.file"; export interface IStorage { get(scope: string, namespace: string, version: string, key: string): Promise; @@ -12,15 +11,7 @@ export interface IStorage { export class FileStorage implements IStorage { root: string; constructor(rootDir?: string) { - if (rootDir == null) { - const userHome = process.env.HOME || process.env.USERPROFILE; - rootDir = userHome + "/.certd/storage/"; - } - this.root = rootDir; - - if (!fs.existsSync(this.root)) { - fs.mkdirSync(this.root, { recursive: true }); - } + this.root = fileUtils.getFileRootDir(rootDir); } async remove(scope: string, namespace: string, version: string, key: string): Promise { diff --git a/packages/core/pipeline/src/d.ts/pipeline.ts b/packages/core/pipeline/src/d.ts/pipeline.ts index af19c9d42..29b2a2504 100644 --- a/packages/core/pipeline/src/d.ts/pipeline.ts +++ b/packages/core/pipeline/src/d.ts/pipeline.ts @@ -55,6 +55,10 @@ export type Trigger = { type: string; }; +export type FileItem = { + filename: string; + path: string; +}; export type Runnable = { id: string; title: string; @@ -64,6 +68,7 @@ export type Runnable = { default?: { [key: string]: any; }; + files?: FileItem[]; }; export type EmailOptions = { @@ -113,6 +118,7 @@ export type HistoryResultGroup = { export type HistoryResult = { input: any; output: any; + files?: FileItem[]; /** * 任务状态 */ diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index 151772698..14d87dfc5 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -1,5 +1,11 @@ import { Registrable } from "../registry"; -import { FormItemProps } from "../d.ts"; +import { FileItem, FormItemProps, Pipeline, Runnable, Step } from "../d.ts"; +import { FileStore } from "../core/file-store"; +import { Logger } from "log4js"; +import { IAccessService } from "../access"; +import { IEmailService } from "../service"; +import { IContext } from "../core"; +import { AxiosInstance } from "axios"; export enum ContextScope { global, @@ -7,16 +13,11 @@ export enum ContextScope { runtime, } -export type Storage = { - scope: ContextScope; - path: string; -}; - export type TaskOutputDefine = { title: string; value?: any; - storage?: Storage; }; + export type TaskInputDefine = FormItemProps; export type PluginDefine = Registrable & { @@ -47,15 +48,56 @@ export type ITaskPlugin = { export type TaskResult = { clearLastStatus?: boolean; + files?: FileItem[]; }; +export type TaskInstanceContext = { + pipeline: Pipeline; + step: Step; + logger: Logger; + accessService: IAccessService; + emailService: IEmailService; + pipelineContext: IContext; + userContext: IContext; + http: AxiosInstance; + fileStore: FileStore; + lastStatus?: Runnable; +}; + export abstract class AbstractTaskPlugin implements ITaskPlugin { - result: TaskResult = {}; + _result: TaskResult = { clearLastStatus: false, files: [] }; + ctx!: TaskInstanceContext; clearLastStatus() { - this.result.clearLastStatus = true; + this._result.clearLastStatus = true; } + + getFiles() { + return this._result.files; + } + + setCtx(ctx: TaskInstanceContext) { + this.ctx = ctx; + } + + saveFile(filename: string, file: Buffer) { + const filePath = this.ctx.fileStore.writeFile(filename, file); + this._result.files!.push({ + filename, + path: filePath, + }); + } + + get pipeline() { + return this.ctx.pipeline; + } + + get step() { + return this.ctx.step; + } + async onInstance(): Promise { return; } + abstract execute(): Promise; } diff --git a/packages/core/pipeline/src/plugin/decorator.ts b/packages/core/pipeline/src/plugin/decorator.ts index f1ba21fe6..a6892795b 100644 --- a/packages/core/pipeline/src/plugin/decorator.ts +++ b/packages/core/pipeline/src/plugin/decorator.ts @@ -61,3 +61,11 @@ export function TaskOutput(output?: TaskOutputDefine): PropertyDecorator { Reflect.defineMetadata(PLUGIN_OUTPUT_KEY, output, target, propertyKey); }; } + +export const PLUGIN_DOWNLOAD_KEY = "pipeline:plugin:download"; +export function TaskDownload(output?: TaskOutputDefine): PropertyDecorator { + return (target, propertyKey) => { + target = Decorator.target(target, propertyKey); + Reflect.defineMetadata(PLUGIN_DOWNLOAD_KEY, output, target, propertyKey); + }; +} diff --git a/packages/core/pipeline/src/utils/util.file.ts b/packages/core/pipeline/src/utils/util.file.ts new file mode 100644 index 000000000..70ef9d6a2 --- /dev/null +++ b/packages/core/pipeline/src/utils/util.file.ts @@ -0,0 +1,16 @@ +import fs from "fs"; +function getFileRootDir(rootDir?: string) { + if (rootDir == null) { + const userHome = process.env.HOME || process.env.USERPROFILE; + rootDir = userHome + "/.certd/storage/"; + } + + if (!fs.existsSync(rootDir)) { + fs.mkdirSync(rootDir, { recursive: true }); + } + return rootDir; +} + +export const fileUtils = { + getFileRootDir, +}; diff --git a/packages/plugins/plugin-aliyun/src/plugin/deploy-to-ack-ingress/index.ts b/packages/plugins/plugin-aliyun/src/plugin/deploy-to-ack-ingress/index.ts index 25f55dc16..e2a95b228 100644 --- a/packages/plugins/plugin-aliyun/src/plugin/deploy-to-ack-ingress/index.ts +++ b/packages/plugins/plugin-aliyun/src/plugin/deploy-to-ack-ingress/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, utils } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, utils } from "@certd/pipeline"; // @ts-ignore import { ROAClient } from "@alicloud/pop-core"; import { AliyunAccess } from "../../access"; @@ -103,11 +103,13 @@ export class DeployCertToAliyunAckIngressPlugin extends AbstractTaskPlugin { }) accessId!: string; - @Autowire() accessService!: IAccessService; - @Autowire() logger!: ILogger; + async onInstance(): Promise { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { console.log("开始部署证书到阿里云cdn"); const { regionId, ingressClass, clusterId, isPrivateIpAddress, cert } = this; diff --git a/packages/plugins/plugin-aliyun/src/plugin/deploy-to-cdn/index.ts b/packages/plugins/plugin-aliyun/src/plugin/deploy-to-cdn/index.ts index 1d95e0538..d97dcee27 100644 --- a/packages/plugins/plugin-aliyun/src/plugin/deploy-to-cdn/index.ts +++ b/packages/plugins/plugin-aliyun/src/plugin/deploy-to-cdn/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline"; import dayjs from "dayjs"; import Core from "@alicloud/pop-core"; import RPCClient from "@alicloud/pop-core"; @@ -17,7 +17,7 @@ import { AliyunAccess } from "../../access"; export class DeployCertToAliyunCDN extends AbstractTaskPlugin { @TaskInput({ title: "CDN加速域名", - helper: "你在阿里云上配置的CDN加速域名,比如certd.docmirror.cn", + helper: "你在阿里云上配置的CDN加速域名,比如:certd.docmirror.cn", required: true, }) domainName!: string; @@ -49,13 +49,13 @@ export class DeployCertToAliyunCDN extends AbstractTaskPlugin { }) accessId!: string; - @Autowire() accessService!: IAccessService; - - @Autowire() logger!: ILogger; - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} + + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { console.log("开始部署证书到阿里云cdn"); const access = (await this.accessService.getById(this.accessId)) as AliyunAccess; diff --git a/packages/plugins/plugin-aliyun/src/plugin/upload-to-aliyun/index.ts b/packages/plugins/plugin-aliyun/src/plugin/upload-to-aliyun/index.ts index 42716e3c2..890126fec 100644 --- a/packages/plugins/plugin-aliyun/src/plugin/upload-to-aliyun/index.ts +++ b/packages/plugins/plugin-aliyun/src/plugin/upload-to-aliyun/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, IsTaskPlugin, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, IsTaskPlugin, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; import Core from "@alicloud/pop-core"; import { AliyunAccess } from "../../access"; import { appendTimeSuffix, checkRet, ZoneOptions } from "../../utils"; @@ -59,14 +59,13 @@ export class UploadCertToAliyun extends AbstractTaskPlugin { }) aliyunCertId!: string; - @Autowire() accessService!: IAccessService; - - @Autowire() logger!: Logger; - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { console.log("开始部署证书到阿里云cdn"); diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts index 5d19e8407..f06f48f72 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts @@ -1,9 +1,8 @@ -import { AbstractTaskPlugin, Autowire, HttpClient, IAccessService, IContext, IsTaskPlugin, RunStrategy, Step, TaskInput, TaskOutput } from "@certd/pipeline"; +import { AbstractTaskPlugin, Decorator, HttpClient, IAccessService, IContext, IsTaskPlugin, RunStrategy, Step, TaskInput, TaskOutput } from "@certd/pipeline"; import dayjs from "dayjs"; import { AcmeService, CertInfo } from "./acme"; import _ from "lodash"; import { Logger } from "log4js"; -import { Decorator } from "@certd/pipeline"; import { DnsProviderDefine, dnsProviderRegistry } from "../../dns-provider"; import { CertReader } from "./cert-reader"; @@ -109,22 +108,11 @@ export class CertApplyPlugin extends AbstractTaskPlugin { }) csrInfo: any; - // @ts-ignore - acme: AcmeService; - - @Autowire() + acme!: AcmeService; logger!: Logger; - - @Autowire() userContext!: IContext; - - @Autowire() accessService!: IAccessService; - - @Autowire() http!: HttpClient; - - @Autowire() lastStatus!: Step; @TaskOutput({ @@ -133,13 +121,19 @@ export class CertApplyPlugin extends AbstractTaskPlugin { cert?: CertInfo; async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + this.userContext = this.ctx.userContext; + this.http = this.ctx.http; + this.lastStatus = this.ctx.lastStatus as Step; + this.acme = new AcmeService({ userContext: this.userContext, logger: this.logger }); } async execute(): Promise { const oldCert = await this.condition(); if (oldCert != null) { - return this.output(oldCert); + return this.output(oldCert.toCertInfo()); } const cert = await this.doCertApply(); if (cert != null) { diff --git a/packages/plugins/plugin-host/src/lib/ssh.ts b/packages/plugins/plugin-host/src/lib/ssh.ts index 282575d94..2dfc518e5 100644 --- a/packages/plugins/plugin-host/src/lib/ssh.ts +++ b/packages/plugins/plugin-host/src/lib/ssh.ts @@ -61,6 +61,9 @@ export class SshClient { return new Promise((resolve, reject) => { this.connect({ connectConf, + onError(err: any) { + reject(err); + }, onReady: (conn: any) => { conn.exec(script, (err: Error, stream: any) => { if (err) { @@ -98,6 +101,10 @@ export class SshClient { return new Promise((resolve, reject) => { this.connect({ connectConf, + onError: (err: any) => { + this.logger.error(err); + reject(err); + }, onReady: (conn: any) => { conn.shell((err: Error, stream: any) => { if (err) { @@ -122,10 +129,13 @@ export class SshClient { }); } - connect(options: { connectConf: any; onReady: any }) { - const { connectConf, onReady } = options; + connect(options: { connectConf: any; onReady: any; onError: any }) { + const { connectConf, onReady, onError } = options; const conn = new ssh2.Client(); conn + .on("error", (err: any) => { + onError(err); + }) .on("ready", () => { this.logger.info("Client :: ready"); onReady(conn); diff --git a/packages/plugins/plugin-host/src/plugin/host-shell-execute/index.ts b/packages/plugins/plugin-host/src/plugin/host-shell-execute/index.ts index 58748f325..56bb9edee 100644 --- a/packages/plugins/plugin-host/src/plugin/host-shell-execute/index.ts +++ b/packages/plugins/plugin-host/src/plugin/host-shell-execute/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline"; import { SshClient } from "../../lib/ssh"; @IsTaskPlugin({ @@ -32,13 +32,12 @@ export class HostShellExecutePlugin extends AbstractTaskPlugin { }) script!: string; - @Autowire() accessService!: IAccessService; - @Autowire() logger!: ILogger; - - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { const { script, accessId } = this; const connectConf = await this.accessService.getById(accessId); diff --git a/packages/plugins/plugin-host/src/plugin/upload-to-host/index.ts b/packages/plugins/plugin-host/src/plugin/upload-to-host/index.ts index 782899374..851cb6bdf 100644 --- a/packages/plugins/plugin-host/src/plugin/upload-to-host/index.ts +++ b/packages/plugins/plugin-host/src/plugin/upload-to-host/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; import { SshClient } from "../../lib/ssh"; import { CertInfo, CertReader } from "@certd/plugin-cert"; import * as fs from "fs"; @@ -49,11 +49,6 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin { }) sudo!: boolean; - @Autowire() - accessService!: IAccessService; - @Autowire() - logger!: ILogger; - @TaskOutput({ title: "证书保存路径", }) @@ -64,7 +59,13 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin { }) hostKeyPath!: string; - async onInstance() {} + accessService!: IAccessService; + logger!: ILogger; + + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { const { crtPath, keyPath, cert, accessId, sudo } = this; const certReader = new CertReader(cert); diff --git a/packages/plugins/plugin-tencent/src/plugin/deploy-to-cdn/index.ts b/packages/plugins/plugin-tencent/src/plugin/deploy-to-cdn/index.ts index 95d3358be..357922cff 100644 --- a/packages/plugins/plugin-tencent/src/plugin/deploy-to-cdn/index.ts +++ b/packages/plugins/plugin-tencent/src/plugin/deploy-to-cdn/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline"; import tencentcloud from "tencentcloud-sdk-nodejs/index"; import { TencentAccess } from "../../access"; import { CertInfo } from "@certd/plugin-cert"; @@ -47,14 +47,14 @@ export class DeployToCdnPlugin extends AbstractTaskPlugin { }) domainName!: string; - @Autowire() accessService!: IAccessService; - @Autowire() logger!: ILogger; - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { const accessProvider: TencentAccess = (await this.accessService.getById(this.accessId)) as TencentAccess; diff --git a/packages/plugins/plugin-tencent/src/plugin/deploy-to-clb/index.ts b/packages/plugins/plugin-tencent/src/plugin/deploy-to-clb/index.ts index 8a585c80a..59dadbb18 100644 --- a/packages/plugins/plugin-tencent/src/plugin/deploy-to-clb/index.ts +++ b/packages/plugins/plugin-tencent/src/plugin/deploy-to-clb/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, utils } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, utils } from "@certd/pipeline"; import tencentcloud from "tencentcloud-sdk-nodejs/index"; import { TencentAccess } from "../../access"; import dayjs from "dayjs"; @@ -71,14 +71,13 @@ export class DeployToClbPlugin extends AbstractTaskPlugin { }) accessId!: string; - @Autowire() accessService!: IAccessService; - - @Autowire() logger!: ILogger; - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { const accessProvider = (await this.accessService.getById(this.accessId)) as TencentAccess; const client = this.getClient(accessProvider, this.region); diff --git a/packages/plugins/plugin-tencent/src/plugin/deploy-to-tke-ingress/index.ts b/packages/plugins/plugin-tencent/src/plugin/deploy-to-tke-ingress/index.ts index 244fc68ca..21d36a6c0 100644 --- a/packages/plugins/plugin-tencent/src/plugin/deploy-to-tke-ingress/index.ts +++ b/packages/plugins/plugin-tencent/src/plugin/deploy-to-tke-ingress/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, IsTaskPlugin, RunStrategy, TaskInput, utils } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, IsTaskPlugin, RunStrategy, TaskInput, utils } from "@certd/pipeline"; import tencentcloud from "tencentcloud-sdk-nodejs/index"; import { K8sClient } from "@certd/plugin-util"; import dayjs from "dayjs"; @@ -80,15 +80,12 @@ export class DeployCertToTencentTKEIngressPlugin extends AbstractTaskPlugin { }) cert!: any; - @Autowire() logger!: Logger; - - @Autowire() accessService!: IAccessService; - - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} - + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { const accessProvider = this.accessService.getById(this.accessId); const tkeClient = this.getTkeClient(accessProvider, this.region); diff --git a/packages/plugins/plugin-tencent/src/plugin/upload-to-tencent/index.ts b/packages/plugins/plugin-tencent/src/plugin/upload-to-tencent/index.ts index 52fcea094..8e9ad086c 100644 --- a/packages/plugins/plugin-tencent/src/plugin/upload-to-tencent/index.ts +++ b/packages/plugins/plugin-tencent/src/plugin/upload-to-tencent/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; import tencentcloud from "tencentcloud-sdk-nodejs/index"; import dayjs from "dayjs"; @@ -42,14 +42,13 @@ export class UploadToTencentPlugin extends AbstractTaskPlugin { }) tencentCertId?: string; - @Autowire() accessService!: IAccessService; - - @Autowire() logger!: ILogger; - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { const { accessId, name, cert } = this; diff --git a/packages/ui/certd-client/package.json b/packages/ui/certd-client/package.json index e0156a97a..2a9d3364d 100644 --- a/packages/ui/certd-client/package.json +++ b/packages/ui/certd-client/package.json @@ -63,6 +63,7 @@ "@rollup/plugin-commonjs": "^23.0.4", "@rollup/plugin-node-resolve": "^15.0.1", "@types/chai": "^4.3.4", + "@types/lodash": "^4.14.195", "@types/mocha": "^10.0.1", "@types/node": "^18.11.15", "@typescript-eslint/eslint-plugin": "^5.46.1", diff --git a/packages/ui/certd-client/public/images/preview.png b/packages/ui/certd-client/public/images/preview.png new file mode 100644 index 000000000..0545a79d5 Binary files /dev/null and b/packages/ui/certd-client/public/images/preview.png differ diff --git a/packages/ui/certd-client/public/logo.svg b/packages/ui/certd-client/public/logo.svg index 1b1395a16..edcdefbed 100644 --- a/packages/ui/certd-client/public/logo.svg +++ b/packages/ui/certd-client/public/logo.svg @@ -1,106 +1,7 @@ - - - - - - - - - - - - - - - - - - - + + diff --git a/packages/ui/certd-client/src/store/modules/resource.ts b/packages/ui/certd-client/src/store/modules/resource.ts index 49a0c3a38..54ede0c51 100644 --- a/packages/ui/certd-client/src/store/modules/resource.ts +++ b/packages/ui/certd-client/src/store/modules/resource.ts @@ -30,13 +30,19 @@ export const useResourceStore = defineStore({ currentAsidePath: "" }), getters: { + // @ts-ignore getAsideMenus() { + // @ts-ignore return this.asideMenus; }, + // @ts-ignore getHeaderMenus() { + // @ts-ignore return this.headerMenus; }, + // @ts-ignore getFrameworkMenus() { + // @ts-ignore return this.frameworkMenus; } }, @@ -54,17 +60,17 @@ export const useResourceStore = defineStore({ this.inited = true; const showMenus = _.cloneDeep(frameworkMenus[0].children); - this.frameworkMenus = filterMenus(showMenus, (item) => { + this.frameworkMenus = filterMenus(showMenus, (item: any) => { return item?.meta?.showOnHeader !== false; }); - this.fixedAsideMenus = findMenus(showMenus, (item) => { + this.fixedAsideMenus = findMenus(showMenus, (item: any) => { return item?.meta?.fixedAside === true; }); this.headerMenus = headerMenus; this.setAsideMenu(); }, - setAsideMenu(topMenu?) { + setAsideMenu(topMenu?: any) { if (this.frameworkMenus.length === 0) { return; } @@ -74,13 +80,13 @@ export const useResourceStore = defineStore({ const asideMenus = topMenu?.children || []; this.asideMenus = [...this.fixedAsideMenus, ...asideMenus]; }, - setAsideMenuByCurrentRoute(matched) { + setAsideMenuByCurrentRoute(matched: any) { const menuHeader = this.frameworkMenus; if (matched?.length <= 1) { return; } - function findFromTree(tree, find) { + function findFromTree(tree: any, find: any) { const results: Array = []; for (const item of tree) { if (find(item)) { @@ -88,7 +94,7 @@ export const useResourceStore = defineStore({ return results; } if (item.children && item.children.length > 0) { - const found = findFromTree(item.children, find); + const found: any = findFromTree(item.children, find); if (found) { results.push(item); return results.concat(found); @@ -97,7 +103,7 @@ export const useResourceStore = defineStore({ } } const matchedPath = matched[1].path; - const _side = findFromTree(menuHeader, (menu) => menu.path === matchedPath); + const _side = findFromTree(menuHeader, (menu: any) => menu.path === matchedPath); if (_side?.length > 0) { if (this.currentAsidePath === _side[0]) { return; @@ -106,11 +112,11 @@ export const useResourceStore = defineStore({ this.setAsideMenu(_side[0]); } }, - filterByPermission(permissions) { + filterByPermission(permissions: any) { this.frameworkMenus = this.filterChildrenByPermission(this.frameworkMenus, permissions); }, - filterChildrenByPermission(list, permissions) { - const menus = list.filter((item) => { + filterChildrenByPermission(list: any, permissions: any) { + const menus = list.filter((item: any) => { if (item?.meta?.permission) { return permissions.includes(item.meta.permission); } diff --git a/packages/ui/certd-client/src/store/modules/settings.ts b/packages/ui/certd-client/src/store/modules/settings.ts index c5fc0446c..0b0b39c3b 100644 --- a/packages/ui/certd-client/src/store/modules/settings.ts +++ b/packages/ui/certd-client/src/store/modules/settings.ts @@ -51,7 +51,7 @@ export const useSettingStore = defineStore({ this.persistTheme(); // await changeTheme(this.theme.primaryColor); }, - async setPrimaryColor(color) { + async setPrimaryColor(color: any) { const theme = this.theme; theme.primaryColor = color; await this.setTheme(); diff --git a/packages/ui/certd-client/src/utils/util.common.ts b/packages/ui/certd-client/src/utils/util.common.ts index 27468b30a..7292e7f44 100644 --- a/packages/ui/certd-client/src/utils/util.common.ts +++ b/packages/ui/certd-client/src/utils/util.common.ts @@ -1,13 +1,13 @@ import _ from "lodash"; export default { - arrayToMap(array) { + arrayToMap(array: any) { if (!array) { return {}; } if (!_.isArray(array)) { return array; } - const map = {}; + const map: any = {}; for (const item of array) { if (item.key) { map[item.key] = item; @@ -15,7 +15,7 @@ export default { } return map; }, - mapToArray(map) { + mapToArray(map: any) { if (!map) { return []; } diff --git a/packages/ui/certd-client/src/views/certd/access/crud.tsx b/packages/ui/certd-client/src/views/certd/access/crud.tsx index a7fe92ebe..30a505126 100644 --- a/packages/ui/certd-client/src/views/certd/access/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/access/crud.tsx @@ -57,6 +57,9 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti name: { title: "名称", type: "text", + search: { + show: true + }, form: { rules: [{ required: true, message: "必填项" }] } diff --git a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue index b2d3396bf..d9e81aa46 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue @@ -2,6 +2,7 @@
+
@@ -588,6 +589,7 @@ export default defineComponent({ pipeline, currentHistory, histories, + goBack, ...useTaskRet, ...useStageRet, ...useTrigger(), @@ -602,6 +604,10 @@ export default defineComponent({ .page-pipeline-edit { .fs-page-header { .title { + display: flex; + .back { + margin-right: 10px; + } .pi-editable { width: 300px; } diff --git a/packages/ui/certd-client/src/views/framework/home/content/image/preview.png b/packages/ui/certd-client/src/views/framework/home/content/image/preview.png deleted file mode 100644 index eab5a642d..000000000 Binary files a/packages/ui/certd-client/src/views/framework/home/content/image/preview.png and /dev/null differ diff --git a/packages/ui/certd-client/src/views/framework/home/content/index.vue b/packages/ui/certd-client/src/views/framework/home/content/index.vue index b6d2422c7..38028404f 100644 --- a/packages/ui/certd-client/src/views/framework/home/content/index.vue +++ b/packages/ui/certd-client/src/views/framework/home/content/index.vue @@ -5,7 +5,7 @@

让你的证书永不过期

- +