import yaml from "js-yaml"; import { CertApplyPluginNames } from "@certd/plugin-cert"; export function getDefaultAccessPlugin() { const metadata = ` input: username: # 授权参数名 title: 用户名 # 授权参数标题 required: true # 是否必填项 encrypt: false # 是否加密 component: # 输入组件配置 name: a-input #输入组件名称 allowClear: true # 组件的参数,参考 https://www.antdv.com/components/input#api password: title: 密码 required: true encrypt: true component: name: a-input allowClear: true ` const script = ` # 必须使用 await import 来引入模块 const { BaseAccess } = await import("@certd/pipeline") # 需要返回一个继承BaseAccess的类 return class DemoAccess extends BaseAccess { # 授权的字段,跟左边input一一对应 username; password; } `; return { metadata:yaml.dump(metadata), content: script }; } export function getDefaultDeployPlugin() { let certApplyNames = '' for (const name of CertApplyPluginNames) { certApplyNames += ` - ${name}` } const metadata =` input: # 插件的输入参数 cert: title: 前置任务证书 helper: 请选择前置任务产生的证书 # 帮助说明 component: name: output-selector # 输入组件名称 vModel: modelValue # 组件参数 from:${certApplyNames} required: true certDomains: title: 当前证书域名 component: name: cert-domains-getter mergeScript: | return { component:{ inputKey: ctx.compute(({form})=>{ return form.cert }), } } required: true accessId: title: Access授权 helper: xxxx的授权 component: name: access-selector # 授权选择组件名称 type: aliyun # 授权类型 required: true key1: title: 输入示例1 required: false key2: title: 可选项 component: name: a-select vMode: value options: - value: "1" label: 选项1 - value: "2" label: 选项2 required: false #output: # 输出参数,一般插件都不需要配置此项 # outputName: # ` const script = ` // 要用await来import模块 const { AbstractTaskPlugin } = await import("@certd/pipeline") // 要返回一个继承AbstractTaskPlugin的class return class DemoTask extends AbstractTaskPlugin { // 这里是插件的输入参数,对应左边的input配置 cert; certDomains; accessId; key1; key2; // 编写执行方法 async execute(){ # 根据accessId获取授权配置 const access = await this.getAccess(this.accessId) //必须使用this.logger打印日志 // this.logger.info("cert:",this.cert); this.logger.info("certDomains:",this.certDomains); this.logger.info("access:",access); this.logger.info("key1:",this.key1); this.logger.info("key2:",this.key2); // 开始你的部署任务 // this.ctx里面有一些常用的方法类,比如utils、http、logger等 const res = await this.ctx.http.request({url:"https://www.baidu.com"}) if(res.error){ //抛出异常,终止任务,否则将被判定为执行成功 throw new Error("部署失败:"+res.message) } this.logger.info("执行成功") // this.outputName = xxxx //设置输出参数,可以被其他插件选择使用 } } ` return { metadata: yaml.dump(metadata), content: script }; } export function getDefaultDnsPlugin() { const metadata = ` accessType: aliyun # 授权类型名称 #dependPlugins: # 依赖第三方库,安装插件时会安装依赖库,尽量使用certd已安装的库,比如http、lodash-es、utils # @alicloud/openapi-client: ^0.4.12 #dependLibs: # 依赖的插件,应用商店安装时会先安装依赖插件 # aliyun: * ` const script = ` const { AbstractDnsProvider } = await import("@certd/pipeline") return class DemoDnsProvider extends AbstractDnsProvider { // 创建dns解析记录,用于验证域名所有权 async createRecord(options) { /** * fullRecord: '_acme-challenge.test.example.com', * value: 一串uuid * type: 'TXT', * domain: 'example.com' */ const { fullRecord, value, type, domain } = options; const access = this.ctx.access this.logger.info('添加域名解析:', fullRecord, value, type, domain); // const record = await sdk.createRecord() // 调用对应的接口创建解析记录 //返回解析记录,用于后面清理 return record } /** * 删除dns解析记录,清理申请痕迹 * @param options */ async removeRecord(options) { const { fullRecord, value } = options.recordReq; const record = options.recordRes; // createRecord接口返回的record const access = this.ctx.access this.logger.info('删除域名解析:', fullRecord, value); if (!record) { this.logger.info('record为空,不执行删除'); return; } const recordId = record.id; // 这里调用删除txt dns解析记录接口 // sdk.removeRecord(recordId) this.logger.info("删除域名解析成功"); } } ` return { metadata: metadata, content: script } }