joyent-portal/scripts/deploy

187 lines
4.1 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env node
const execa = require('execa');
const { parse } = require('dotenv');
const main = require('apr-main');
const map = require('apr-map');
const series = require('apr-series');
const globby = require('globby');
const path = require('path');
const flatten = require('lodash.flatten');
const readPkg = require('read-pkg');
const figures = require('figures');
const COMPOSE_PROJECT_NAME = `cp-${process.env.CIRCLE_BRANCH}`;
const NAMESPACE = 'quay.io/yldio';
const ROOT = path.join(__dirname, '..');
const LOG = console.log;
2017-05-31 18:08:29 +03:00
const createTritonProfile = async () => {
2017-05-31 19:57:57 +03:00
const { SDC_ACCOUNT = '', SDC_KEY_ID = '' } = process.env;
2017-05-31 13:46:58 +03:00
LOG(
`${figures.arrowRight} create triton profile SDC_ACCOUNT=${SDC_ACCOUNT.length} SDC_KEY_ID=${SDC_KEY_ID.length}`
);
const payload = JSON.stringify({
url: 'https://eu-ams-1.api.joyent.com',
account: SDC_ACCOUNT,
keyId: SDC_KEY_ID,
name: 'eu-ams-1',
curr: true
});
const cp = execa('triton', ['profile', 'create', '--yes', '-f', '-'], {
2017-05-31 13:46:58 +03:00
input: payload
});
2017-05-31 13:46:58 +03:00
cp.stdout.pipe(process.stdout);
cp.stderr.pipe(process.stderr);
return cp;
};
const getEnv = async () => {
2017-05-31 18:08:29 +03:00
await createTritonProfile();
const tritonEnv = await execa.stdout('triton', ['env']);
const dotEnv = tritonEnv.replace(/^export /gim, '');
return Object.assign({}, process.env, parse(dotEnv));
};
2017-05-31 18:08:29 +03:00
const login = async () => {
LOG(`${figures.arrowRight} login`);
2017-05-31 18:08:29 +03:00
const {
_DOCKER_LOGIN_USERNAME,
_DOCKER_LOGIN_PASSWORD,
_DOCKER_REGISTRY
} = process.env;
2017-05-31 13:46:58 +03:00
return execa(
'docker',
[
'login',
2017-06-01 03:47:41 +03:00
'--email="."',
2017-05-31 13:46:58 +03:00
`--username="${_DOCKER_LOGIN_USERNAME}"`,
`--password="${_DOCKER_LOGIN_PASSWORD}"`,
_DOCKER_REGISTRY
],
{
stdio: 'inherit'
}
);
};
2017-05-31 18:08:29 +03:00
const build = async () => {
LOG(`${figures.arrowRight} build`);
2017-05-31 19:57:57 +03:00
const { CIRCLE_BRANCH } = process.env;
const dockerfiles = await globby(['packages/*/Dockerfile'], {
cwd: ROOT
});
LOG(`${figures.arrowRight} build.dockerfiles`);
LOG(JSON.stringify(dockerfiles, null, 2));
2017-05-31 18:08:29 +03:00
const images = await map(dockerfiles, async dockerfile => {
const folder = path.resolve(ROOT, path.dirname(dockerfile));
const { name } = await readPkg(folder);
const tags = [`${name}:${CIRCLE_BRANCH}`, `${name}:latest`];
LOG(`${figures.arrowRight} build.name ${name}`);
LOG(JSON.stringify(tags, null, 2));
await execa(
'docker',
flatten([
'build',
flatten(tags.map(name => ['-t', `${NAMESPACE}/${name}`])),
'-f',
dockerfile,
2017-06-01 14:35:55 +03:00
'--build-arg',
2017-06-01 14:53:04 +03:00
`CIRCLE_BRANCH=${CIRCLE_BRANCH}`,
'.'
]),
{
stdio: 'inherit'
}
);
2017-05-31 18:08:29 +03:00
return `${NAMESPACE}/${name}`;
});
await map(images, image => {
LOG(`${figures.arrowRight} build.push ${image}`);
2017-05-31 18:34:00 +03:00
return execa('docker', ['push', `${image}`], {
stdio: 'inherit'
});
});
};
2017-05-31 18:08:29 +03:00
const logout = () => {
LOG(`${figures.arrowRight} logout`);
2017-05-31 12:38:19 +03:00
return execa('docker', ['logout'], {
stdio: 'inherit'
});
};
2017-05-31 18:08:29 +03:00
const deploy = async () => {
const env = await getEnv();
LOG(`${figures.arrowRight} deploy`);
2017-06-01 02:32:12 +03:00
// kill containers
await execa('docker-compose', ['kill'], {
stdio: 'inherit',
env: Object.assign({}, env, {
COMPOSE_PROJECT_NAME
})
});
2017-06-01 02:32:12 +03:00
// rm containers
2017-06-01 02:56:56 +03:00
await execa('docker-compose', ['rm', '--force'], {
stdio: 'inherit',
env: Object.assign({}, env, {
COMPOSE_PROJECT_NAME
})
});
2017-06-01 02:32:12 +03:00
// pull new images
2017-06-01 02:56:56 +03:00
await execa('docker-compose', ['pull', '--parallel'], {
2017-06-01 02:32:12 +03:00
stdio: 'inherit',
env: Object.assign({}, env, {
COMPOSE_PROJECT_NAME
})
});
// up project
return execa(
'docker-compose',
[
'up',
'-d',
'--build',
'--force-recreate',
'--build-arg',
`CIRCLE_BRANCH=${process.env.CIRCLE_BRANCH}`
],
{
stdio: 'inherit',
env: Object.assign({}, env, {
COMPOSE_PROJECT_NAME
})
}
);
};
const run = async () => {
LOG(`${figures.arrowRight} .env`);
2017-05-31 18:08:29 +03:00
LOG(JSON.stringify(Object.keys(process.env), null, 2));
2017-05-31 18:08:29 +03:00
return series([login, build, logout, deploy]);
};
LOG(`${figures.arrowRight} DEPLOY`);
main(run());