Update release script (#12591)

This commit is contained in:
fisker Cheung authored and GitHub committed 2022-05-30 13:44:54 +08:00
1 parent 67c2df0ffe
commit feb6b519ee
6 files changed
+165 -61

No files matched your search

@@ -1,4 +1,4 @@
import { getReleaseUrl } from "../../steps/publish-to-npm.js";
import { getReleaseUrl } from "../../steps/show-instructions-after-npm-publish.js";
describe("publish-to-npm", () => {
describe("getReleaseUrl", () => {
@@ -0,0 +1,15 @@
import { isVersionReleased } from "../../steps/wait-for-bot-release.js";
describe("isVersionReleased", () => {
test("returns true for existing version", async () => {
const result = await isVersionReleased("1.0.0");
expect(result).toBe(true);
});
test("rejects true for non-existing version", async () => {
await expect(
isVersionReleased("999.0.0")
).rejects.toThrowErrorMatchingInlineSnapshot(
'"prettier@999.0.0 doesn\'t exit."'
);
});
});
+11 -5
View File
@@ -15,8 +15,9 @@ async function run() {
const params = minimist(process.argv.slice(2), {
string: ["version"],
boolean: ["dry"],
boolean: ["dry", "manual"],
alias: { v: "version" },
default: { manual: false },
});
const { stdout: previousVersion } = await runGit([
@@ -39,16 +40,21 @@ async function run() {
"./steps/validate-new-version.js",
"./steps/check-git-status.js",
"./steps/install-dependencies.js",
"./steps/run-tests.js",
params.manual && "./steps/run-tests.js",
"./steps/update-version.js",
"./steps/generate-bundles.js",
params.manual && "./steps/generate-bundles.js",
"./steps/update-changelog.js",
"./steps/push-to-git.js",
"./steps/publish-to-npm.js",
params.manual
? "./steps/publish-to-npm.js"
: "./steps/wait-for-bot-release.js",
"./steps/show-instructions-after-npm-publish.js",
"./steps/update-dependents-count.js",
"./steps/bump-prettier.js",
"./steps/post-publish-steps.js",
].map((step) => importDefault(step))
]
.filter(Boolean)
.map((step) => importDefault(step))
);
try {
+2 -55
View File
@@ -1,16 +1,6 @@
import chalk from "chalk";
import outdent from "outdent";
import { execa } from "execa";
import semver from "semver";
import enquirer from "enquirer";
import {
getBlogPostInfo,
getChangelogContent,
logPromise,
waitForEnter,
} from "../utils.js";
const outdentString = outdent.string;
import { logPromise } from "../utils.js";
/**
* Retry "npm publish" when to enter OTP is failed.
@@ -37,53 +27,10 @@ async function retryNpmPublish() {
}
}
export function getReleaseUrl(version, previousVersion) {
const semverDiff = semver.diff(version, previousVersion);
const isPatch = semverDiff === "patch";
let body;
if (isPatch) {
const urlToChangelog =
"https://github.com/prettier/prettier/blob/main/CHANGELOG.md#" +
version.split(".").join("");
body = `🔗 [Changelog](${urlToChangelog})`;
} else {
const blogPostInfo = getBlogPostInfo(version);
body = getChangelogContent({
version,
previousVersion,
body: `🔗 [Release note](https://prettier.io/${blogPostInfo.path})`,
});
}
body = encodeURIComponent(body);
return `https://github.com/prettier/prettier/releases/new?tag=${version}&title=${version}&body=${body}`;
}
export default async function publishToNpm({ dry, version, previousVersion }) {
export default async function publishToNpm({ dry }) {
if (dry) {
return;
}
await logPromise("Publishing to npm", retryNpmPublish());
const releaseUrl = getReleaseUrl(version, previousVersion);
console.log(
outdentString(chalk`
{green.bold Prettier ${version} published!}
{yellow.bold Some manual steps are necessary.}
{bold.underline Create a GitHub Release}
- Go to {cyan.underline ${releaseUrl}}
- Press {bgGreen.black Publish release }
{bold.underline Test the new release}
- In a new session, run {yellow npm i prettier@latest} in another directory
- Test the API and CLI
After that, we can proceed to bump this repo's Prettier dependency.
Press ENTER to continue.
`)
);
await waitForEnter();
}
@@ -0,0 +1,58 @@
import chalk from "chalk";
import outdent from "outdent";
import semver from "semver";
import {
getBlogPostInfo,
getChangelogContent,
waitForEnter,
} from "../utils.js";
const outdentString = outdent.string;
export function getReleaseUrl(version, previousVersion) {
const semverDiff = semver.diff(version, previousVersion);
const isPatch = semverDiff === "patch";
let body;
if (isPatch) {
const urlToChangelog =
"https://github.com/prettier/prettier/blob/main/CHANGELOG.md#" +
version.split(".").join("");
body = `🔗 [Changelog](${urlToChangelog})`;
} else {
const blogPostInfo = getBlogPostInfo(version);
body = getChangelogContent({
version,
previousVersion,
body: `🔗 [Release note](https://prettier.io/${blogPostInfo.path})`,
});
}
body = encodeURIComponent(body);
return `https://github.com/prettier/prettier/releases/new?tag=${version}&title=${version}&body=${body}`;
}
export default async function showInstructionsAfterNpmPublish({
version,
previousVersion,
}) {
const releaseUrl = getReleaseUrl(version, previousVersion);
console.log(
outdentString(chalk`
{green.bold Prettier ${version} published!}
{yellow.bold Some manual steps are necessary.}
{bold.underline Create a GitHub Release}
- Go to {cyan.underline ${releaseUrl}}
- Press {bgGreen.black Publish release }
{bold.underline Test the new release}
- In a new session, run {yellow npm i prettier@latest} in another directory
- Test the API and CLI
After that, we can proceed to bump this repo's Prettier dependency.
Press ENTER to continue.
`)
);
await waitForEnter();
}
@@ -0,0 +1,78 @@
import chalk from "chalk";
import outdent from "outdent";
import fetch from "node-fetch";
import { waitForEnter, logPromise } from "../utils.js";
const outdentString = outdent.string;
export async function isVersionReleased(version) {
const response = await fetch("https://registry.npmjs.org/prettier/");
const result = await response.json();
const versionExists = version in result.time;
if (!versionExists) {
throw new Error(`prettier@${version} doesn't exit.`);
}
return versionExists;
}
async function checkBotPermission() {
const response = await fetch("https://registry.npmjs.org/prettier/");
const { maintainers } = await response.json();
return maintainers.some(({ name }) => name === "prettier-bot");
}
checkBotPermission();
const sleep = () =>
new Promise((resolve) => {
setTimeout(resolve, 30_000);
});
export default async function waitForBotRelease({ dry, version }) {
if (dry) {
return;
}
if (!(await checkBotPermission())) {
console.log(
outdentString(chalk/* indent */ `
1. Go to {green.underline https://www.npmjs.com/package/prettier/access}
2. Add "{yellow prettier-bot}" as prettier package maintainer.
Press ENTER to continue.
`)
);
await waitForEnter();
}
console.log(
outdentString(chalk/* indent */ `
1. Go to {green.underline https://github.com/prettier/release-workflow/actions/workflows/release.yml}
2. Click "{green Run workflow}" button, type "{yellow.underline ${version}}" in "Version to release", uncheck all checkboxes, hit the "{bgGreen Run workflow}" button.
Press ENTER to continue.
`)
);
await waitForEnter();
let released = false;
while (!released) {
try {
released = await logPromise(
"Checking release status",
isVersionReleased(version)
);
} catch {
// No op
}
if (!released) {
await logPromise("Wait for 30s", sleep());
}
}
}