zepio/scripts/release.js

100 lines
2.6 KiB
JavaScript

// @flow
/* eslint-disable no-console */
/* eslint-disable import/no-extraneous-dependencies */
/* eslint-disable prefer-destructuring */
import '@babel/polyfill';
import fs from 'fs';
import path from 'path';
import cp from 'child_process';
import Octokit from '@octokit/rest';
import eres from 'eres';
import mime from 'mime-types';
import packageJson from '../package';
const DIST_FOLDER = path.join(__dirname, '..', './dist');
const VERSION = packageJson.version;
const GH_TOKEN = process.env.GH_TOKEN;
const OWNER = 'andrerfneves';
const PROJECT = 'zepio';
const octokit = new Octokit({ auth: GH_TOKEN });
const signBinaries = binaries => new Promise((resolve, reject) => {
const signProcess = cp.spawn(`${__dirname}/codesign.sh`, binaries);
signProcess.stdout.on('data', out => console.log('[Code Sign]', out.toString()));
signProcess.on('exit', (code) => {
if (code === 0) {
resolve(path.join(__dirname, '..', 'signatures.zip'));
} else {
reject();
}
});
});
const getFileName = (name) => {
const extension = name.substr(name.length - 3);
switch (extension) {
case 'dmg':
return `Zepio-macOS-v${VERSION}.dmg`;
case 'deb':
return `zepio-linux-v${VERSION}.deb`;
case 'exe':
return `Zepio-Windows-v${VERSION}.exe`;
case 'zip':
return `signatures-v${VERSION}.zip`;
default:
return 'Zepio';
}
};
(async () => {
console.log(`Creating release v${VERSION}`);
const [createReleaseError, createReleaseResponse] = await eres(
octokit.repos.createRelease({
owner: OWNER,
repo: PROJECT,
tag_name: `v${VERSION}`,
name: `v${VERSION}`,
}),
);
if (createReleaseError) {
console.log(createReleaseError);
return;
}
const files = await fs.readdirSync(DIST_FOLDER);
const binaries = files
.filter(name => name.endsWith('.exe') || name.endsWith('.deb') || name.endsWith('dmg'))
.map(bin => ({ path: `${DIST_FOLDER}/${bin}`, name: bin }));
const [, signaturesPath] = await eres(signBinaries(binaries.map(bin => bin.path)));
if (!signaturesPath) {
throw new Error("Error: Can't sign files, please verify the output");
}
const filesToUpload = [...binaries, { path: signaturesPath, name: 'signatures.zip' }];
await Promise.all(
filesToUpload.map(async ({ path: fPath, name }) => {
const file = fs.readFileSync(fPath);
await octokit.repos.uploadReleaseAsset({
headers: {
'content-length': file.length,
'content-type': mime.lookup(fPath),
},
url: createReleaseResponse.data.upload_url,
name: getFileName(name),
file: fs.createReadStream(fPath),
});
}),
);
})();