Skip to content

Commit 959d360

Browse files
build: Support updates to previous major versions (#18871)
* build: Support updates to previous major versions * fix options name * add docs about release parameters * upgrade eslint-release * update tables * Fix typo Co-authored-by: Nitin Kumar <[email protected]> --------- Co-authored-by: Nitin Kumar <[email protected]>
1 parent 6d4484d commit 959d360

3 files changed

Lines changed: 92 additions & 17 deletions

File tree

Makefile.js

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ const OPEN_SOURCE_LICENSES = [
5050
/Public Domain/u, /LGPL/u, /Python/u, /BlueOak/u
5151
];
5252

53+
const MAIN_GIT_BRANCH = "main";
54+
5355
//------------------------------------------------------------------------------
5456
// Data
5557
//------------------------------------------------------------------------------
@@ -74,6 +76,8 @@ const NODE = "node ", // intentional extra space
7476
TEST_FILES = "\"tests/{bin,conf,lib,tools}/**/*.js\"",
7577
PERF_ESLINTRC = path.join(PERF_TMP_DIR, "eslint.config.js"),
7678
PERF_MULTIFILES_TARGET_DIR = path.join(PERF_TMP_DIR, "eslint"),
79+
CHANGELOG_FILE = "./CHANGELOG.md",
80+
VERSIONS_FILE = "./docs/src/_data/versions.json",
7781

7882
/*
7983
* glob arguments with Windows separator `\` don't work:
@@ -97,6 +101,14 @@ function execSilent(cmd) {
97101
return exec(cmd, { silent: true }).stdout;
98102
}
99103

104+
/**
105+
* Gets name of the currently checked out Git branch.
106+
* @returns {string} Name of the currently checked out Git branch.
107+
*/
108+
function getCurrentGitBranch() {
109+
return execSilent("git branch --show-current").trim();
110+
}
111+
100112
/**
101113
* Generates a release blog post for eslint.org
102114
* @param {Object} releaseInfo The release metadata.
@@ -313,14 +325,18 @@ function updateVersions(oldVersion, newVersion) {
313325
/**
314326
* Updates the changelog, bumps the version number in package.json, creates a local git commit and tag,
315327
* and generates the site in an adjacent `website` folder.
316-
* @param {string} [prereleaseId] The prerelease identifier (alpha, beta, etc.). If `undefined`, this is
328+
* @param {Object} options Release options.
329+
* @param {string} [options.prereleaseId] The prerelease identifier (alpha, beta, etc.). If `undefined`, this is
317330
* a regular release.
331+
* @param {string} options.packageTag Tag that should be added to the package submitted to the npm registry.
318332
* @returns {void}
319333
*/
320-
function generateRelease(prereleaseId) {
334+
function generateRelease({ prereleaseId, packageTag }) {
335+
echo(`Current Git branch: ${getCurrentGitBranch()}`);
336+
321337
const oldVersion = require("./package.json").version;
322338

323-
ReleaseOps.generateRelease(prereleaseId);
339+
ReleaseOps.generateRelease(prereleaseId, packageTag);
324340
const releaseInfo = JSON.parse(cat(".eslint-release-info.json"));
325341

326342
echo("Generating site");
@@ -335,7 +351,9 @@ function generateRelease(prereleaseId) {
335351
docsPackage.version = releaseInfo.version;
336352
fs.writeFileSync(docsPackagePath, `${JSON.stringify(docsPackage, null, 4)}\n`);
337353

338-
updateVersions(oldVersion, releaseInfo.version);
354+
if (getCurrentGitBranch() === MAIN_GIT_BRANCH) {
355+
updateVersions(oldVersion, releaseInfo.version);
356+
}
339357

340358
echo("Updating commit with docs data");
341359
exec("git add docs/ && git commit --amend --no-edit");
@@ -351,17 +369,32 @@ function publishRelease() {
351369
ReleaseOps.publishRelease();
352370
const releaseInfo = JSON.parse(cat(".eslint-release-info.json"));
353371

354-
/*
355-
* for a pre-release, push to the "next" branch to trigger docs deploy
356-
* for a release, push to the "latest" branch to trigger docs deploy
357-
*/
358-
if (isPreRelease(releaseInfo.version)) {
359-
exec("git push origin HEAD:next -f");
360-
} else {
361-
exec("git push origin HEAD:latest -f");
362-
}
372+
const docsSiteBranch = releaseInfo.packageTag === "maintenance"
373+
? `v${semver.major(releaseInfo.version)}.x`
374+
: releaseInfo.packageTag; // "latest" or "next"
375+
376+
echo(`Updating docs site branch: ${docsSiteBranch}`);
377+
exec(`git push origin HEAD:${docsSiteBranch} -f`);
363378

364379
publishSite();
380+
381+
// Update changelog and list of versions on the main branch
382+
if (getCurrentGitBranch() !== MAIN_GIT_BRANCH) {
383+
echo(`Updating changelog and versions on branch: ${MAIN_GIT_BRANCH}`);
384+
385+
exec(`git checkout ${MAIN_GIT_BRANCH} --force`);
386+
387+
fs.writeFileSync(CHANGELOG_FILE, `${releaseInfo.markdownChangelog}${cat(CHANGELOG_FILE)}`);
388+
389+
const versions = JSON.parse(cat(VERSIONS_FILE));
390+
391+
versions.items.find(({ branch }) => branch === docsSiteBranch).version = releaseInfo.version;
392+
fs.writeFileSync(VERSIONS_FILE, `${JSON.stringify(versions, null, 4)}\n`);
393+
394+
exec(`git add ${CHANGELOG_FILE} ${VERSIONS_FILE}`);
395+
exec(`git commit -m "chore: updates for v${releaseInfo.version} release"`);
396+
exec("git push origin HEAD");
397+
}
365398
}
366399

367400
/**
@@ -1022,6 +1055,6 @@ target.perf = function() {
10221055
});
10231056
};
10241057

1025-
target.generateRelease = () => generateRelease();
1026-
target.generatePrerelease = ([prereleaseType]) => generateRelease(prereleaseType);
1058+
target.generateRelease = ([packageTag]) => generateRelease({ packageTag });
1059+
target.generatePrerelease = ([prereleaseId]) => generateRelease({ prereleaseId, packageTag: "next" });
10271060
target.publishRelease = publishRelease;

docs/src/maintain/manage-releases.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,47 @@ In rare cases, a second patch release might be necessary if the release is known
4949

5050
After the patch release has been published (or no patch release is necessary), close the release issue and inform the team that they can start merging in semver-minor changes again.
5151

52+
### Release Parameters
53+
54+
The following tables show examples of the option to select as `RELEASE_TYPE` when starting `eslint-js Release` (the `@eslint/js` package release) and `eslint Release` (the `eslint` package release) jobs on Jenkins to release a new version with the latest features. In both jobs, `main` should be selected as `RELEASE_BRANCH`.
55+
56+
| **HEAD Version** | **Desired Next Version** | **`eslint-js Release`<br>`RELEASE_TYPE`** |
57+
| :---: | :---: | :---: |
58+
| `9.25.0` | `9.25.1` | `patch` |
59+
| `9.25.0` | `9.26.0` | `minor` |
60+
| `9.25.0` | `10.0.0-alpha.0` | `alpha.0` |
61+
| `10.0.0-alpha.0` | `10.0.0-alpha.1` | `alpha` |
62+
| `10.0.0-alpha.1` | `10.0.0-beta.0` | `beta` |
63+
| `10.0.0-beta.0` | `10.0.0-beta.1` | `beta` |
64+
| `10.0.0-beta.1` | `10.0.0-rc.0` | `rc` |
65+
| `10.0.0-rc.0` | `10.0.0-rc.1` | `rc` |
66+
| `10.0.0-rc.1` | `10.0.0` | `major` |
67+
68+
| **HEAD Version** | **Desired Next Version** | **`eslint Release`<br>`RELEASE_TYPE`** |
69+
| :---: | :---: | :---: |
70+
| `9.25.0` | `9.25.1` or `9.26.0` |`latest` |
71+
| `9.25.0` | `10.0.0-alpha.0` | `alpha` |
72+
| `10.0.0-alpha.0` | `10.0.0-alpha.1` | `alpha` |
73+
| `10.0.0-alpha.1` | `10.0.0-beta.0` | `beta` |
74+
| `10.0.0-beta.0` | `10.0.0-beta.1` | `beta` |
75+
| `10.0.0-beta.1` | `10.0.0-rc.0` | `rc` |
76+
| `10.0.0-rc.0` | `10.0.0-rc.1` | `rc` |
77+
| `10.0.0-rc.1` | `10.0.0` | `latest` |
78+
79+
When releasing a new version of the previous major line, the option to select as `RELEASE_TYPE` depends on whether the HEAD version is a prerelease or not. In both jobs, the corresponding development branch (for example, `v9.x-dev`) should be selected as `RELEASE_BRANCH`.
80+
81+
| **HEAD Version** | **Previous Major Line Version** | **Desired Next Version** | **`eslint-js Release`<br>`RELEASE_TYPE`** |
82+
| :---: | :---: | :---: | :---: |
83+
| `10.0.0-alpha.0` | `9.25.0` | `9.25.1` | `patch` |
84+
| `10.0.0-alpha.0` | `9.25.0` | `9.26.0` | `minor` |
85+
| `10.0.0` | `9.25.0` | `9.25.1` | `maintenance.patch` |
86+
| `10.0.0` | `9.25.0` | `9.26.0` | `maintenance.minor` |
87+
88+
| **HEAD Version** | **Previous Major Line Version** | **Desired Next Version** | **`eslint Release`<br>`RELEASE_TYPE`** |
89+
| :---: | :---: | :---: | :---: |
90+
| `10.0.0-alpha.0` | `9.25.0` | `9.25.1` or `9.26.0` | `latest` |
91+
| `10.0.0` | `9.25.0` | `9.25.1` or `9.26.0` | `maintenance` |
92+
5293
## Emergency Releases
5394

5495
An emergency release is unplanned and isn't the regularly scheduled release or the anticipated patch release.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
"lint:fix:docs:js": "trunk check -y --ignore=** --ignore=!docs/**/*.js -a --flter=eslint && trunk check -y --ignore=** --ignore=!docs/**/*.js",
3737
"release:generate:alpha": "node Makefile.js generatePrerelease -- alpha",
3838
"release:generate:beta": "node Makefile.js generatePrerelease -- beta",
39-
"release:generate:latest": "node Makefile.js generateRelease",
39+
"release:generate:latest": "node Makefile.js generateRelease -- latest",
40+
"release:generate:maintenance": "node Makefile.js generateRelease -- maintenance",
4041
"release:generate:rc": "node Makefile.js generatePrerelease -- rc",
4142
"release:publish": "node Makefile.js publishRelease",
4243
"test": "node Makefile.js test",
@@ -138,7 +139,7 @@
138139
"eslint-plugin-eslint-plugin": "^6.0.0",
139140
"eslint-plugin-expect-type": "^0.4.0",
140141
"eslint-plugin-yml": "^1.14.0",
141-
"eslint-release": "^3.2.2",
142+
"eslint-release": "^3.3.0",
142143
"eslint-rule-composer": "^0.3.0",
143144
"eslump": "^3.0.0",
144145
"esprima": "^4.0.1",

0 commit comments

Comments
 (0)