diff --git a/packages/core/pipeline/src/core/executor.ts b/packages/core/pipeline/src/core/executor.ts index cabb9c2ad..3d7ef07ff 100644 --- a/packages/core/pipeline/src/core/executor.ts +++ b/packages/core/pipeline/src/core/executor.ts @@ -12,7 +12,7 @@ import { RegistryItem } from "../registry/index.js"; import { Decorator } from "../decorator/index.js"; import { IEmailService } from "../service/index.js"; import { FileStore } from "./file-store.js"; -import { hashUtils } from "../utils/index.js"; +import { hashUtils, utils } from "../utils/index.js"; // import { TimeoutPromise } from "../utils/util.promise.js"; export type ExecutorOptions = { @@ -276,6 +276,7 @@ export class Executor { rootDir: this.options.fileRootDir, }), signal: this.abort.signal, + utils, }; instance.setCtx(taskCtx); diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index 1bc9cd3c4..3436bd41e 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -7,7 +7,7 @@ import { IEmailService } from "../service/index.js"; import { IContext } from "../core/index.js"; import { ILogger, logger } from "../utils/index.js"; import { HttpClient } from "../utils/util.request"; - +import { utils } from "../utils/index.js"; export enum ContextScope { global, pipeline, @@ -57,18 +57,32 @@ export type TaskResult = { pipelineVars: Record; }; export type TaskInstanceContext = { + //流水线定义 pipeline: Pipeline; + //步骤定义 step: Step; + //日志 logger: Logger; + //当前步骤输入参数跟上一次执行比较是否有变化 inputChanged: boolean; + //授权获取服务 accessService: IAccessService; + //邮件服务 emailService: IEmailService; + //流水线上下文 pipelineContext: IContext; + //用户上下文 userContext: IContext; + //http请求客户端 http: HttpClient; + //文件存储 fileStore: FileStore; + //上一次执行结果状态 lastStatus?: Runnable; + //用户取消信号 signal: AbortSignal; + //工具类 + utils: typeof utils; }; export abstract class AbstractTaskPlugin implements ITaskPlugin { diff --git a/packages/core/pipeline/src/utils/index.ts b/packages/core/pipeline/src/utils/index.ts index 7ebd48ff2..972d453be 100644 --- a/packages/core/pipeline/src/utils/index.ts +++ b/packages/core/pipeline/src/utils/index.ts @@ -4,9 +4,19 @@ export * from "./util.request.js"; export * from "./util.log.js"; export * from "./util.file.js"; export * from "./util.sp.js"; -export * as promises from "./util.promise.js"; +export * from "./util.promise.js"; export * from "./util.hash.js"; +import { sp } from "./util.sp.js"; +import { hashUtils } from "./util.hash.js"; +import { promises } from "./util.promise.js"; +import { fileUtils } from "./util.file.js"; +import _ from "lodash-es"; export const utils = { sleep, http, + sp, + hash: hashUtils, + promises, + file: fileUtils, + _, }; diff --git a/packages/core/pipeline/src/utils/util.promise.ts b/packages/core/pipeline/src/utils/util.promise.ts index 5757e4b67..81e5f8fcc 100644 --- a/packages/core/pipeline/src/utils/util.promise.ts +++ b/packages/core/pipeline/src/utils/util.promise.ts @@ -24,3 +24,8 @@ export function safePromise(callback: (resolve: (ret: T) => void, reject: (re } }); } + +export const promises = { + TimeoutPromise, + safePromise, +}; diff --git a/packages/ui/certd-client/src/style/common.less b/packages/ui/certd-client/src/style/common.less index edf517d65..41cb8f55b 100644 --- a/packages/ui/certd-client/src/style/common.less +++ b/packages/ui/certd-client/src/style/common.less @@ -186,10 +186,15 @@ h1, h2, h3, h4, h5, h6 { } -.disabled{ - color: #c7c7c7; -} .deleted{ + color: #c7c7c7; //删除线 text-decoration: line-through; +} + +.cursor-move{ + cursor: move !important; +} +.cursor-pointer{ + cursor: pointer; } \ No newline at end of file diff --git a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/task-form/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/task-form/index.vue index 4d20cf0e9..897945d3a 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/task-form/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/task-form/index.vue @@ -51,11 +51,11 @@

{{ element.title }}

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 c523ebcd7..15c85b91f 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 @@ -354,7 +354,7 @@ export default defineComponent({ await loadHistoryList(); } - if (!currentHistory.value) { + if (currentHistory.value != null) { if (currentHistory.value.pipeline?.status?.status === "start") { await loadCurrentHistoryDetail(); } else { @@ -614,6 +614,9 @@ export default defineComponent({ saveLoading.value = true; try { if (props.options.doSave) { + if (pipeline.value.version == null) { + pipeline.value.version = 0; + } pipeline.value.version++; currentPipeline.value = pipeline.value; await props.options.doSave(pipeline.value); diff --git a/packages/ui/certd-server/src/plugins/plugin-other/plugins/index.ts b/packages/ui/certd-server/src/plugins/plugin-other/plugins/index.ts index e16686c76..132d5f205 100644 --- a/packages/ui/certd-server/src/plugins/plugin-other/plugins/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-other/plugins/index.ts @@ -1 +1,2 @@ export * from './plugin-k8s.js'; +export * from './plugin-script.js'; diff --git a/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-script.ts b/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-script.ts new file mode 100644 index 000000000..254c3e769 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-script.ts @@ -0,0 +1,58 @@ +import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskInstanceContext } from '@certd/pipeline'; +import { CertInfo, CertReader } from '@certd/plugin-cert'; + +export type CustomScriptContext = { + CertReader: typeof CertReader; + self: CustomScriptPlugin; +} & TaskInstanceContext; + +@IsTaskPlugin({ + name: 'CustomScript', + title: '自定义js脚本', + desc: '测试', + group: pluginGroups.other.key, + default: { + strategy: { + runStrategy: RunStrategy.SkipWhenSucceed, + }, + }, +}) +export class CustomScriptPlugin extends AbstractTaskPlugin { + @TaskInput({ + title: '脚本', + helper: '自定义js脚本', + component: { + name: 'a-textarea', + vModel: 'value', + rows: 10, + style: 'background-color: #000c17;color: #fafafa;', + }, + required: true, + }) + script!: string; + + @TaskInput({ + title: '域名证书', + helper: '请选择前置任务输出的域名证书', + component: { + name: 'pi-output-selector', + from: 'CertApply', + }, + required: true, + }) + cert!: CertInfo; + + async onInstance() {} + async execute(): Promise { + this.logger.info('执行自定义脚本:\n', this.script); + const ctx: CustomScriptContext = { + CertReader, + self: this, + ...this.ctx, + }; + const AsyncFunction = Object.getPrototypeOf(async () => {}).constructor; + const func = new AsyncFunction('ctx', this.script); + return await func(ctx); + } +} +new CustomScriptPlugin();