mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-24 19:10:22 +01:00
ce9dc12f75
* Automate the Flask release A Flask release will now be published alongside each main extension release. The version of each Flask release will be the same as the extension version except it will have the suffix `-flask.0`. * Programmatically remove build prefix The create GH release Bash script derives the Flask version from the Flask build filename by removing the build prefix, leaving just the version. Rather than hard-coding the prefix size to remove, it is now calculated programmatically so that it is easier to read and update. * Fix tag publishing The tab publishing step used the wrong credentials, and didn't properly identify the commit author. This has now been fixed.
134 lines
3.4 KiB
JavaScript
134 lines
3.4 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
const yargs = require('yargs/yargs');
|
|
const { hideBin } = require('yargs/helpers');
|
|
|
|
const { runCommand, runInShell } = require('./lib/run-command');
|
|
const { getVersion } = require('./lib/get-version');
|
|
const { BuildType } = require('./lib/build-type');
|
|
|
|
start().catch((error) => {
|
|
console.error(error);
|
|
process.exit(1);
|
|
});
|
|
|
|
async function start() {
|
|
const { argv } = yargs(hideBin(process.argv)).usage(
|
|
'$0 [options]',
|
|
'Publish a release to Sentry',
|
|
(_yargs) =>
|
|
_yargs
|
|
.option('org', {
|
|
default: 'metamask',
|
|
description: 'The Sentry organization',
|
|
type: 'string',
|
|
})
|
|
.option('project', {
|
|
default: 'metamask',
|
|
description: 'The Sentry project to publish',
|
|
type: 'string',
|
|
})
|
|
.option('build-type', {
|
|
default: BuildType.main,
|
|
description: 'The MetaMask extension build type',
|
|
choices: Object.values(BuildType),
|
|
})
|
|
.option('build-version', {
|
|
default: 0,
|
|
description: 'The MetaMask extension build version',
|
|
type: 'number',
|
|
}),
|
|
);
|
|
|
|
const { buildType, buildVersion, org, project } = argv;
|
|
|
|
process.env.SENTRY_ORG = org;
|
|
process.env.SENTRY_PROJECT = project;
|
|
|
|
const authWorked = await checkIfAuthWorks();
|
|
if (!authWorked) {
|
|
throw new Error(`Sentry auth failed`);
|
|
}
|
|
|
|
const version = getVersion(buildType, buildVersion);
|
|
|
|
// check if version exists or not
|
|
const versionAlreadyExists = await checkIfVersionExists(version);
|
|
// abort if versions exists
|
|
if (versionAlreadyExists) {
|
|
console.log(
|
|
`Version "${version}" already exists on Sentry, skipping version creation`,
|
|
);
|
|
} else {
|
|
// create sentry release
|
|
console.log(`creating Sentry release for "${version}"...`);
|
|
await runCommand('sentry-cli', ['releases', 'new', version]);
|
|
console.log(
|
|
`removing any existing files from Sentry release "${version}"...`,
|
|
);
|
|
await runCommand('sentry-cli', [
|
|
'releases',
|
|
'files',
|
|
version,
|
|
'delete',
|
|
'--all',
|
|
]);
|
|
}
|
|
|
|
// check if version has artifacts or not
|
|
const versionHasArtifacts =
|
|
versionAlreadyExists && (await checkIfVersionHasArtifacts(version));
|
|
if (versionHasArtifacts) {
|
|
console.log(
|
|
`Version "${version}" already has artifacts on Sentry, skipping sourcemap upload`,
|
|
);
|
|
return;
|
|
}
|
|
|
|
const additionalUploadArgs = [];
|
|
if (buildType !== BuildType.main) {
|
|
additionalUploadArgs.push('--dist-directory', `dist-${buildType}`);
|
|
}
|
|
// upload sentry source and sourcemaps
|
|
await runInShell('./development/sentry-upload-artifacts.sh', [
|
|
'--release',
|
|
version,
|
|
...additionalUploadArgs,
|
|
]);
|
|
}
|
|
|
|
async function checkIfAuthWorks() {
|
|
return await doesNotFail(() =>
|
|
runCommand('sentry-cli', ['releases', 'list']),
|
|
);
|
|
}
|
|
|
|
async function checkIfVersionExists(version) {
|
|
return await doesNotFail(() =>
|
|
runCommand('sentry-cli', ['releases', 'info', version]),
|
|
);
|
|
}
|
|
|
|
async function checkIfVersionHasArtifacts(version) {
|
|
const [artifact] = await runCommand('sentry-cli', [
|
|
'releases',
|
|
'files',
|
|
version,
|
|
'list',
|
|
]);
|
|
// When there's no artifacts, we get a response from the shell like this ['', '']
|
|
return artifact?.length > 0;
|
|
}
|
|
|
|
async function doesNotFail(asyncFn) {
|
|
try {
|
|
await asyncFn();
|
|
return true;
|
|
} catch (error) {
|
|
if (error.message === `Exited with code '1'`) {
|
|
return false;
|
|
}
|
|
throw error;
|
|
}
|
|
}
|