From 027f8402dfac35f769d0a44cf2737abd2737dd86 Mon Sep 17 00:00:00 2001 From: Teddy Katz Date: Wed, 17 Oct 2018 16:21:25 -0400 Subject: [PATCH] Upgrade: eslint-release@1.0.0 (refs #10631) This upgrades `eslint-release` to 1.0.0. The new version of `eslint-release` has a separate "generate" and "publish" phase, to allow for a 2FA code to be supplied in between. As a side-effect, it's now possible to manually test most aspects of the release process (by running `npm run generate-release`) without actually publishing a release somewhere. In lieu of unit tests, this should make it easier to test changes to the release process, like this one. --- .gitignore | 1 + Makefile.js | 96 ++++++++++++++++++++++++++++------------------------ package.json | 12 +++---- 3 files changed, 58 insertions(+), 51 deletions(-) diff --git a/.gitignore b/.gitignore index eae2b21d1ab..d2c98d47bd9 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ versions.json /packages/**/node_modules /.vscode .sublimelinterrc +.eslint-release-info.json diff --git a/Makefile.js b/Makefile.js index ee7d37b246f..896be6a5b72 100644 --- a/Makefile.js +++ b/Makefile.js @@ -150,10 +150,11 @@ function execSilent(cmd) { /** * Generates a release blog post for eslint.org * @param {Object} releaseInfo The release metadata. + * @param {string} [prereleaseMajorVersion] If this is a prerelease, the next major version after this prerelease * @returns {void} * @private */ -function generateBlogPost(releaseInfo) { +function generateBlogPost(releaseInfo, prereleaseMajorVersion) { const ruleList = ls("lib/rules") // Strip the .js extension @@ -166,7 +167,7 @@ function generateBlogPost(releaseInfo) { */ .sort((ruleA, ruleB) => ruleB.length - ruleA.length); - const renderContext = Object.assign({ prereleaseMajorVersion: null, ruleList }, releaseInfo); + const renderContext = Object.assign({ prereleaseMajorVersion, ruleList }, releaseInfo); const output = ejs.render(cat("./templates/blogpost.md.ejs"), renderContext), now = new Date(), @@ -250,11 +251,12 @@ function generateRuleIndexPage(basedir) { } /** - * Commits the changes in the site and publishes them to GitHub. - * @param {string} [tag] The string to tag the commit with. + * Creates a git commit and tag in an adjacent `eslint.github.io` repository, without pushing it to + * the remote. This assumes that the repository has already been modified somehow (e.g. by adding a blogpost). + * @param {string} [tag] The string to tag the commit with * @returns {void} */ -function publishSite(tag) { +function commitSiteToGit(tag) { const currentDir = pwd(); cd(SITE_DIR); @@ -266,39 +268,53 @@ function publishSite(tag) { } exec("git fetch origin && git rebase origin/master"); - exec("git push origin master --tags"); cd(currentDir); } /** - * Creates a release version tag and pushes to origin. - * @param {boolean} [ciRelease] Set to true to indicate this is a CI release. + * Publishes the changes in an adjacent `eslint.github.io` repository to the remote. The + * site should already have local commits (e.g. from running `commitSiteToGit`). * @returns {void} */ -function release(ciRelease) { +function publishSite() { + const currentDir = pwd(); + + cd(SITE_DIR); + exec("git push origin master --tags"); + cd(currentDir); +} - const releaseInfo = ReleaseOps.release(null, ciRelease); +/** + * Updates the changelog, bumps the version number in package.json, creates a local git commit and tag, + * and generates the site in an adjacent `eslint.github.io` folder. + * @returns {void} + */ +function generateRelease() { + ReleaseOps.generateRelease(); + const releaseInfo = JSON.parse(cat(".eslint-release-info.json")); echo("Generating site"); target.gensite(); generateBlogPost(releaseInfo); - publishSite(`v${releaseInfo.version}`); - echo("Site has been published"); - - echo("Publishing to GitHub"); - ReleaseOps.publishReleaseToGitHub(releaseInfo); + commitSiteToGit(`v${releaseInfo.version}`); } /** - * Creates a prerelease version tag and pushes to origin. + * Updates the changelog, bumps the version number in package.json, creates a local git commit and tag, + * and generates the site in an adjacent `eslint.github.io` folder. * @param {string} prereleaseId The prerelease identifier (alpha, beta, etc.) * @returns {void} */ -function prerelease(prereleaseId) { - - const releaseInfo = ReleaseOps.release(prereleaseId); +function generatePrerelease(prereleaseId) { + ReleaseOps.generateRelease(prereleaseId); + const releaseInfo = JSON.parse(cat(".eslint-release-info.json")); const nextMajor = semver.inc(releaseInfo.version, "major"); + echo("Generating site"); + + // always write docs into the next major directory (so 2.0.0-alpha.0 writes to 2.0.0) + target.gensite(nextMajor); + /* * Premajor release should have identical "next major version". * Preminor and prepatch release will not. @@ -313,21 +329,23 @@ function prerelease(prereleaseId) { * Blog post generation logic needs to be aware of this (as well as * know what the next major version is actually supposed to be). */ - releaseInfo.prereleaseMajorVersion = nextMajor; + generateBlogPost(releaseInfo, nextMajor); + } else { + generateBlogPost(releaseInfo); } - echo("Generating site"); - - // always write docs into the next major directory (so 2.0.0-alpha.0 writes to 2.0.0) - target.gensite(nextMajor); - generateBlogPost(releaseInfo); - publishSite(`v${releaseInfo.version}`); - echo("Site has been published"); - - echo("Publishing to GitHub"); - ReleaseOps.publishReleaseToGitHub(releaseInfo); + commitSiteToGit(`v${releaseInfo.version}`); } +/** + * Publishes a generated release to npm and GitHub, and pushes changes to the adjacent `eslint.github.io` repo + * to remote repo. + * @returns {void} + */ +function publishRelease() { + ReleaseOps.publishRelease(); + publishSite(); +} /** * Splits a command result to separate lines. @@ -1129,18 +1147,6 @@ target.perf = function() { }); }; -target.release = function() { - release(); -}; - -target.ciRelease = function() { - release(true); -}; - -target.publishsite = function() { - publishSite(); -}; - -target.prerelease = function(args) { - prerelease(args[0]); -}; +target.generateRelease = generateRelease; +target.generatePrerelease = ([prereleaseType]) => generatePrerelease(prereleaseType); +target.publishRelease = publishRelease; diff --git a/package.json b/package.json index dd3fe4615b3..12c1a3c33aa 100644 --- a/package.json +++ b/package.json @@ -11,11 +11,11 @@ "test": "node Makefile.js test", "lint": "node Makefile.js lint", "fuzz": "node Makefile.js fuzz", - "release": "node Makefile.js release", - "ci-release": "node Makefile.js ciRelease", - "alpharelease": "node Makefile.js prerelease -- alpha", - "betarelease": "node Makefile.js prerelease -- beta", - "rcrelease": "node Makefile.js prerelease -- rc", + "generate-release": "node Makefile.js generateRelease", + "generate-alpharelease": "node Makefile.js generatePrerelease -- alpha", + "generate-betarelease": "node Makefile.js generatePrerelease -- beta", + "generate-rcrelease": "node Makefile.js generatePrerelease -- rc", + "publish-release": "node Makefile.js publishRelease", "docs": "node Makefile.js docs", "gensite": "node Makefile.js gensite", "browserify": "node Makefile.js browserify", @@ -90,7 +90,7 @@ "eslint-plugin-eslint-plugin": "^1.2.0", "eslint-plugin-node": "^7.0.1", "eslint-plugin-rulesdir": "^0.1.0", - "eslint-release": "^0.11.1", + "eslint-release": "^1.0.0", "eslint-rule-composer": "^0.3.0", "eslump": "^1.6.2", "esprima": "^4.0.1",