scripts/release.js (145 lines of code) (raw):
#!/usr/bin/env node
const prompt = require('prompt-sync')();
const fs = require('fs');
const path = require('path');
const {
currentVersion,
getLatestNPMJSSdkVersion,
getMajorVersion,
isCurrentMajorVersion,
isPreRelease,
versionBump,
} = require('./version-utils');
const {
logger,
spawnOrFail,
process,
shouldContinuePrompt,
checkWarning,
updateDependency
} = require('./utilities');
const currentBranch = (spawnOrFail('git', [' branch --show-current'], { skipOutput: true })).trim();
const latestNPMJSSdkVersion = getLatestNPMJSSdkVersion(currentVersion);
const deployDemo = (version) => {
logger.log('Deploying unique release candidate Meeting Demo URL...');
// Checkout the meeting demo
process.chdir(path.join(__dirname, '../..'));
let demoBranch = 'main';
if (!isCurrentMajorVersion()) {
demoBranch = `release-${getMajorVersion(currentVersion)}.x`;
}
if (!fs.existsSync('amazon-chime-sdk')) {
spawnOrFail('git', [`clone --branch ${demoBranch} https://github.com/aws-samples/amazon-chime-sdk.git`]);
} else {
spawnOrFail('rm', ['-rf amazon-chime-sdk']);
spawnOrFail('git', [`clone --branch ${demoBranch} https://github.com/aws-samples/amazon-chime-sdk.git`]);
}
// Update the demo to the most up to date version of JS SDK
process.chdir(path.join(__dirname, '../../amazon-chime-sdk/apps/meeting'));
updateDependency(`amazon-chime-sdk-js@${latestNPMJSSdkVersion}`);
process.chdir(path.join(__dirname, '../../amazon-chime-sdk/apps/meeting'));
updateDependency('amazon-chime-sdk-component-library-react', `../../../amazon-chime-sdk-component-library-react/amazon-chime-sdk-component-library-react-${version}.tgz`);
spawnOrFail('rm', [`-rf ../../../amazon-chime-sdk-component-library-react/amazon-chime-sdk-component-library-react-${version}.tgz`]);
process.chdir(path.join(__dirname, '../../amazon-chime-sdk/apps/meeting/serverless'));
const formattedVersion = version.replace(/\./g, '-');
spawnOrFail('node', [`./deploy.js -r us-east-1 -b chime-sdk-components-demo-${formattedVersion} -s chime-sdk-components-demo-${formattedVersion}`], { printErr: true });
process.chdir(path.join(__dirname, '..'));
spawnOrFail('rm', ['-rf ../amazon-chime-sdk']);
};
const getCurrentRemoteBranch = () => {
spawnOrFail('git', ['fetch origin'], { skipOutput: true });
return (spawnOrFail('git', ['for-each-ref --format="%(upstream:short)" "$(git symbolic-ref -q HEAD)"'], { skipOutput: true })).trim();
};
const buildAndPack = () => {
logger.log('Building package...');
spawnOrFail('npm', [`run build`]);
logger.log('Packaging ...');
spawnOrFail('npm', ['pack'], { printErr: true });
};
const updateJSSdkDep = () => {
// Update the peer dependency to the most updated version of the SDK
logger.log(`Installing SDK Version: ${latestNPMJSSdkVersion} as a peerDependency and devDependency of the react library.`);
let componentsPackageJson = JSON.parse(fs.readFileSync('package.json', 'utf-8'));
componentsPackageJson.peerDependencies['amazon-chime-sdk-js'] = `^${latestNPMJSSdkVersion}`;
componentsPackageJson.devDependencies['amazon-chime-sdk-js'] = `^${latestNPMJSSdkVersion}`;
fs.writeFileSync(
'package.json',
JSON.stringify(componentsPackageJson, null, 2)
);
spawnOrFail('npm', [`install`]);
};
const checkNPMDepsInstall = () => {
// Creates a new React test app, install component and sdk and build the test app to ensure no peer dependency warnings, errors or build issues
logger.log('Install amazon-chime-sdk-component-library-react and amazon-chime-sdk-js sdk as dependencies, check if there is peer dependency warning for amazon-chime-sdk-component-library-react');
process.chdir(path.join(__dirname, '../..'));
if (!fs.existsSync('dependency-check-app')) {
spawnOrFail('mkdir', ['dependency-check-app']);
} else {
spawnOrFail('rm', ['-rf dependency-check-app']);
spawnOrFail('mkdir', ['dependency-check-app']);
}
process.chdir(path.join(__dirname, '../../dependency-check-app'));
spawnOrFail('npm', ['init -y']);
spawnOrFail('npm', ['install react@18 react-dom@18']);
// As of June 5, 2023, running `npm install styled-components` fails due to this issue.
// https://github.com/styled-components/styled-components/issues/3998
// You must specify the version using `@version`.
spawnOrFail('npm', [`install amazon-chime-sdk-js@${latestNPMJSSdkVersion} styled-components@5.3.6 styled-system`]);
checkWarning('npm', [`install -q ../amazon-chime-sdk-component-library-react/amazon-chime-sdk-component-library-react-${currentVersion}.tgz`], null, 'amazon-chime-sdk-component-library-react');
process.chdir(path.join(__dirname, '..'));
spawnOrFail('rm', ['-rf ../dependency-check-app']);
};
const cleanUp = (remoteBranch) => {
logger.warn(`Warning: Resetting HEAD${remoteBranch ? ` to ${remoteBranch}` : ''}.\nAll current staged and local changes will be lost.`);
shouldContinuePrompt();
spawnOrFail('git', [`reset --hard ${remoteBranch ? remoteBranch : ''}`]);
spawnOrFail('git', [' clean -ffxd .']);
};
const release = () => {
const remoteBranch = getCurrentRemoteBranch();
if (!remoteBranch || (remoteBranch !== 'origin/main' && !(/^origin\/release-[0-9]+\.x$/).test(remoteBranch))) {
logger.error(`The local branch ${currentBranch} does not track either main or release-<version>.x branch`);
process.exit(1);
}
cleanUp(remoteBranch);
updateJSSdkDep();
buildAndPack();
checkNPMDepsInstall();
logger.log(`Do you want to upload these files to release-${currentVersion} branch?\n`);
shouldContinuePrompt();
spawnOrFail('git', [`push origin HEAD:release-${currentVersion} -f`]);
deployDemo(currentVersion);
// Bump next development version
versionBump();
};
const hotfix = () => {
if (isPreRelease(currentVersion)) {
logger.error(`We currently do not do hotfix for pre-release version.`);
process.exit(1);
}
cleanUp();
const newVersion = versionBump(1, 'hotfix');
updateJSSdkDep();
buildAndPack();
checkNPMDepsInstall();
deployDemo(newVersion);
};
const main = () => {
// Go to root dir
process.chdir(path.join(__dirname, '..'));
logger.log('Choose one of the following options:');
logger.log(' 1. Release');
logger.log(' 2. Hotfix');
logger.log(' 3. Deploy demo');
const option = prompt('');
switch (option) {
case '1':
release();
break;
case '2':
hotfix();
break;
case '3':
const remoteBranch = getCurrentRemoteBranch();
if (!remoteBranch || (!(remoteBranch.includes('origin/release-')) && (remoteBranch !== 'origin/hotfix'))) {
logger.error(`The local branch ${currentBranch} does not track either release or hotfix branch`);
process.exit(1);
}
cleanUp(remoteBranch);
spawnOrFail('npm', ['install']);
buildAndPack();
deployDemo(currentVersion);
break;
default:
if (option) {
logger.error('Invalid option');
}
process.exit(1);
}
};
main();