From feb118b68def4e61e57df68cdfed7c74d8f3ca1e Mon Sep 17 00:00:00 2001 From: cycjimmy Date: Sat, 26 Oct 2019 19:19:39 +0800 Subject: [PATCH] refactor(*): split tasks and modules --- src/cleanupNpmrc.task.js | 15 ++++++ src/handleOptions.js | 21 ++++++++ src/index.js | 95 +++++------------------------------ src/inputs.json | 5 ++ src/outputs.json | 7 +++ src/preInstallPlugins.task.js | 26 ++++++++++ src/windUpJob.task.js | 36 +++++++++++++ 7 files changed, 123 insertions(+), 82 deletions(-) create mode 100644 src/cleanupNpmrc.task.js create mode 100644 src/handleOptions.js create mode 100644 src/inputs.json create mode 100644 src/outputs.json create mode 100644 src/preInstallPlugins.task.js create mode 100644 src/windUpJob.task.js diff --git a/src/cleanupNpmrc.task.js b/src/cleanupNpmrc.task.js new file mode 100644 index 0000000..4205cf8 --- /dev/null +++ b/src/cleanupNpmrc.task.js @@ -0,0 +1,15 @@ +const core = require('@actions/core'); +const exec = require('./_exec'); + +/** + * Clean up `.npmrc` file in the repo after releasing + * @returns {Promise} + */ +module.exports = async () => { + const {stdout, stderr} = await exec(`rm -f .npmrc`); + core.debug(stdout); + + if (stderr) { + return Promise.reject(stderr); + } +}; diff --git a/src/handleOptions.js b/src/handleOptions.js new file mode 100644 index 0000000..0dfe7c5 --- /dev/null +++ b/src/handleOptions.js @@ -0,0 +1,21 @@ +const core = require('@actions/core'); +const inputs = require('./inputs.json'); + +/** + * handleDryRunOption + * @returns {{}|{dryRun: boolean}} + */ +exports.handleDryRunOption = () => { + const dryRun = core.getInput(inputs.dry_run, {required: false}) || ''; + + switch (dryRun) { + case 'true': + return {dryRun: true}; + + case 'false': + return {dryRun: false}; + + default: + return {}; + } +}; diff --git a/src/index.js b/src/index.js index 35f3597..3fa07e7 100644 --- a/src/index.js +++ b/src/index.js @@ -1,103 +1,34 @@ -const exec = require('./_exec'); -const path = require('path'); const core = require('@actions/core'); const semanticRelease = require('semantic-release'); +const {handleDryRunOption} = require('./handleOptions'); +const preInstallPlugins = require('./preInstallPlugins.task'); +const cleanupNpmrc = require('./cleanupNpmrc.task'); +const windUpJob = require('./windUpJob.task'); -const OutputKeys = { - newReleasePublished: 'new_release_published', - newReleaseVersion: 'new_release_version', - newReleaseMajor: 'new_release_major_version', - newReleaseMinor: 'new_release_minor_version', - newReleasePatch: 'new_release_patch_version', -}; - -/** - * handleDryRunOption - * @returns {{}|{dryRun: boolean}} - */ -const handleDryRunOption = () => { - const dryRun = core.getInput('dry_run', {required: false}) || ''; - - switch (dryRun) { - case 'true': - return {dryRun: true}; - - case 'false': - return {dryRun: false}; - - default: - return {}; - } -}; +const outputs = require('./outputs.json'); +const inputs = require('./inputs.json'); /** * Release main task - * @returns {Promise|undefined>} + * @returns {Promise} */ const release = async () => { - const branch = core.getInput('branch', {required: false}) || 'master'; - const extraPlugins = core.getInput('extra_plugins', {required: false}) || ''; - // set outputs default - core.setOutput(OutputKeys.newReleasePublished, 'false'); + core.setOutput(outputs.new_release_published, 'false'); - // pre-install plugins - if (extraPlugins) { - const _extraPlugins = extraPlugins - .replace(/['"]/g, '') - .replace(/[\n\r]/g, ' '); - const {stdout, stderr} = await exec(`npm install ${_extraPlugins}`, { - cwd: path.resolve(__dirname) - }); - core.debug(stdout); - if (stderr) { - return Promise.reject(stderr); - } - } + const branch = core.getInput(inputs.branch, {required: false}) || 'master'; + + await preInstallPlugins(); const result = await semanticRelease({ branch, ...(handleDryRunOption()), }); - // Clean up `.npmrc` file in the repo after releasing - { - const {stdout, stderr} = await exec(`rm -f .npmrc`); - core.debug(stdout); - if (stderr) { - core.debug(stderr); - } - } - - if (!result) { - core.debug('No release published.'); - return; - } - - const {lastRelease, commits, nextRelease, releases} = result; - - core.debug(`Published ${nextRelease.type} release version ${nextRelease.version} containing ${commits.length} commits.`); - - if (lastRelease.version) { - core.debug(`The last release was "${lastRelease.version}".`); - } - - for (const release of releases) { - core.debug(`The release was published with plugin "${release.pluginName}".`); - } - - const {version} = nextRelease; - const [major, minor, patch] = version.split('.'); - - // set outputs - core.setOutput(OutputKeys.newReleasePublished, 'true'); - core.setOutput(OutputKeys.newReleaseVersion, version); - core.setOutput(OutputKeys.newReleaseMajor, major); - core.setOutput(OutputKeys.newReleaseMinor, minor); - core.setOutput(OutputKeys.newReleasePatch, patch); + await cleanupNpmrc(); + await windUpJob(result); }; - module.exports = () => { core.debug('Initialization successful'); release().catch(core.setFailed); diff --git a/src/inputs.json b/src/inputs.json new file mode 100644 index 0000000..3e63d83 --- /dev/null +++ b/src/inputs.json @@ -0,0 +1,5 @@ +{ + "branch": "branch", + "extra_plugins": "extra_plugins", + "dry_run": "dry_run" +} diff --git a/src/outputs.json b/src/outputs.json new file mode 100644 index 0000000..04728f3 --- /dev/null +++ b/src/outputs.json @@ -0,0 +1,7 @@ +{ + "new_release_published": "new_release_published", + "new_release_version": "new_release_version", + "new_release_major_version": "new_release_major_version", + "new_release_minor_version": "new_release_minor_version", + "new_release_patch_version": "new_release_patch_version" +} diff --git a/src/preInstallPlugins.task.js b/src/preInstallPlugins.task.js new file mode 100644 index 0000000..b0ea0a9 --- /dev/null +++ b/src/preInstallPlugins.task.js @@ -0,0 +1,26 @@ +const path = require('path'); +const core = require('@actions/core'); +const exec = require('./_exec'); + +/** + * Pre-install plugins + * @returns {Promise} + */ +module.exports = async () => { + const extraPlugins = core.getInput('extra_plugins', {required: false}) || ''; + + if (extraPlugins) { + const _extraPlugins = extraPlugins + .replace(/['"]/g, '') + .replace(/[\n\r]/g, ' '); + + const {stdout, stderr} = await exec(`npm install ${_extraPlugins}`, { + cwd: path.resolve(__dirname) + }); + core.debug(stdout); + + if (stderr) { + return Promise.reject(stderr); + } + } +}; diff --git a/src/windUpJob.task.js b/src/windUpJob.task.js new file mode 100644 index 0000000..18337e2 --- /dev/null +++ b/src/windUpJob.task.js @@ -0,0 +1,36 @@ +const core = require('@actions/core'); +const outputs = require('./outputs.json'); + +/** + * windUpJob + * @param result + * @returns {Promise} + */ +module.exports = async (result) => { + if (!result) { + core.debug('No release published.'); + return Promise.resolve(); + } + + const {lastRelease, commits, nextRelease, releases} = result; + + core.debug(`Published ${nextRelease.type} release version ${nextRelease.version} containing ${commits.length} commits.`); + + if (lastRelease.version) { + core.debug(`The last release was "${lastRelease.version}".`); + } + + for (const release of releases) { + core.debug(`The release was published with plugin "${release.pluginName}".`); + } + + const {version} = nextRelease; + const [major, minor, patch] = version.split('.'); + + // set outputs + core.setOutput(outputs.new_release_published, 'true'); + core.setOutput(outputs.new_release_version, version); + core.setOutput(outputs.new_release_major_version, major); + core.setOutput(outputs.new_release_minor_version, minor); + core.setOutput(outputs.new_release_patch_version, patch); +};