From 137e043dfed7dbbcc9152e90304eff7b822875cb Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 8 Jan 2021 16:59:53 +0800 Subject: [PATCH] refactor: 1 --- packages/executor/src/index.js | 33 ++++++++++++++++------------ packages/executor/src/trace.js | 30 +++++++++++++++++-------- packages/executor/test/index.test.js | 6 ++--- test/options.js | 2 +- 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/packages/executor/src/index.js b/packages/executor/src/index.js index af216b25..ecf662ee 100644 --- a/packages/executor/src/index.js +++ b/packages/executor/src/index.js @@ -11,7 +11,8 @@ function createDefaultOptions () { args: { forceCert: false, forceDeploy: true, - forceRedeploy: false + forceRedeploy: false, + doNotThrowError: false // 部署流程执行有错误时,不抛异常,此时整个任务执行完毕后,可以返回结果,你可以在返回结果中处理 } } } @@ -84,24 +85,23 @@ export class Executor { context.certIsNew = !!cert.isNew const trace = new Trace(context) + const resultTrace = trace.getInstance({ type: 'result' }) // 运行部署任务 try { await this.runDeploys({ options, cert, context, trace }) } finally { await certd.certStore.setCurrentFile('context.json', JSON.stringify(context)) } - logger.info('任务完成') trace.print() - const result = trace.get({ }) + const result = resultTrace.get({ }) const returnData = { cert, context, result } - if (result.status === 'error') { - const err = new Error(result.remark) - err.data = returnData + if (result.status === 'error' && options.args.doNotThrowError === false) { + throw new Error(result.remark) } return returnData } @@ -122,10 +122,12 @@ export class Executor { for (const deploy of options.deploy) { const deployName = deploy.deployName logger.info(`------------【${deployName}】-----------`) + + const deployTrace = trace.getInstance({ type: 'deploy', deployName }) if (deploy.disabled === true) { logger.info('此流程已被禁用,跳过') logger.info('') - trace.set({ deployName, value: { current: 'skip', status: 'disabled', remark: '流程禁用' } }) + deployTrace.set({ value: { current: 'skip', status: 'disabled', remark: '流程禁用' } }) continue } try { @@ -134,13 +136,14 @@ export class Executor { context[deployName] = {} } const taskContext = context[deployName] + // 开始执行任务列表 await this.runTask({ options, cert, task, context: taskContext, deploy, trace }) } - trace.set({ deployName, value: { status: 'success', remark: '执行成功' } }) + deployTrace.set({ value: { status: 'success', remark: '执行成功' } }) } catch (e) { - trace.set({ deployName, value: { status: 'error', remark: '执行失败:' + e.message } }) - trace.set({ value: { status: 'error', remark: deployName + '执行失败:' + e.message } }) + deployTrace.set({ value: { status: 'error', remark: '执行失败:' + e.message } }) + trace.set({ type: 'result', value: { status: 'error', remark: deployName + '执行失败:' + e.message } }) logger.error('流程执行失败', e) } @@ -161,18 +164,20 @@ export class Executor { if (Plugin instanceof Function) { instance = new Plugin({ accessProviders: options.accessProviders }) } - const traceStatus = trace.get({ deployName: deploy.deployName, taskName: taskName }) + const taskTrace = trace.getInstance({ type: 'deploy', deployName, taskName }) + const traceStatus = taskTrace.get({}) if (traceStatus?.status === 'success' && !options?.args?.forceRedeploy) { logger.info(`----【${taskName}】已经执行完成,跳过此任务`) - trace.set({ deployName, taskName, value: { current: 'skip', status: 'success', remark: '已执行成功过,本次跳过' } }) + taskTrace.set({ value: { current: 'skip', status: 'success', remark: '已执行成功过,本次跳过' } }) return } logger.info(`----【${taskName}】开始执行`) try { + // 执行任务 await instance.execute({ cert, props: task.props, context }) - trace.set({ deployName, taskName, value: { current: 'success', status: 'success', remark: '执行成功', time: dayjs().format() } }) + taskTrace.set({ value: { current: 'success', status: 'success', remark: '执行成功', time: dayjs().format() } }) } catch (e) { - trace.set({ deployName, taskName, value: { current: 'error', status: 'error', remark: e.message, time: dayjs().format() } }) + taskTrace.set({ value: { current: 'error', status: 'error', remark: e.message, time: dayjs().format() } }) throw e } logger.info(`----任务【${taskName}】执行完成`) diff --git a/packages/executor/src/trace.js b/packages/executor/src/trace.js index 9075592a..165b5e02 100644 --- a/packages/executor/src/trace.js +++ b/packages/executor/src/trace.js @@ -6,19 +6,30 @@ export class Trace { this.context = context } - set ({ deployName, taskName, prop, value }) { - const key = this.buildTraceKey({ deployName, taskName, prop }) + getInstance ({ type, deployName, taskName }) { + return { + get: ({ prop }) => { + return this.get({ type, deployName, taskName, prop }) + }, + set: ({ prop, value }) => { + this.set({ type, deployName, taskName, prop, value }) + } + } + } + + set ({ type, deployName, taskName, prop, value }) { + const key = this.buildTraceKey({ type, deployName, taskName, prop }) const oldValue = _.get(this.context, key) || {} _.merge(oldValue, value) _.set(this.context, key, oldValue) } - get ({ deployName, taskName, prop }) { - return _.get(this.context, this.buildTraceKey({ deployName, taskName, prop })) + get ({ type, deployName, taskName, prop }) { + return _.get(this.context, this.buildTraceKey({ type, deployName, taskName, prop })) } - buildTraceKey ({ deployName, taskName, prop }) { - let key = '__trace__' + buildTraceKey ({ type = 'default', deployName, taskName, prop }) { + let key = '__trace__.' + type if (deployName) { key += '.' key += deployName.replace(/\./g, '_') @@ -46,7 +57,7 @@ export class Trace { } else { this.printTraceLine({ current: 'skip', remark: '还未到过期时间,跳过' }, '更新证书') } - const trace = this.get({ }) + const trace = this.get({ type: 'deploy' }) // logger.info('trace', trace) for (const deployName in trace) { if (trace[deployName] == null) { @@ -64,11 +75,12 @@ export class Trace { } } } - + const result = this.get({ type: 'result' }) + this.printTraceLine(result, 'result', '') const mainContext = {} _.merge(mainContext, context) delete mainContext.__trace__ - logger.info('context:', JSON.stringify(mainContext)) + logger.info('【context】', JSON.stringify(mainContext)) } printTraceLine (traceStatus, name, prefix = '') { diff --git a/packages/executor/test/index.test.js b/packages/executor/test/index.test.js index 683df735..1f106a38 100644 --- a/packages/executor/test/index.test.js +++ b/packages/executor/test/index.test.js @@ -5,7 +5,7 @@ const { expect } = pkg describe('AutoDeploy', function () { it('#run', async function () { - this.timeout(20000) + this.timeout(120000) const options = createOptions() const executor = new Executor() const ret = await executor.run(options) @@ -13,7 +13,7 @@ describe('AutoDeploy', function () { expect(ret.cert).ok }) it('#forceCert', async function () { - this.timeout(20000) + this.timeout(120000) const executor = new Executor() const options = createOptions() const ret = await executor.run(options, { forceCert: true, forceDeploy: false }) @@ -21,7 +21,7 @@ describe('AutoDeploy', function () { expect(ret.cert).ok }) it('#forceDeploy', async function () { - this.timeout(20000) + this.timeout(120000) const executor = new Executor() const options = createOptions() const ret = await executor.run(options, { forceCert: false, forceDeploy: true, forceRedeploy: true }) diff --git a/test/options.js b/test/options.js index 6c15d028..c0918803 100644 --- a/test/options.js +++ b/test/options.js @@ -4,7 +4,7 @@ const defaultOptions = { args: { forceCert: false, // 强制更新证书 skipCert: false, // 是否跳过证书申请环节 - forceDeploy: false, + forceDeploy: true, test: true }, accessProviders: {