summaryrefslogtreecommitdiff
path: root/tools/release/04_post_publish.ts
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2022-04-04 14:56:29 -0400
committerGitHub <noreply@github.com>2022-04-04 14:56:29 -0400
commite33329b47ea1586bd1fbc686cae3048a080039ca (patch)
treeebadeca9f9eef5b617cacf29d01eb98c9c103aca /tools/release/04_post_publish.ts
parentfcd986875aebbca3a2fc85415d9b11748040a7fa (diff)
chore(ci): automatically open PR to forward patch release back to main (#14180)
Diffstat (limited to 'tools/release/04_post_publish.ts')
-rwxr-xr-xtools/release/04_post_publish.ts94
1 files changed, 94 insertions, 0 deletions
diff --git a/tools/release/04_post_publish.ts b/tools/release/04_post_publish.ts
new file mode 100755
index 000000000..d437bb39a
--- /dev/null
+++ b/tools/release/04_post_publish.ts
@@ -0,0 +1,94 @@
+#!/usr/bin/env -S deno run --allow-read --allow-write --allow-run=cargo,git --allow-net --no-check
+// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
+import { DenoWorkspace } from "./deno_workspace.ts";
+import { createOctoKit, getGitHubRepository } from "./deps.ts";
+
+const workspace = await DenoWorkspace.load();
+const repo = workspace.repo;
+const cliCrate = workspace.getCliCrate();
+
+console.log("Creating release tag...");
+await createReleaseTag();
+
+console.log("Forwarding release commit to main...");
+try {
+ await forwardReleaseCommitToMain();
+} catch (err) {
+ console.error("Failed. Please manually open a PR.", err);
+}
+
+async function createReleaseTag() {
+ await repo.gitFetchTags("origin");
+ const tags = await repo.getGitTags();
+ const tagName = `v${cliCrate.version}`;
+
+ if (tags.has(tagName)) {
+ console.log(`Tag ${tagName} already exists.`);
+ } else {
+ await repo.gitTag(tagName);
+ await repo.gitPush(tagName);
+ }
+}
+
+async function forwardReleaseCommitToMain() {
+ // if this is a patch release, open a PR to forward the most recent commit back to main
+ const currentBranch = await repo.gitCurrentBranch();
+ const isPatchRelease = currentBranch !== "main";
+
+ if (!isPatchRelease) {
+ console.log("Not doing a patch release. Skipping.");
+ return;
+ }
+
+ const releaseCommitHash =
+ (await repo.runCommand(["git", "rev-parse", "HEAD"])).trim();
+ const newBranchName = `forward_v${cliCrate.version}`;
+ console.log(`Creating branch ${newBranchName}...`);
+ await repo.runCommand([
+ "git",
+ "checkout",
+ "-b",
+ newBranchName,
+ "main",
+ ]);
+ await repo.runCommand([
+ "git",
+ "cherry-pick",
+ releaseCommitHash,
+ ]);
+ await repo.gitPush("origin", newBranchName);
+
+ console.log(`Opening PR...`);
+ const openedPr = await createOctoKit().request(
+ "POST /repos/{owner}/{repo}/pulls",
+ {
+ ...getGitHubRepository(),
+ base: "main",
+ head: newBranchName,
+ draft: true,
+ title: `chore: forward v${cliCrate.version} release commit to main`,
+ body: getPrBody(),
+ },
+ );
+ console.log(`Opened PR at ${openedPr.data.url}`);
+
+ function getPrBody() {
+ let text =
+ `This is the release commit being forwarded back to main for ${cliCrate.version}\n\n` +
+ `Please ensure:\n` +
+ `- [ ] Everything looks ok in the PR\n` +
+ `- [ ] The release has been published\n\n` +
+ `To make edits to this PR:\n` +
+ "```shell\n" +
+ `git fetch upstream ${newBranchName} && git checkout -b ${newBranchName} upstream/${newBranchName}\n` +
+ "```\n\n" +
+ "Don't need this PR? Close it.\n";
+
+ const actor = Deno.env.get("GH_WORKFLOW_ACTOR");
+ if (actor != null) {
+ text += `\ncc @${actor}`;
+ }
+
+ return text;
+ }
+}