start.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. const colors = require('colors');
  2. const docker = require('docker-compose');
  3. const hostile = require('hostile');
  4. const isRoot = import('is-root');
  5. const path = require('path');
  6. console.log(isRoot);
  7. const ProjectEnvironment = require('../classes/ProjectEnvironment');
  8. const log = require('../inc/log');
  9. const installHosts = (hosts) => {
  10. if (!isRoot()) {
  11. log.warn('Unable to set hosts because you need root privileges');
  12. } else {
  13. for (var ip in hosts) {
  14. const hostsString = hosts[ip].join(' ');
  15. log.log('Installing hosts for %s: %s', ip, hostsString);
  16. hostile.set(ip, hostsString);
  17. }
  18. }
  19. };
  20. const runServiceStart = (service, projectEnv) => {
  21. const env = projectEnv.getEnv();
  22. const scripts = [
  23. 'start.before',
  24. `start.before.${env}`,
  25. 'start',
  26. `start.${env}`,
  27. 'start.after',
  28. `start.after.${env}`,
  29. ];
  30. let chain = Promise.resolve();
  31. scripts.forEach(script => {
  32. chain = chain.then(() => {
  33. return new Promise(resolve => {
  34. try {
  35. const start = require(path.join(projectEnv.getCwd(), service, script));
  36. log.log(`\nExecuting %s script for %s...`, colors.bold(script), colors.bold(service));
  37. Promise
  38. .all([start({
  39. exec: (command, options) => {
  40. const opts = { ...projectEnv.getDockerOptions(), ...options };
  41. return docker.exec(service, command, opts);
  42. },
  43. log: (message) => {
  44. log.log('%s - %s', colors.bold(service), message);
  45. },
  46. env: projectEnv.getEnv()
  47. })])
  48. .catch(() => {
  49. })
  50. .then(() => {
  51. resolve();
  52. });
  53. } catch (ex) {
  54. resolve();
  55. }
  56. });
  57. });
  58. });
  59. return chain.then(() => {
  60. });
  61. };
  62. const runServices = async (projectEnv) => {
  63. await docker.buildAll(projectEnv.getDockerOptions());
  64. await docker.upAll(projectEnv.getDockerOptions());
  65. const services = await projectEnv.getServices();
  66. let promises = [];
  67. services.forEach(service => {
  68. promises.push(runServiceStart(service, projectEnv));
  69. });
  70. await Promise.all(promises);
  71. };
  72. module.exports = (env) => {
  73. try {
  74. const projectEnv = new ProjectEnvironment(process.cwd(), env);
  75. log.log("Starting project (%s environment)...", colors.bold(env));
  76. // Install hosts
  77. installHosts(projectEnv.getHosts());
  78. // Docker up services
  79. runServices(projectEnv);
  80. } catch (ex) {
  81. console.log(ex);
  82. log.error(JSON.stringify(ex));
  83. }
  84. };