Skip to content
Snippets Groups Projects
sentry-symbols.js 2.60 KiB
#!/usr/bin/env node

const SentryCli = require('@sentry/cli');
const download = require('electron-download');

const VERSION = /\bv?(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[\da-z-]+(?:\.[\da-z-]+)*)?(?:\+[\da-z-]+(?:\.[\da-z-]+)*)?\b/i;
const SYMBOL_CACHE_FOLDER = '.electron-symbols';
const package_ = require('./package.json');
const sentryCli = new SentryCli('./sentry.properties');

async function main() {
  let version = getElectronVersion();
  if (!version) {
    console.error('Cannot detect electron version, check package.json');
    return;
  }

  console.log('We are starting to download all possible electron symbols');
  console.log('We need it in order to symbolicate native crashes');
  console.log(
    'This step is only needed once whenever you update your electron version',
  );
  console.log('Just call this script again it should do everything for you.');

  let zipPath = await downloadSymbols({
    version,
    platform: 'darwin',
    arch: 'x64',
    dsym: true,
  });
  await sentryCli.execute(['upload-dif', '--org', 'shift-reset-llc', '--project', 'actual', '-t', 'dsym', zipPath], true);

  zipPath = await downloadSymbols({
    version,
    platform: 'win32',
    arch: 'ia32',
    symbols: true,
  });
  await sentryCli.execute(['upload-dif', '--org', 'shift-reset-llc', '--project', 'actual', '-t', 'breakpad', zipPath], true);

  zipPath = await downloadSymbols({
    version,
    platform: 'win32',
    arch: 'x64',
    symbols: true,
  });
  await sentryCli.execute(['upload-dif', '--org', 'shift-reset-llc', '--project', 'actual', '-t', 'breakpad', zipPath], true);

  zipPath = await downloadSymbols({
    version,
    platform: 'linux',
    arch: 'x64',
    symbols: true,
  });
  await sentryCli.execute(['upload-dif', '--org', 'shift-reset-llc', '--project', 'actual', '-t', 'breakpad', zipPath], true);

  console.log('Finished downloading and uploading to Sentry');
  console.log(`Feel free to delete the ${SYMBOL_CACHE_FOLDER}`);
}

function getElectronVersion() {
  if (!package_) {
    return false;
  }

  let electronVersion =
    (package_.dependencies && package_.dependencies.electron) ||
    (package_.devDependencies && package_.devDependencies.electron);

  if (!electronVersion) {
    return false;
  }

  const matches = VERSION.exec(electronVersion);
  return matches ? matches[0] : false;
}

async function downloadSymbols(options) {
  return new Promise((resolve, reject) => {
    download({ ...options, cache: SYMBOL_CACHE_FOLDER }, (err, zipPath) => {
      if (err) {
        reject(err);
      } else {
        resolve(zipPath);
      }
    });
  });
}

main().catch(e => console.error(e));