Merge pull request #557 from kitematic/opt-in-binaries

Opt-in copying of binaries to /usr/local/bin
This commit is contained in:
Jeffrey Morgan 2015-05-27 18:41:29 -07:00
commit f4825a3be9
11 changed files with 61 additions and 69 deletions

2
.gitignore vendored
View File

@ -13,7 +13,7 @@ identity*
integration integration
# Resources # Resources
resources/docker-* resources/docker*
resources/boot2docker-* resources/boot2docker-*
# Cache # Cache

View File

@ -33,8 +33,6 @@ describe('SetupStore', function () {
describe('install step', function () { describe('install step', function () {
util.exec.mockReturnValue(Promise.resolve()); util.exec.mockReturnValue(Promise.resolve());
setupUtil.copyBinariesCmd.mockReturnValue(Promise.resolve());
setupUtil.fixBinariesCmd.mockReturnValue(Promise.resolve());
virtualBox.killall.mockReturnValue(Promise.resolve()); virtualBox.killall.mockReturnValue(Promise.resolve());
setupUtil.installVirtualBoxCmd.mockReturnValue(Promise.resolve()); setupUtil.installVirtualBoxCmd.mockReturnValue(Promise.resolve());
setupUtil.macSudoCmd.mockImplementation(cmd => 'macsudo ' + cmd); setupUtil.macSudoCmd.mockImplementation(cmd => 'macsudo ' + cmd);
@ -42,24 +40,11 @@ describe('SetupStore', function () {
pit('installs virtualbox if it is not installed', function () { pit('installs virtualbox if it is not installed', function () {
virtualBox.installed.mockReturnValue(false); virtualBox.installed.mockReturnValue(false);
util.exec.mockReturnValue(Promise.resolve()); util.exec.mockReturnValue(Promise.resolve());
return setupStore.steps().install.run().then(() => { return setupStore.steps().install.run(() => {}).then(() => {
expect(virtualBox.killall).toBeCalled(); expect(virtualBox.killall).toBeCalled();
expect(setupUtil.copyBinariesCmd).toBeCalled();
expect(setupUtil.fixBinariesCmd).toBeCalled();
expect(setupUtil.installVirtualBoxCmd).toBeCalled(); expect(setupUtil.installVirtualBoxCmd).toBeCalled();
}); });
}); });
pit('only installs binaries if virtualbox is installed', function () {
virtualBox.installed.mockReturnValue(true);
util.compareVersions.mockReturnValue(0);
setupUtil.needsBinaryFix.mockReturnValue(true);
return setupStore.steps().install.run().then(() => {
expect(setupUtil.copyBinariesCmd).toBeCalled();
expect(setupUtil.fixBinariesCmd).toBeCalled();
expect(setupUtil.installVirtualBoxCmd).not.toBeCalled();
});
});
}); });
describe('init step', function () { describe('init step', function () {

View File

@ -26,7 +26,7 @@
} }
], ],
"docker-version": "1.6.2", "docker-version": "1.6.2",
"docker-machine-version": "0.2.0", "docker-machine-version": "0.3.0",
"electron-version": "0.26.0", "electron-version": "0.26.0",
"virtualbox-version": "4.3.28", "virtualbox-version": "4.3.28",
"virtualbox-filename": "VirtualBox-4.3.28.pkg", "virtualbox-filename": "VirtualBox-4.3.28.pkg",

View File

@ -3,8 +3,10 @@ var app = remote.require('app');
var shell = require('shell'); var shell = require('shell');
var router = require('./router'); var router = require('./router');
var util = require('./utils/Util'); var util = require('./utils/Util');
var setupUtil = require('./utils/SetupUtil');
var metrics = require('./utils/MetricsUtil'); var metrics = require('./utils/MetricsUtil');
var machine = require('./utils/DockerMachineUtil'); var machine = require('./utils/DockerMachineUtil');
var dialog = remote.require('dialog');
import docker from './utils/DockerUtil'; import docker from './utils/DockerUtil';
// main.js // main.js
@ -35,8 +37,25 @@ var MenuTemplate = function () {
type: 'separator' type: 'separator'
}, },
{ {
label: 'Services', label: 'Install Docker Commands',
submenu: [] enabled: true,
click: function () {
metrics.track('Installed Docker Commands');
if (!setupUtil.shouldUpdateBinaries()) {
return;
}
let copy = setupUtil.needsBinaryFix() ?
util.exec(setupUtil.copyBinariesCmd() + ' && ' + setupUtil.fixBinariesCmd()) :
util.exec(setupUtil.copyBinariesCmd());
copy.then(() => {
dialog.showMessageBox({
message: 'Docker Binaries have been copied to /usr/local/bin',
buttons: ['OK']
});
}).catch(() => {});
},
}, },
{ {
type: 'separator' type: 'separator'

View File

@ -37,21 +37,15 @@ var _steps = [{
percent: 0, percent: 0,
seconds: 5, seconds: 5,
run: Promise.coroutine(function* (progressCallback) { run: Promise.coroutine(function* (progressCallback) {
var cmd = setupUtil.copyBinariesCmd() + ' && ' + setupUtil.fixBinariesCmd();
if (!virtualBox.installed()) { if (!virtualBox.installed()) {
yield virtualBox.killall(); yield virtualBox.killall();
cmd += ' && ' + setupUtil.installVirtualBoxCmd();
} else {
if (!setupUtil.needsBinaryFix()) {
return;
}
}
try {
progressCallback(50); // TODO: detect when the installation has started so we can simulate progress progressCallback(50); // TODO: detect when the installation has started so we can simulate progress
yield util.exec(setupUtil.macSudoCmd(cmd)); try {
yield util.exec(setupUtil.macSudoCmd(setupUtil.installVirtualBoxCmd()));
} catch (err) { } catch (err) {
throw null; throw null;
} }
}
}) })
}, { }, {
name: 'init', name: 'init',
@ -159,7 +153,7 @@ var SetupStore = assign(Object.create(EventEmitter.prototype), {
var vboxNeedsInstall = !virtualBox.installed(); var vboxNeedsInstall = !virtualBox.installed();
required.download = vboxNeedsInstall && (!fs.existsSync(vboxfile) || setupUtil.checksum(vboxfile) !== virtualBox.checksum()); required.download = vboxNeedsInstall && (!fs.existsSync(vboxfile) || setupUtil.checksum(vboxfile) !== virtualBox.checksum());
required.install = vboxNeedsInstall || setupUtil.needsBinaryFix(); required.install = vboxNeedsInstall;
required.init = required.install || !(yield machine.exists()) || (yield machine.state()) !== 'Running' || !isoversion || util.compareVersions(isoversion, packagejson['docker-version']) < 0; required.init = required.install || !(yield machine.exists()) || (yield machine.state()) !== 'Running' || !isoversion || util.compareVersions(isoversion, packagejson['docker-version']) < 0;
var exists = yield machine.exists(); var exists = yield machine.exists();
@ -176,20 +170,10 @@ var SetupStore = assign(Object.create(EventEmitter.prototype), {
}); });
return Promise.resolve(_requiredSteps); return Promise.resolve(_requiredSteps);
}), }),
updateBinaries: function () {
if (setupUtil.needsBinaryFix()) {
return Promise.resolve();
}
if (setupUtil.shouldUpdateBinaries()) {
return util.exec(setupUtil.copyBinariesCmd());
}
return Promise.resolve();
},
run: Promise.coroutine(function* () { run: Promise.coroutine(function* () {
metrics.track('Started Setup', { metrics.track('Started Setup', {
virtualbox: virtualBox.installed() ? yield virtualBox.version() : 'Not Installed' virtualbox: virtualBox.installed() ? yield virtualBox.version() : 'Not Installed'
}); });
yield this.updateBinaries();
var steps = yield this.requiredSteps(); var steps = yield this.requiredSteps();
for (let step of steps) { for (let step of steps) {
_currentStep = step; _currentStep = step;

View File

@ -72,7 +72,7 @@ var DockerMachine = {
return util.exec([this.command(), 'rm', '-f', NAME]); return util.exec([this.command(), 'rm', '-f', NAME]);
}, },
ip: function () { ip: function () {
return util.exec([this.command(), '-D', 'ip', NAME]).then(stdout => { return util.exec([this.command(), 'ip', NAME]).then(stdout => {
return Promise.resolve(stdout.trim().replace('\n', '')); return Promise.resolve(stdout.trim().replace('\n', ''));
}); });
}, },
@ -156,7 +156,7 @@ var DockerMachine = {
}); });
} else { } else {
this.info().then(machine => { this.info().then(machine => {
var cmd = [resources.terminal(), `DOCKER_HOST=${machine.url} DOCKER_CERT_PATH=${path.join(util.home(), '.docker/machine/machines/' + machine.name)} DOCKER_TLS_VERIFY=1 $SHELL`]; var cmd = [resources.terminal(), `PATH=${resources.resourceDir()}:$PATH DOCKER_HOST=${machine.url} DOCKER_CERT_PATH=${path.join(util.home(), '.docker/machine/machines/' + machine.name)} DOCKER_TLS_VERIFY=1 $SHELL`];
util.exec(cmd).then(() => {}); util.exec(cmd).then(() => {});
}); });
} }

View File

@ -17,7 +17,7 @@ export default {
setup (ip, name) { setup (ip, name) {
if (!ip || !name) { if (!ip || !name) {
throw new Error('Falsy ip or machine name passed to init'); throw new Error('Falsy ip or name passed to docker client setup');
} }
let certDir = path.join(util.home(), '.docker/machine/machines/', name); let certDir = path.join(util.home(), '.docker/machine/machines/', name);
@ -25,6 +25,8 @@ export default {
throw new Error('Certificate directory does not exist'); throw new Error('Certificate directory does not exist');
} }
console.log(ip);
this.host = ip; this.host = ip;
this.client = new dockerode({ this.client = new dockerode({
protocol: 'https', protocol: 'https',

View File

@ -12,9 +12,9 @@ module.exports = {
return path.join(this.resourceDir(), 'terminal'); return path.join(this.resourceDir(), 'terminal');
}, },
docker: function () { docker: function () {
return path.join(this.resourceDir(), 'docker-' + util.packagejson()['docker-version'] + util.binsEnding()); return path.join(this.resourceDir(), 'docker' + util.binsEnding());
}, },
dockerMachine: function () { dockerMachine: function () {
return path.join(this.resourceDir(), 'docker-machine-' + util.packagejson()['docker-machine-version'] + util.binsEnding()); return path.join(this.resourceDir(), 'docker-machine' + util.binsEnding());
} }
}; };

View File

@ -12,16 +12,19 @@ var virtualBox = require ('./VirtualBoxUtil');
var SetupUtil = { var SetupUtil = {
needsBinaryFix() { needsBinaryFix() {
return this.pathDoesNotExistOrDenied(util.binsPath()) || return this.pathDoesNotExistOrDenied(util.binsPath()) ||
this.pathDoesNotExistOrDenied(util.dockerBinPath()) || (fs.existsSync(util.dockerBinPath()) && this.pathDenied(util.dockerBinPath())) ||
this.pathDoesNotExistOrDenied(util.dockerMachineBinPath()); (fs.existsSync(util.dockerMachineBinPath()) && this.pathDenied(util.dockerMachineBinPath()));
}, },
pathDoesNotExistOrDenied: function (path) { pathDoesNotExistOrDenied: function (path) {
if(util.isWindows()) { if(util.isWindows()) {
return (!fs.existsSync(path)); return (!fs.existsSync(path));
} else { } else {
return (!fs.existsSync(path) || fs.statSync(path).gid !== 80 || fs.statSync(path).uid !== process.getuid()); return (!fs.existsSync(path) || this.pathDenied(path));
} }
}, },
pathDenied: function (path) {
return fs.statSync(path).gid !== 80 || fs.statSync(path).uid !== process.getuid();
},
shouldUpdateBinaries: function () { shouldUpdateBinaries: function () {
return !fs.existsSync(util.dockerBinPath()) || return !fs.existsSync(util.dockerBinPath()) ||
!fs.existsSync(util.dockerMachineBinPath()) || !fs.existsSync(util.dockerMachineBinPath()) ||

View File

@ -1,29 +1,30 @@
#!/bin/bash #!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
BASE=$DIR/.. BASE=$DIR/..
DOCKER_MACHINE_CLI_VERSION=$(node -pe "JSON.parse(process.argv[1])['docker-machine-version']" "$(cat $BASE/package.json)")
DOCKER_MACHINE_CLI_FILE=docker-machine-$DOCKER_MACHINE_CLI_VERSION
DOCKER_VERSION=$(node -pe "JSON.parse(process.argv[1])['docker-version']" "$(cat $BASE/package.json)") DOCKER_VERSION=$(node -pe "JSON.parse(process.argv[1])['docker-version']" "$(cat $BASE/package.json)")
DOCKER_CLI_FILE=docker-$DOCKER_VERSION DOCKER_MACHINE_VERSION=$(node -pe "JSON.parse(process.argv[1])['docker-machine-version']" "$(cat $BASE/package.json)")
CURRENT_DOCKER_VERSION=$($BASE/resources/docker -v | cut -d ',' -f1 | awk '{print $3}' | cut -d '-' -f1)
CURRENT_DOCKER_MACHINE_VERSION=$($BASE/resources/docker-machine -v | cut -d ',' -f1 | awk '{print $3}' | cut -d '-' -f1)
BOOT2DOCKER_FILE=boot2docker-$DOCKER_VERSION.iso BOOT2DOCKER_FILE=boot2docker-$DOCKER_VERSION.iso
pushd $BASE/resources > /dev/null pushd $BASE/resources > /dev/null
if [ ! -f $DOCKER_CLI_FILE ]; then if [ "$DOCKER_VERSION" != "$CURRENT_DOCKER_VERSION" ]; then
echo "-----> Downloading Docker CLI..." echo "-----> Downloading Docker CLI..."
rm -rf docker
rm -rf docker-* rm -rf docker-*
curl -L -o docker-$DOCKER_VERSION.tgz https://get.docker.com/builds/Darwin/x86_64/docker-$DOCKER_VERSION.tgz curl -L -o docker-$DOCKER_VERSION.tgz https://get.docker.com/builds/Darwin/x86_64/docker-$DOCKER_VERSION.tgz
tar xvzf docker-$DOCKER_VERSION.tgz --strip=3 tar xvzf docker-$DOCKER_VERSION.tgz --strip=3
rm docker-$DOCKER_VERSION.tgz rm docker-$DOCKER_VERSION.tgz
mv docker docker-$DOCKER_VERSION chmod +x docker
chmod +x $DOCKER_VERSION
fi fi
if [ ! -f $DOCKER_MACHINE_CLI_FILE ]; then if [ "$DOCKER_MACHINE_VERSION" != "$CURRENT_DOCKER_MACHINE_VERSION" ]; then
echo "-----> Downloading Docker Machine CLI..." echo "-----> Downloading Docker Machine CLI..."
rm -rf docker-machine* rm -rf docker-machine
curl -L -o $DOCKER_MACHINE_CLI_FILE https://github.com/docker/machine/releases/download/v$DOCKER_MACHINE_CLI_VERSION/docker-machine_darwin-amd64 rm -rf docker-machine-*
chmod +x $DOCKER_MACHINE_CLI_FILE curl -L -o docker-machine https://github.com/docker/machine/releases/download/v$DOCKER_MACHINE_VERSION-rc1/docker-machine_darwin-amd64
chmod +x docker-machine
fi fi
if [ ! -f $BOOT2DOCKER_FILE ]; then if [ ! -f $BOOT2DOCKER_FILE ]; then

View File

@ -8,21 +8,19 @@ $packageJsonContent = $serializer.DeserializeObject($packageJson)
$webclient = New-Object System.Net.WebClient $webclient = New-Object System.Net.WebClient
$DOCKER_MACHINE_CLI_VERSION = $packageJsonContent['docker-machine-version'] $DOCKER_MACHINE_CLI_VERSION = $packageJsonContent['docker-machine-version']
$DOCKER_MACHINE_CLI_FILE = 'docker-machine-' + $DOCKER_MACHINE_CLI_VERSION + '.exe'
$DOCKER_CLI_VERSION = $packageJsonContent['docker-version'] $DOCKER_CLI_VERSION = $packageJsonContent['docker-version']
$DOCKER_CLI_FILE = 'docker-' + $DOCKER_CLI_VERSION + '.exe'
if(-Not (test-path ($BasePath + '\resources\' + $DOCKER_CLI_FILE))) { if(-Not (test-path ($BasePath + '\resources\docker'))) {
echo "-----> Downloading Docker CLI..." echo "-----> Downloading Docker CLI..."
$source = "https://master.dockerproject.com/windows/amd64/docker.exe" $source = "https://master.dockerproject.com/windows/amd64/docker.exe"
$destination = $BasePath + "\resources\" + $DOCKER_CLI_FILE $destination = $BasePath + "\resources\docker"
$webclient.DownloadFile($source, $destination) $webclient.DownloadFile($source, $destination)
} }
if(-Not (test-path ($BasePath + '\resources\' + $DOCKER_MACHINE_CLI_FILE))) { if(-Not (test-path ($BasePath + '\resources\docker-machine'))) {
echo "-----> Downloading Docker Machine CLI..." echo "-----> Downloading Docker Machine CLI..."
$source = "https://github.com/docker/machine/releases/download/v0.1.0/docker-machine_windows-amd64.exe" $source = "https://github.com/docker/machine/releases/download/v" + $DOCKER_MACHINE_VERSION+ "/docker-machine_windows-amd64.exe"
$destination = $BasePath + "\resources\" + $DOCKER_MACHINE_CLI_FILE $destination = $BasePath + "\resources\docker-machine"
$webclient.DownloadFile($source, $destination) $webclient.DownloadFile($source, $destination)
} }