1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-24 19:10:22 +01:00
metamask-extension/development/sentry-publish.js
Mark Stacey ce9dc12f75 Automate the Flask release process (#13898)
* 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.
2022-03-22 19:55:51 -07:00

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;
}
}