class Dockrails::Generate

Public Class Methods

new(app_path:, config: {}) click to toggle source
# File lib/dockrails/generate.rb, line 4
def initialize(app_path:, config: {})
  @app_path = app_path
  @config = config
end

Public Instance Methods

binary_present?(binary:) click to toggle source
# File lib/dockrails/generate.rb, line 19
def binary_present?(binary:)
  system("which #{binary} > /dev/null")
end
check_system_requirements() click to toggle source
# File lib/dockrails/generate.rb, line 9
def check_system_requirements
  requirement = Hash.new

  ["unison", "docker", "docker-sync", "docker-compose"].each do |binary|
    requirement[binary] = binary_present?(binary: binary)
  end

  return requirement
end
configure() click to toggle source
# File lib/dockrails/generate.rb, line 23
def configure
  @config[:ruby] = choose("\n<%= color 'Choose a ruby version?', BOLD%>", "latest", "2.4", "2.3", "2.2")
  @config[:db] = choose("\n<%= color 'Choose a DB Engine', BOLD%>", :pgsql, :mysql)
  @config[:db_name] = ask "\n<%= color 'Choose a database name', BOLD%>"
  @config[:db_user] = ask "\n<%= color 'Choose a database username', BOLD%>"
  @config[:db_password] = ask "\n<%= color 'Choose a database password', BOLD%>"
  @config[:redis] = agree("\n<%= color 'Do you need a Redis DB? (yes|no)', BOLD%>")
  @config[:sidekiq] = agree("\n<%= color 'Do you need a SideKiq Container? (yes|no)', BOLD%>") if @config[:redis]

  say "\nSummary:
- Ruby version: #{@config[:ruby]}
- DB Engine: #{@config[:db]}
- DB Name: #{@config[:db_name]}
- DB Username: #{@config[:db_user]}
- DB Password: #{@config[:db_password]}
- Redis? #{@config[:redis]}
- Job Container? #{@config[:sidekiq] ||= false}"

  user_agree = agree("\n<%= color 'Is this correct? (yes|no)', BOLD%>")

  unless user_agree
    configure
  end

  return(@config)
end
create_docker_compose() click to toggle source
# File lib/dockrails/generate.rb, line 98
def create_docker_compose
  File.open("docker-compose.yml", 'w') do |f|
    f.write "version: '2'\n"
    f.write "services:\n"
    f.write " db:\n"

    case @config[:db] when :mysql
      f.write "   image: mysql\n"
      f.write "   volumes:\n"
      f.write "     - ./data/sql:/var/lib/mysql\n"
      f.write "   ports:\n"
      f.write "     - \"3306:3306\"\n"
      f.write "   environment:\n"
      f.write "     MYSQL_DATABASE: #{@config[:db_name]}\n"
      f.write "     MYSQL_USER: #{@config[:db_user]}\n"
      f.write "     MYSQL_PASSWORD: #{@config[:db_password]}\n"
      f.write "     MYSQL_ROOT_PASSWORD: #{@config[:db_password]}\n"
    when :pgsql
      f.write "   image: postgres\n"
      f.write "   volumes:\n"
      f.write "     - ./data/sql:/var/lib/postgresql/data\n"
      f.write "   ports:\n"
      f.write "     - \"5432:5432\"\n"
      f.write "   environment:\n"
      f.write "     POSTGRES_DB: #{@config[:db_name]}\n"
      f.write "     POSTGRES_USER: #{@config[:db_user]}\n"
      f.write "     POSTGRES_PASSWORD: #{@config[:db_password]}\n"
    end

    if @config[:redis]
      f.write "\n redis:\n"
      f.write "   image: redis\n"
      f.write "   volumes:\n"
      f.write "     - ./data/redis:/data\n"
      f.write "   ports:\n"
      f.write "     - \"6379:6379\"\n"
    end

    f.write "\n web:\n"
    f.write "   build: .\n"
    f.write "   command: sh scripts/start-dev.sh\n"
    f.write "   volumes:\n"
    f.write "     - #{@app_path}-web-sync:/app:nocopy\n"
    f.write "     - #{@app_path}-bundle-sync:/bundle:nocopy\n"
    f.write "     - ./keys:/root/.ssh/\n"
    f.write "   ports:\n"
    f.write "     - \"3000:3000\"\n"
    f.write "   environment:\n"
    f.write "     REDIS_URL: redis://redis:6379\n" if @config[:redis]
    f.write "     DB_USER: #{@config[:db_user]}\n"
    f.write "     DB_PASSWORD: #{@config[:db_password]}\n"
    f.write "   links:\n"
    f.write "     - db\n"
    f.write "     - redis\n" if @config[:redis]
    f.write "   tty: true\n"
    f.write "   stdin_open: true\n"

    if @config[:redis] && @config[:sidekiq]
      f.write "\n job:\n"
      f.write "   build: .\n"
      f.write "   command: bundle exec sidekiq -C config/sidekiq.yml\n"
      f.write "   volumes:\n"
      f.write "     - #{@app_path}-web-sync:/app:nocopy\n"
      f.write "     - #{@app_path}-bundle-sync:/bundle:nocopy\n"
      f.write "     - ./keys:/root/.ssh/\n"
      f.write "   environment:\n"
      f.write "     REDIS_URL: redis://redis:6379\n"
      f.write "   links:\n"
      f.write "     - db\n"
      f.write "     - redis\n"
    end

    f.write "\nvolumes:\n"
    f.write "  #{@app_path}-web-sync:\n"
    f.write "   external: true\n"
    f.write "  #{@app_path}-bundle-sync:\n"
    f.write "   external: true\n"
  end
end
create_docker_sync() click to toggle source
# File lib/dockrails/generate.rb, line 178
def create_docker_sync
  File.open("docker-sync.yml", 'w') do |f|
    f.write "version: '2'\n"
    f.write "syncs:\n"
    f.write " #{@app_path}-web-sync:\n"
    f.write "   src: './#{@app_path}'\n"
    f.write " #{@app_path}-bundle-sync:\n"
    f.write "   src: './bundle'\n"
  end
end
create_dockerfile() click to toggle source
# File lib/dockrails/generate.rb, line 56
  def create_dockerfile
    File.open("Dockerfile", 'w') do |f|
      f.write("FROM ruby:#{@config[:ruby]}
RUN apt-get update && apt-get install -y \
build-essential \
wget \
git-core \
libxml2 \
libxml2-dev \
libxslt1-dev \
nodejs \
imagemagick \
libmagickcore-dev \
libmagickwand-dev \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*

RUN mkdir /app
RUN mkdir -p /root/.ssh/

WORKDIR /app

RUN ssh-keyscan -H github.com >> ~/.ssh/known_hosts
ENV GEM_HOME /bundle
ENV PATH $GEM_HOME/bin:$PATH
ENV BUNDLE_PATH /bundle
ENV BUNDLE_BIN /bundle/
RUN gem install bundler -v '1.10.6' \
&& bundle config --global path \"$GEM_HOME\" \
&& bundle config --global bin \"$GEM_HOME/bin\"")
    end
  end
create_folders() click to toggle source
# File lib/dockrails/generate.rb, line 50
def create_folders
  FileUtils.rm_rf('data')
  FileUtils.mkdir_p('data/sql')
  FileUtils.mkdir_p('data/redis') if @config[:redis]
end
create_start_script() click to toggle source
# File lib/dockrails/generate.rb, line 89
  def create_start_script
    FileUtils.mkdir_p("#{@app_path}/scripts")
    File.open("#{@app_path}/scripts/start-dev.sh", "w") do |f|
      f.write("#!/bin/bash
bundle check || bundle install
rm -rf tmp/pids/* && bundle exec rails server --port 3000 --binding 0.0.0.0")
    end
  end