Add RC draft post command, make some minor improvements to beta post command (#37288)
This commit is contained in:
parent
d625f72e2b
commit
5528c762f1
|
@ -11,6 +11,7 @@ program
|
|||
.version( '0.0.1' )
|
||||
.command( 'release', 'Generate release post', { isDefault: true } )
|
||||
.command( 'beta', 'Generate draft beta release post' )
|
||||
.command( 'rc', 'Generate draft RC release post' )
|
||||
.command(
|
||||
'contributors',
|
||||
'Generate a list of contributors for a release post'
|
||||
|
|
|
@ -51,7 +51,10 @@ const program = new Command()
|
|||
year: 'numeric',
|
||||
} )
|
||||
)
|
||||
.option( '--outputOnly', 'Only output the post, do not publish it' )
|
||||
.option(
|
||||
'--outputOnly',
|
||||
'Only output the post as HTML, do not publish a draft.'
|
||||
)
|
||||
.option(
|
||||
'--tags <tags>',
|
||||
'Comma separated list of tags to add to the post.',
|
||||
|
@ -87,7 +90,8 @@ const program = new Command()
|
|||
if (
|
||||
! semverVersion ||
|
||||
! semverVersion.prerelease.length ||
|
||||
typeof semverVersion.prerelease[ 1 ] === 'string'
|
||||
typeof semverVersion.prerelease[ 1 ] === 'string' ||
|
||||
semverVersion.prerelease[ 0 ] !== 'beta'
|
||||
) {
|
||||
throw new Error(
|
||||
`Invalid current version: ${ releaseVersion }. Provide current version in x.y.z-beta.n format.`
|
||||
|
@ -209,13 +213,16 @@ const program = new Command()
|
|||
Logger.notice( `Output written to ${ tmpFile }` );
|
||||
} else {
|
||||
Logger.startTask( 'Publishing draft release post' );
|
||||
await createWpComDraftPost(
|
||||
const { ID } = await createWpComDraftPost(
|
||||
siteId,
|
||||
`WooCommerce ${ semverVersion.major }.${ semverVersion.minor } Beta ${ prereleaseVersion } Released`,
|
||||
html,
|
||||
postTags,
|
||||
authToken
|
||||
);
|
||||
Logger.notice(
|
||||
`Release post created, edit it here: \nhttps://wordpress.com/post/developer.woocommerce.com/${ ID }`
|
||||
);
|
||||
Logger.endTask();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,229 @@
|
|||
/**
|
||||
* External dependencies
|
||||
*/
|
||||
import semver from 'semver';
|
||||
import { writeFile } from 'fs/promises';
|
||||
import { tmpdir } from 'os';
|
||||
import { join } from 'path';
|
||||
import { Logger } from 'cli-core/src/logger';
|
||||
import { Command } from '@commander-js/extra-typings';
|
||||
import dotenv from 'dotenv';
|
||||
// @ts-expect-error - The enquirer types are incorrect.
|
||||
// eslint-disable-next-line @woocommerce/dependency-group
|
||||
import { Select } from 'enquirer';
|
||||
|
||||
/**
|
||||
* Internal dependencies
|
||||
*/
|
||||
import { renderTemplate } from '../../lib/render-template';
|
||||
import { getWordpressComAuthToken } from '../../lib/oauth-helper';
|
||||
import { getEnvVar } from '../../lib/environment';
|
||||
import { getMostRecentBeta, getMostRecentFinal } from '../../lib/github-api';
|
||||
import {
|
||||
getFirstTuesdayOfTheMonth,
|
||||
getSecondTuesdayOfTheMonth,
|
||||
} from '../../lib/dates';
|
||||
import {
|
||||
createWpComDraftPost,
|
||||
searchForPostsByCategory,
|
||||
} from '../../lib/draft-post';
|
||||
|
||||
const DEVELOPER_WOOCOMMERCE_SITE_ID = '96396764';
|
||||
|
||||
dotenv.config();
|
||||
|
||||
// Define the release post command
|
||||
const program = new Command()
|
||||
.command( 'beta' )
|
||||
.description( 'CLI to automate generation of a draft RC release post.' )
|
||||
.argument(
|
||||
'<releaseVersion>',
|
||||
'The version for this post in x.y.z-rc.n format. Ex: 7.1.0-rc.1'
|
||||
)
|
||||
.option(
|
||||
'--releaseDate <date>',
|
||||
'The date for the final release as mm-dd-yyyy, year inferred as current year, defaults to second tuesday of next month.',
|
||||
getSecondTuesdayOfTheMonth(
|
||||
new Date().getMonth() + 1
|
||||
).toLocaleDateString( 'en-US', {
|
||||
month: '2-digit',
|
||||
day: '2-digit',
|
||||
year: 'numeric',
|
||||
} )
|
||||
)
|
||||
.option(
|
||||
'--outputOnly',
|
||||
'Only output the post as HTML, do not publish a draft.'
|
||||
)
|
||||
.option(
|
||||
'--tags <tags>',
|
||||
'Comma separated list of tags to add to the post.',
|
||||
'Releases,WooCommerce Core'
|
||||
)
|
||||
.option(
|
||||
'--siteId <siteId>',
|
||||
'For posting to a non-default site (for testing)'
|
||||
)
|
||||
.action( async ( releaseVersion, options ) => {
|
||||
const {
|
||||
outputOnly,
|
||||
siteId = DEVELOPER_WOOCOMMERCE_SITE_ID,
|
||||
tags,
|
||||
releaseDate,
|
||||
} = options;
|
||||
|
||||
const postTags = ( tags &&
|
||||
tags.split( ',' ).map( ( tag ) => tag.trim() ) ) || [
|
||||
'WooCommerce Core',
|
||||
'Releases',
|
||||
];
|
||||
|
||||
const finalReleaseDate = new Date( releaseDate );
|
||||
const isOutputOnly = !! outputOnly;
|
||||
const semverVersion = semver.parse( releaseVersion );
|
||||
|
||||
// This is supposed to be a RC post so throw if the version provided is not an RC version.
|
||||
// Things we don't accept:
|
||||
// * missing rc.x
|
||||
// * any other kind of prerelease, e.g. beta
|
||||
// * .x must be a number, so not: rc.1b or rc.1.1 but rc.1 is ok.
|
||||
if (
|
||||
! semverVersion ||
|
||||
! semverVersion.prerelease.length ||
|
||||
typeof semverVersion.prerelease[ 1 ] === 'string' ||
|
||||
semverVersion.prerelease[ 0 ] !== 'rc'
|
||||
) {
|
||||
throw new Error(
|
||||
`Invalid current version: ${ releaseVersion }. Provide current version in x.y.z-rc.n format.`
|
||||
);
|
||||
} else {
|
||||
const [ , prereleaseVersion ] = semverVersion.prerelease;
|
||||
|
||||
// Now infer the previous version, if the one you provide is rc.1 we'll need to find the last beta release from
|
||||
// Github releases. If what you provided is rc.2 we'll assume previous was rc.1
|
||||
const previousVersion =
|
||||
prereleaseVersion === 1
|
||||
? ( await getMostRecentBeta() ).tag_name
|
||||
: `${ semverVersion.major }.${ semverVersion.minor }.${
|
||||
semverVersion.patch
|
||||
}-rc.${ prereleaseVersion - 1 }`;
|
||||
|
||||
const semverPreviousVersion = semver.parse( previousVersion );
|
||||
|
||||
if ( ! semverPreviousVersion ) {
|
||||
throw new Error(
|
||||
`Could not parse previous version from: ${ previousVersion }`
|
||||
);
|
||||
}
|
||||
|
||||
const clientId = getEnvVar( 'WPCOM_OAUTH_CLIENT_ID', true );
|
||||
const clientSecret = getEnvVar( 'WPCOM_OAUTH_CLIENT_SECRET', true );
|
||||
const redirectUri =
|
||||
getEnvVar( 'WPCOM_OAUTH_REDIRECT_URI' ) ||
|
||||
'http://localhost:3000/oauth';
|
||||
|
||||
Logger.startTask(
|
||||
'Getting auth token for WordPress.com (needed to find last RC post).'
|
||||
);
|
||||
const authToken = await getWordpressComAuthToken(
|
||||
clientId,
|
||||
clientSecret,
|
||||
siteId,
|
||||
redirectUri,
|
||||
'posts'
|
||||
);
|
||||
Logger.endTask();
|
||||
|
||||
const versionSearch =
|
||||
prereleaseVersion === 1
|
||||
? `WooCommerce ${ semverPreviousVersion.major }.${ semverPreviousVersion.minor }.${ semverPreviousVersion.patch } Beta`
|
||||
: `WooCommerce ${ semverPreviousVersion.major }.${ semverPreviousVersion.minor } Release Candidate`;
|
||||
|
||||
Logger.startTask(
|
||||
`Finding recent release posts with title: ${ versionSearch }`
|
||||
);
|
||||
|
||||
const posts =
|
||||
( await searchForPostsByCategory(
|
||||
siteId,
|
||||
versionSearch,
|
||||
'WooCommerce Core',
|
||||
authToken
|
||||
) ) || [];
|
||||
|
||||
Logger.endTask();
|
||||
|
||||
const prompt = new Select( {
|
||||
name: 'Previous post',
|
||||
message: 'Choose the previous post to link to:',
|
||||
choices: posts.length
|
||||
? posts.map( ( p ) => p.title )
|
||||
: [ 'No posts found - generate default link' ],
|
||||
} );
|
||||
|
||||
const lastReleasePostTitle: string = await prompt.run();
|
||||
const lastReleasePost = posts.find(
|
||||
( p ) => p.title === lastReleasePostTitle
|
||||
);
|
||||
|
||||
if ( ! lastReleasePost ) {
|
||||
Logger.warn(
|
||||
'Could not find previous release post, make sure to update the link in the post before publishing.'
|
||||
);
|
||||
}
|
||||
|
||||
if ( ! authToken && ! isOutputOnly ) {
|
||||
throw new Error(
|
||||
'Error getting auth token, check your env settings are correct.'
|
||||
);
|
||||
} else {
|
||||
const html = await renderTemplate( 'rc-release.ejs', {
|
||||
releaseDate,
|
||||
rcNumber: prereleaseVersion,
|
||||
version: semverVersion,
|
||||
previousVersion: semverPreviousVersion,
|
||||
prettyVersion: `${ semverVersion.major }.${ semverVersion.minor }.${ semverVersion.patch } RC ${ prereleaseVersion }`,
|
||||
prettyPreviousVersion: `${ semverPreviousVersion.major }.${
|
||||
semverPreviousVersion.minor
|
||||
}.${ semverPreviousVersion.patch }${
|
||||
semverPreviousVersion.prerelease.length
|
||||
? ' ' +
|
||||
semverPreviousVersion.prerelease[ 0 ] +
|
||||
' ' +
|
||||
semverPreviousVersion.prerelease[ 1 ]
|
||||
: ''
|
||||
}`,
|
||||
finalReleaseDate,
|
||||
lastReleasePostUrl:
|
||||
lastReleasePost?.URL ||
|
||||
'https://developer.woocommerce.com/category/woocommerce-core-release-notes/',
|
||||
} );
|
||||
|
||||
if ( isOutputOnly ) {
|
||||
const tmpFile = join(
|
||||
tmpdir(),
|
||||
`rc-release-${ releaseVersion }.html`
|
||||
);
|
||||
|
||||
await writeFile( tmpFile, html );
|
||||
|
||||
Logger.notice( `Output written to ${ tmpFile }` );
|
||||
} else {
|
||||
Logger.startTask( 'Publishing draft release post' );
|
||||
const { ID } = await createWpComDraftPost(
|
||||
siteId,
|
||||
`WooCommerce ${ semverVersion.major }.${ semverVersion.minor } Release Candidate ${ prereleaseVersion }`,
|
||||
html,
|
||||
postTags,
|
||||
authToken
|
||||
);
|
||||
Logger.notice(
|
||||
`Release post created, edit it here: \nhttps://wordpress.com/post/developer.woocommerce.com/${ ID }`
|
||||
);
|
||||
Logger.endTask();
|
||||
}
|
||||
}
|
||||
}
|
||||
} );
|
||||
|
||||
program.parse( process.argv );
|
|
@ -115,3 +115,31 @@ export const getMostRecentFinal = async () => {
|
|||
|
||||
return release.data;
|
||||
};
|
||||
|
||||
export const getMostRecentBeta = async () => {
|
||||
const octokit = new Octokit( {
|
||||
auth: getEnvVar( 'GITHUB_ACCESS_TOKEN', true ),
|
||||
} );
|
||||
|
||||
const { data: releases } = await octokit.repos.listReleases( {
|
||||
owner: 'woocommerce',
|
||||
repo: 'woocommerce',
|
||||
} );
|
||||
|
||||
const betaReleases = releases.filter(
|
||||
( release ) =>
|
||||
release?.name && release.name.toLowerCase().includes( 'beta' )
|
||||
);
|
||||
|
||||
if ( betaReleases.length === 0 ) {
|
||||
throw new Error( 'No beta releases found' );
|
||||
}
|
||||
|
||||
const latestBetaRelease = betaReleases.reduce( ( latest, current ) => {
|
||||
const latestDate = new Date( latest.created_at );
|
||||
const currentDate = new Date( current.created_at );
|
||||
return currentDate > latestDate ? current : latest;
|
||||
} );
|
||||
|
||||
return latestBetaRelease;
|
||||
};
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>No changes introduced.</p>
|
||||
<p>Insert action and filter changes here.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"anchor":"database-changes"} -->
|
||||
|
@ -62,7 +62,7 @@
|
|||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>No changes introduced.</p>
|
||||
<p>Insert db changes here.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"anchor":"template-changes"} -->
|
||||
|
@ -70,7 +70,7 @@
|
|||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>No changes introduced.</p>
|
||||
<p>Insert template changes here.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"anchor":"release-schedule"} -->
|
||||
|
|
|
@ -0,0 +1,115 @@
|
|||
<!-- wp:paragraph -->
|
||||
<p>Release Candidate <%= rcNumber %> for the <%=
|
||||
finalReleaseDate.toLocaleDateString('en-US', {month: 'long', day:
|
||||
'numeric'}) %> release of WooCommerce is now available for testing! You can
|
||||
either
|
||||
<a
|
||||
href="https://downloads.wordpress.org/plugin/woocommerce.<%= version.version %>.zip"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>download it directly from WordPress.org</a
|
||||
>
|
||||
or install our
|
||||
<a
|
||||
rel="noreferrer noopener"
|
||||
href="https://woocommerce.wordpress.com/2018/07/30/woocommerce-beta-tester-2-0-0/"
|
||||
target="_blank"
|
||||
>WooCommerce Beta Tester Plugin</a
|
||||
>.
|
||||
</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">What's New?</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Since the release of
|
||||
<a href="<%= lastReleasePostUrl %>"><%= prettyPreviousVersion %></a>, the
|
||||
following changes have been made:
|
||||
</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:list -->
|
||||
<ul>
|
||||
<!-- wp:list-item -->
|
||||
<li>List the changes to the release here.</li>
|
||||
<!-- /wp:list-item -->
|
||||
</ul>
|
||||
<!-- /wp:list -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">Actions and Filters</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Insert action and filter changes here.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">Template Changes</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Insert template changes here.</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"anchor":"release-schedule"} -->
|
||||
<h2 class="wp-block-heading" id="release-schedule">Release Schedule</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>We're still on track for our planned <%=
|
||||
finalReleaseDate.toLocaleDateString('en-US', {month: 'long', day:
|
||||
'numeric'}) %> release of WooCommerce <%= version.major %>.<%= version.minor
|
||||
%>.
|
||||
</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading {"anchor":"testing"} -->
|
||||
<h2 class="wp-block-heading" id="testing">Testing</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>If you'd like to dive in and help test this new release, our handy <a
|
||||
href="https://wordpress.org/plugins/woocommerce-beta-tester/"
|
||||
target="_blank"
|
||||
>WooCommerce Beta Tester plugin</a
|
||||
> allows you to switch between beta versions and release candidates.
|
||||
You can also <a
|
||||
href="https://downloads.wordpress.org/plugin/woocommerce.<%= version.version %>.zip"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>download the release from WordPress.org</a
|
||||
>.
|
||||
</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>A set of testing instructions has been published on our <a
|
||||
href="https://github.com/woocommerce/woocommerce/wiki/Release-Testing-Instructions-WooCommerce-<%= version.major %>.<%= version.minor %>"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>Wiki page in GitHub</a
|
||||
>. We've also posted <a
|
||||
href="https://woocommerce.wordpress.com/2015/07/25/how-to-beta-test-woocommerce/"
|
||||
target="_blank"
|
||||
>a helpful writeup on beta testing</a
|
||||
> to help get you started.
|
||||
</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>If you discover any bugs during the testing process, please let us know
|
||||
by <a
|
||||
href="https://github.com/woocommerce/woocommerce/issues/new?assignees=&labels=&template=1-bug-report.yml&title=[<%= version.major %>.<%= version.minor %> RC]: Title of the issue"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>logging a report in GitHub</a
|
||||
>.
|
||||
</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p></p>
|
||||
<!-- /wp:paragraph -->
|
Loading…
Reference in New Issue