Merge pull request #814 from bitpayalan/native-build

Copay Native Binaries Build
This commit is contained in:
Matias Alejo Garcia 2014-07-07 09:21:35 -03:00
commit 63f6b9f751
8 changed files with 314 additions and 3 deletions

10
.gitignore vendored
View File

@ -55,3 +55,13 @@ coverage/
shell/bin/linux
shell/bin/darwin
shell/bin/win32
shell/scripts/bin
shell/scripts/build
dist/darwin
dist/linux
dist/windows
dist/*.dmg
dist/*.tar.gz
dist/*.exe

View File

@ -88,6 +88,19 @@ Once this script has completed, you can launch the shell-based Copay by running:
npm run shell
```
## Building Native Shell Binaries/Installers (OSX)
```
npm run dist
```
This script will download atom shell binaries and combine them with Copay sources
to build a DMG for osx-x64, an installer EXE for win32, and a .tar.gz for linux-x64.
It was developed to be run on OSX. The outputs are copied to the dist directory.
DMG is created with hdiutil
EXE is created with makensis (brew install makensis)
## Tests
Open test/index.html in your browser to test the models. Install and run karma

1
dist/README.md vendored Normal file
View File

@ -0,0 +1 @@
This is the destination directory for the built atom-shell binaries and the files used to create them

View File

@ -25,7 +25,8 @@
"shell": "node shell/scripts/launch.js",
"setup-shell": "node shell/scripts/download-atom-shell.js",
"chrome": "source browser-extensions/chrome/build.sh",
"firefox": "source browser-extensions/firefox/build.sh"
"firefox": "source browser-extensions/firefox/build.sh",
"dist": "node shell/scripts/dist.js"
},
"homepage": "https://github.com/bitpay/copay",
"devDependencies": {

View File

@ -8,4 +8,5 @@ using [Atom Shell](https://github.com/atom/atom-shell).
## Building
Automated build scripts are currently being developed.
Run from the top level (copay) directory:
npm run dist

View File

@ -12,7 +12,7 @@ module.exports = function(copay) {
// quit when all windows are closed
app.on('window-all-closed', function() {
if (process.platform !== 'darwin') app.quit();
app.quit();
});
// initilization when ready

181
shell/scripts/dist.js Normal file
View File

@ -0,0 +1,181 @@
require('shelljs/global');
var color = require('cli-color');
var download = require('./lib/download')();
var async = require('async');
var atom_version = 'v0.13.0';
var app_root = './';
var build_dir = 'shell/scripts/build';
var dist_dir = 'dist';
var darwin_app_dir = '/Copay.app/Contents/Resources/app';
var linux_app_dir = '/resources/app';
var windows_app_dir = '/resources/app';
console.log(color.blue('{copay}'), '');
console.log(color.blue('{copay}'), 'Preparing to build Copay binaries');
console.log(color.blue('{copay}'), '');
/* Clean up before the build */
rm('-rf', build_dir);
rm(dist_dir + '/Copay*');
rm('-rf', dist_dir + '/darwin', dist_dir + '/linux', dist_dir + '/windows');
// Download the atom shell binaries. If you exceed your download quota,
// just download the zips manually and unpack them into shell/scripts/bin/<platform>
async.series([
function(callback) {
download.atom(atom_version, 'darwin', 'x64', callback);
},
function(callback){
download.atom(atom_version, 'linux', 'x64', callback);
},
function(callback) {
download.atom(atom_version, 'win32', 'ia32', callback);
},
function() {
runBuild();
}]);
function runBuild() {
mkdir(build_dir);
/* DARWIN BUILD */
console.log(color.blue('{copay}'), '');
console.log(color.blue('{copay}'), 'Starting DARWIN build');
console.log(color.blue('{copay}'), '');
// Copy the core atom shell
cp('-r', app_root + '/shell/scripts/bin/darwin/*', build_dir);
mv(build_dir + '/Atom.app', build_dir + '/Copay.app');
mv(build_dir + '/Copay.app/Contents/MacOS/Atom', build_dir + '/Copay.app/Contents/MacOS/Copay');
// Replace Atom darwin assets with Copay assets
cp(app_root + '/shell/assets/darwin/copay.icns', build_dir + '/Copay.app/Contents/Resources/copay.icns');
cp('-f', app_root + '/shell/assets/darwin/Info.plist', build_dir + '/Copay.app/Contents/Info.plist');
rm(build_dir + '/Copay.app/Contents/Resources/atom.icns');
// Copy Copay sources
cp('-r', app_root + '/css', build_dir + darwin_app_dir);
cp('-r', app_root + '/js', build_dir + darwin_app_dir);
cp('-r', app_root + '/font', build_dir + darwin_app_dir);
cp('-r', app_root + '/img', build_dir + darwin_app_dir);
cp('-r', app_root + '/lib', build_dir + darwin_app_dir);
cp('-r', app_root + '/sound', build_dir + darwin_app_dir);
cp('-r', app_root + '/shell/*.js*', build_dir + darwin_app_dir + '/shell');
cp('-r', app_root + '/shell/lib/*', build_dir + darwin_app_dir + '/shell/lib');
cp(app_root + '*.js', build_dir + darwin_app_dir);
cp(app_root + '*.json', build_dir + darwin_app_dir);
cp(app_root + '*.html', build_dir + darwin_app_dir);
// Copay needs express, put other node deps here if you need any
cp('-r', app_root + '/node_modules/express', build_dir + darwin_app_dir + "/node_modules");
// Clean up extra Atom sources
rm('-r', build_dir + darwin_app_dir + '/../*.lproj');
rm('-r', build_dir + darwin_app_dir + '/../default_app');
mkdir('-p', app_root + '/dist/darwin');
cp('-r', app_root + build_dir + '/*', app_root + '/dist/darwin/');
rm('-rf', app_root + build_dir + '/*');
console.log(color.blue('{copay}'), 'Copied files to ' + 'dist/darwin');
if (which('hdiutil') != null) {
cd(app_root + '/dist/darwin');
exec('ln -s /Applications Applications');
exec('hdiutil create ../Copay-darwin-x64.dmg -volname "Copay Installer - Drag Copay to Applications Folder" -fs HFS+ -srcfolder "."');
exec("rm Applications");
cd('../..');
}
/* Linux Build */
console.log(color.blue('{copay}'), '');
console.log(color.blue('{copay}'), 'Starting LINUX build');
console.log(color.blue('{copay}'), '');
// Copy the core atom shell
cp('-r', app_root + '/shell/scripts/bin/linux/*', build_dir);
mv(build_dir + '/atom', build_dir + '/Copay');
// Copy Copay sources
cp('-r', app_root + '/css', build_dir + linux_app_dir);
cp('-r', app_root + '/js', build_dir + linux_app_dir);
cp('-r', app_root + '/font', build_dir + linux_app_dir);
cp('-r', app_root + '/img', build_dir + linux_app_dir);
cp('-r', app_root + '/lib', build_dir + linux_app_dir);
cp('-r', app_root + '/sound', build_dir + linux_app_dir);
cp('-r', app_root + '/shell/*.js*', build_dir + linux_app_dir + '/shell');
cp('-r', app_root + '/shell/lib/*', build_dir + linux_app_dir + '/shell/lib');
cp(app_root + '*.js', build_dir + linux_app_dir);
cp(app_root + '*.json', build_dir + linux_app_dir);
cp(app_root + '*.html', build_dir + linux_app_dir);
cp('-r', app_root + '/node_modules/express', build_dir + linux_app_dir + "/node_modules");
// Clean up extra Atom sources
rm('-r', build_dir + linux_app_dir + '/../default_app');
cp('-r', app_root + build_dir + '/*', app_root + '/dist/linux');
rm('-rf', app_root + build_dir + '/*');
exec('tar czf ./dist/Copay-linux-x64.tar.gz -C ./dist/linux .');
console.log(color.blue('{copay}'), 'Copied files to ' + 'dist/linux');
/* Windows Build */
console.log(color.blue('{copay}'), '');
console.log(color.blue('{copay}'), 'Starting WIN32 build');
console.log(color.blue('{copay}'), '');
// Copy the core atom shell
cp('-r', app_root + '/shell/scripts/bin/win32/*', build_dir);
mv(build_dir + '/atom.exe', build_dir + '/Copay.exe');
// Copy Copay sources
cp('-r', app_root + '/css', build_dir + windows_app_dir);
cp('-r', app_root + '/js', build_dir + windows_app_dir);
cp('-r', app_root + '/font', build_dir + windows_app_dir);
cp('-r', app_root + '/img', build_dir + windows_app_dir);
cp('-r', app_root + '/lib', build_dir + windows_app_dir);
cp('-r', app_root + '/sound', build_dir + windows_app_dir);
cp('-r', app_root + '/shell/*.js*', build_dir + windows_app_dir + '/shell');
cp('-r', app_root + '/shell/lib/*', build_dir + windows_app_dir + '/shell/lib');
cp(app_root + '*.js', build_dir + windows_app_dir);
cp(app_root + '*.json', build_dir + windows_app_dir);
cp(app_root + '*.html', build_dir + windows_app_dir);
cp('-r', app_root + '/node_modules/express', build_dir + windows_app_dir + "/node_modules");
cp(app_root + "/shell/assets/win32/*", build_dir);
rm('-r', build_dir + windows_app_dir + '/../default_app');
mkdir('-p', app_root + '/dist/windows');
cp('-r', app_root + build_dir + '/*', app_root + '/dist/windows/');
rm('-rf', app_root + build_dir + '/*');
console.log(color.blue('{copay}'), 'Copied files to ' + 'dist/windows');
// generating windows installer requires makensis
// install on OSX with "brew install makensis"
if (which('makensis') != null) {
console.log(color.blue('{copay}'), 'Running NSIS to generate win32 installer');
cd('dist/windows');
exec('makensis -V2 build-installer.nsi');
cd("../../");
cp('dist/windows/copay-setup.exe', app_root + '/dist/Copay-setup-win32.exe')
}
console.log(color.blue('{copay}'));
console.log(color.blue('{copay}'), 'BUILD COMPLETE');
console.log(color.blue('{copay}'), 'Files can be found in the dist directory');
}

View File

@ -0,0 +1,104 @@
var path = require('path');
var fs = require('fs');
var GitHub = require('github-releases');
var async = require('async');
var readl = require('readline');
var color = require('cli-color');
var github = new GitHub({ repo: 'atom/atom-shell' });
var exec = require('child_process').exec;
var os = require('os');
var Static = function() {
return {
atom: function(version, platform, arch, callback) {
var targetRoot = path.normalize(__dirname + '/../bin/'),
target = path.normalize(__dirname + '/../bin/' + platform);
console.log(color.blue('{copay}'), 'Downloading atom-shell ' + version + ' ' + platform + '-' + arch);
if(!fs.existsSync(targetRoot)) {
fs.mkdirSync(targetRoot);
}
if (!fs.existsSync(target)) {
fs.mkdirSync(target);
} else {
console.log(color.blue('{copay}'), platform + '-' + arch + ' ' + ' already downloaded');
callback.call(this, null);
return;
}
console.log(color.blue('{copay}'), 'getting atom-shell release ' + version);
github.getReleases({ tag_name: version }, function(err, releases) {
var filename = 'atom-shell-' + version + '-' + platform + '-' + arch + '.zip';
if (err || !releases.length) {
console.log(err);
return console.log(color.blue('{copay}'), 'Release not found');
}
console.log(color.blue('{copay}'), 'looking for prebuilt binary ' + filename);
for (var a = 0; a < releases[0].assets.length; a++) {
var asset = releases[0].assets[a];
if (asset.name === filename) {
console.log(color.blue('{copay}'), 'downloading ' + asset.name);
var rl = readl.createInterface({
input: process.stdin,
output: process.stdout
});
rl.write(' bytes received: 0');
return github.downloadAsset(asset, function(err, inStream) {
if (err) {
console.log(err);
process.exit();
}
var bytes = 0;
inStream.on('data', function(chunk) {
rl.write(null, { ctrl: true, name: 'u' });
rl.write(' bytes received: ' + (bytes + chunk.length));
bytes += chunk.length;
});
inStream.on('end', function() {
rl.close();
console.log('');
console.log(color.blue('{copay}'), 'downloaded!');
});
var out = target;
var tmp = os.tmpDir() + '/atom-shell.zip';
var outStream = fs.createWriteStream(tmp);
outStream.on('finish', function() {
console.log(color.blue('{copay}'), 'unzipping archive');
exec('unzip -o ' + tmp + ' -d ' + out, function(err, stdout, stderr) {
console.log(err || stderr || (color.blue('{copay}') + ' done!'))
callback.call(this, null);
});
});
inStream.pipe(outStream);
});
}
}
});
}
}
}
module.exports = Static;