From e924781ee53e23a01499387645e0cbd5bd85d447 Mon Sep 17 00:00:00 2001 From: John Kleinschmidt Date: Wed, 31 Jan 2018 16:40:38 -0700 Subject: [PATCH] Improvements to release process 1. Prompt user to verify version before version is created. 2. Fix validateRelease instructions and usage 3. Fix ci-release-build so that you don't have to pass in --ghRelease=true; just --ghRelease will work. --- docs/development/releasing.md | 2 +- script/ci-release-build.js | 2 +- script/prepare-release.js | 40 +++++++++++++++++++++++++++++++---- script/release.js | 23 +++++++++++++------- 4 files changed, 53 insertions(+), 14 deletions(-) diff --git a/docs/development/releasing.md b/docs/development/releasing.md index dfdd7f21c23a..0ca039bc5d66 100644 --- a/docs/development/releasing.md +++ b/docs/development/releasing.md @@ -164,7 +164,7 @@ This release is published to [npm](https://www.npmjs.com/package/electron) under 1. Uncheck the `prerelease` checkbox if you're publishing a stable release; leave it checked for beta releases. 1. Click 'Save draft'. **Do not click 'Publish release'!** 1. Wait for all builds to pass before proceeding. -1. You can run `npm run release --validateRelease` to verify that all of the +1. You can run `npm run release -- --validateRelease` to verify that all of the required files have been created for the release. ## Merge temporary branch diff --git a/script/ci-release-build.js b/script/ci-release-build.js index d80025ab9d45..ec2459198bf2 100644 --- a/script/ci-release-build.js +++ b/script/ci-release-build.js @@ -199,7 +199,7 @@ function runRelease (targetBranch, options) { module.exports = runRelease if (require.main === module) { - const args = require('minimist')(process.argv.slice(2)) + const args = require('minimist')(process.argv.slice(2), { boolean: 'ghRelease' }) const targetBranch = args._[0] if (args._.length < 1) { console.log(`Trigger CI to build release builds of electron. diff --git a/script/prepare-release.js b/script/prepare-release.js index 173ad3e2f2ba..cb5ea4468821 100755 --- a/script/prepare-release.js +++ b/script/prepare-release.js @@ -11,6 +11,7 @@ const GitHub = require('github') const pass = '\u2713'.green const path = require('path') const pkg = require('../package.json') +const readline = require('readline') const versionType = args._[0] // TODO (future) automatically determine version based on conventional commits @@ -45,18 +46,23 @@ async function createReleaseBranch () { } } -function getNewVersion () { +function getNewVersion (dryRun) { console.log(`Bumping for new "${versionType}" version.`) let bumpScript = path.join(__dirname, 'bump-version.py') let scriptArgs = [bumpScript, `--bump ${versionType}`] if (args.stable) { scriptArgs.push('--stable') } + if (dryRun) { + scriptArgs.push('--dry-run') + } try { let bumpVersion = execSync(scriptArgs.join(' '), {encoding: 'UTF-8'}) bumpVersion = bumpVersion.substr(bumpVersion.indexOf(':') + 1).trim() let newVersion = `v${bumpVersion}` - console.log(`${pass} Successfully bumped version to ${newVersion}`) + if (!dryRun) { + console.log(`${pass} Successfully bumped version to ${newVersion}`) + } return newVersion } catch (err) { console.log(`${fail} Could not bump version, error was:`, err) @@ -127,16 +133,17 @@ async function createRelease (branchToTarget, isBeta) { process.exit(1) } console.log(`${pass} A draft release does not exist; creating one.`) - githubOpts.body = releaseNotes githubOpts.draft = true githubOpts.name = `electron ${newVersion}` if (isBeta) { githubOpts.body = `Note: This is a beta release. Please file new issues ` + `for any bugs you find in it.\n \n This release is published to npm ` + `under the beta tag and can be installed via npm install electron@beta, ` + - `or npm i electron@${newVersion.substr(1)}.` + `or npm i electron@${newVersion.substr(1)}.\n \n ${releaseNotes}` githubOpts.name = `${githubOpts.name}` githubOpts.prerelease = true + } else { + githubOpts.body = releaseNotes } githubOpts.tag_name = newVersion githubOpts.target_commitish = branchToTarget @@ -166,12 +173,37 @@ async function runReleaseBuilds () { }) } +async function verifyNewVersion () { + let newVersion = await getNewVersion(true) + let response = await promptForVersion(newVersion) + if (response.match(/^y/i)) { + console.log(`${pass} Starting release of ${newVersion}`) + } else { + console.log(`${fail} Aborting release of ${newVersion}`) + process.exit() + } +} + +async function promptForVersion (version) { + return new Promise((resolve, reject) => { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }) + rl.question(`Do you want to create the release ${version.green} (y/N)? `, (answer) => { + rl.close() + resolve(answer) + }) + }) +} + async function prepareRelease (isBeta, notesOnly) { let currentBranch = await getCurrentBranch(gitDir) if (notesOnly) { let releaseNotes = await getReleaseNotes(currentBranch) console.log(`Draft release notes are: ${releaseNotes}`) } else { + await verifyNewVersion() await createReleaseBranch() await createRelease(currentBranch, isBeta) await pushRelease() diff --git a/script/release.js b/script/release.js index bed6edeb698e..9863ef912cd5 100755 --- a/script/release.js +++ b/script/release.js @@ -51,8 +51,8 @@ async function getDraftRelease (version, skipValidation) { return draft } -async function validateReleaseAssets (release) { - const requiredAssets = assetsForVersion(release.tag_name).sort() +async function validateReleaseAssets (release, validatingRelease) { + const requiredAssets = assetsForVersion(release.tag_name, validatingRelease).sort() const extantAssets = release.assets.map(asset => asset.name).sort() const downloadUrls = release.assets.map(asset => asset.browser_download_url).sort() @@ -84,7 +84,7 @@ function check (condition, statement, exitIfFail = false) { } } -function assetsForVersion (version) { +function assetsForVersion (version, validatingRelease) { const patterns = [ `electron-${version}-darwin-x64-dsym.zip`, `electron-${version}-darwin-x64-symbols.zip`, @@ -120,9 +120,11 @@ function assetsForVersion (version) { `ffmpeg-${version}-linux-x64.zip`, `ffmpeg-${version}-mas-x64.zip`, `ffmpeg-${version}-win32-ia32.zip`, - `ffmpeg-${version}-win32-x64.zip`, - `SHASUMS256.txt` + `ffmpeg-${version}-win32-x64.zip` ] + if (!validatingRelease) { + patterns.push('SHASUMS256.txt') + } return patterns } @@ -256,9 +258,14 @@ async function publishRelease (release) { async function makeRelease (releaseToValidate) { if (releaseToValidate) { - console.log(`Validating release ${args.validateRelease}`) - let release = await getDraftRelease(args.validateRelease) - await validateReleaseAssets(release) + if (releaseToValidate === true) { + releaseToValidate = pkgVersion + } else { + console.log('Release to validate !=== true') + } + console.log(`Validating release ${releaseToValidate}`) + let release = await getDraftRelease(releaseToValidate) + await validateReleaseAssets(release, true) } else { checkVersion() let draftRelease = await getDraftRelease()