Skip to content

Instantly share code, notes, and snippets.

@Lepozepo
Created January 3, 2019 18:55
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Lepozepo/fb4e3a0d2652595acb64579dcbfe27d9 to your computer and use it in GitHub Desktop.
Save Lepozepo/fb4e3a0d2652595acb64579dcbfe27d9 to your computer and use it in GitHub Desktop.
Not so automatic meteor now deployment
const OS = require('os');
const del = require('del');
const { spawn, execSync, spawnSync } = require('child_process');
const tar = require('tar');
const fs = require('fs');
const splitFile = require('split-file');
const nowConfig = require('./now.json');
const buildDirectory = `${OS.homedir()}/.meteor-now/build-plus`;
function spawnProcess(cmd, args = []) {
return new Promise((resolve, reject) => {
const child = spawn(cmd, args, {
shell: true,
});
child.on('error', reject);
child.on('exit', (code, signal) => {
if (code !== 0) {
reject({ code, signal });
} else {
resolve();
}
});
if (child.stdout) {
child.stdout.on('data', (data) => {
console.log(data.toString());
resolve(data.toString());
});
}
});
};
function bundleDirectory() {
const pathDelimiter = '/';
const pathParts = process.cwd().split(pathDelimiter);
return `${buildDirectory}/${pathParts[pathParts.length - 1]}.tar.gz`;
}
async function deploy() {
try {
console.log('clear build');
await del(buildDirectory, { force: true });
console.log('build cleared');
console.log('create build');
await spawnProcess('meteor', [
'build',
buildDirectory,
'--server-only',
'--architecture=os.linux.x86_64',
]);
console.log('build created');
console.log('copy');
execSync(`ditto ./.scripts/Dockerfile ${buildDirectory}/Dockerfile`);
execSync(`ditto ./.scripts/now.json ${buildDirectory}/now.json`);
console.log('copied');
console.log('prepare');
await splitFile.splitFileBySize(
bundleDirectory(),
999999,
);
await del(bundleDirectory(), { force: true });
console.log('prepared');
console.log('deploy');
const deploymentUrl = await spawnProcess('now', [
buildDirectory,
'-A', './now.json',
]);
console.log(`deployed ${deploymentUrl}`);
console.log(deploymentUrl);
console.log('clean up');
await spawnProcess(`now alias ${deploymentUrl} <PUT YOUR URL HERE>`);
await spawnProcess(`now rm ${nowConfig.name} --safe --yes`);
console.log('clean up complete');
} catch (err) {
throw err;
}
};
deploy();
FROM node:8.9.4
LABEL name="hermes"
COPY . /usr/src/app/
WORKDIR /usr/src/app
RUN cat *sf-part* > bundle.tar.gz
RUN tar -xzf bundle.tar.gz
WORKDIR bundle/programs/server
RUN npm install
WORKDIR ../../
EXPOSE 3000
CMD ["node", "main.js"]
{
"version": 1,
"name": "appname",
"alias": "alias",
"type": "docker",
"env": {
"NODE_ENV": "production",
"PORT": "3000",
"ROOT_URL": "https://localhost:3000",
"MONGO_URL": "mongodb://..",
"MONGO_OPLOG_URL": "mongodb://...",
"METEOR_SETTINGS": "..."
},
"scale": {
"sfo1": {
"min": 1,
"max": 1
}
}
}
{
"scripts": {
"deploy": "node ./.scripts/deploy.js"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment