module Install::Capistrano

Public Class Methods

included(thor) click to toggle source
# File lib/myrails/modules/capistrano.rb, line 3
    def self.included(thor)
      thor.class_eval do
        
        desc 'add_capistrano_gems', 'Add campistrano to Gemfile and install'
        def add_capistrano_gems
          insert_into_file 'Gemfile', after: "group :development do\n" do <<-CODE
  gem 'capistrano', '~> 3.6', group: :development
  gem 'capistrano-rails', '~> 1.3', group: :development
  gem 'capistrano-rvm', group: :development
CODE
          end

          run 'bundle install'
        end
        
        desc 'configure_capfile', 'Add required libraries to capistrano capfile'
        def configure_capfile
          gsub_file 'Capfile', '# require "capistrano/rvm"', 'require "capistrano/rvm"'

          insert_into_file 'Capfile', after: "require \"capistrano/rvm\"\n" do <<-CODE
  require "capistrano/rails"
  CODE
          end
        end

        desc 'configure_deploy', 'Add default options to capistrano deploy file'
        def configure_deploy
          gsub_file 'config/deploy.rb', '# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp', 'ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp'
          gsub_file 'config/deploy.rb', '# set :deploy_to, "/var/www/my_app_name"', 'set :deploy_to, "/var/www/#{fetch(:application)}"'
          gsub_file 'config/deploy.rb', '# append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"', 'append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"'

          insert_into_file 'config/deploy.rb', before: '# Default branch is :master' do <<-CODE
set :deploy_via, :remote_cache
set :ssh_options, {forward_agent: true}
  CODE
          end
        end

        desc 'copy_templates', 'Add capistrano templates used to manage the remote server'
        def copy_templates
          Dir[File.join("#{__dir__}", "..", "templates","capistrano","**","*")].each do |file|
            copy_file file, "#{file.gsub(__dir__+'/../templates/capistrano/', '')}" unless File.directory? file
          end
        end

        desc 'configure_env_files', 'Configure capistrano environemnt specific information'
        def configure_env_files
          insert_into_file 'config/deploy/production.rb', before: "# role-based syntax" do <<-CODE
set :fqdn,'domain.com'
  CODE
          end

          insert_into_file 'config/deploy/staging.rb', before: "# role-based syntax" do <<-CODE
set :fqdn,'domain.com'
  CODE
          end
        end

        desc 'add_tasks', 'Add custom deploy tasks to capistrano deploy file'
        def add_tasks
          insert_into_file 'config/deploy.rb', after: "# set :ssh_options, verify_host_key: :secure\n" do <<-CODE
  namespace :deploy do
    # after :restart, :clear_cache do
    #   on roles(:app), in: :groups, limit: 3, wait: 10 do
    #     # Here we can do anything such as:
    #     # within release_path do
    #     #   execute :rake, 'cache:clear'
    #     # end
    #   end
    # end
    before :finishing, :restart do
      on roles(:app) do
        invoke 'unicorn:restart'
        invoke 'nginx:restart'
      end
    end

    task :upload_app_yml do
      on roles(:app) do
        info 'Uploading application.yml'
        upload!("\#{Dir.pwd}/config/application.yml", "\#{fetch(:release_path)}/config")
      end
    end

    before :starting, 'maintenance:on'
    before :starting, 'monit:stop'
    before :compile_assets, :upload_app_yml
    before :published, 'nginx:create_nginx_config'
    before :published, 'unicorn:create_unicorn_config'
    before :published,'unicorn:create_unicorn_init'
    after :restart, 'monit:create_monit_conf'
    after :finished, 'monit:start'
    after :finished, 'maintenance:off'
  end
  CODE
            end
        end

        desc 'setup_capistrano', 'Run all capistrano setup actions in order'
        def setup_capistrano
          add_capistrano_gems
          run 'bundle exec cap install'
          configure_capfile
          run 'mkdir -p config/deploy/templates/maintenance'
          copy_templates
          add_tasks
          configure_env_files
        end

      end
    end

Public Instance Methods

add_capistrano_gems() click to toggle source
# File lib/myrails/modules/capistrano.rb, line 7
        def add_capistrano_gems
          insert_into_file 'Gemfile', after: "group :development do\n" do <<-CODE
  gem 'capistrano', '~> 3.6', group: :development
  gem 'capistrano-rails', '~> 1.3', group: :development
  gem 'capistrano-rvm', group: :development
CODE
          end

          run 'bundle install'
        end
add_tasks() click to toggle source
# File lib/myrails/modules/capistrano.rb, line 62
        def add_tasks
          insert_into_file 'config/deploy.rb', after: "# set :ssh_options, verify_host_key: :secure\n" do <<-CODE
  namespace :deploy do
    # after :restart, :clear_cache do
    #   on roles(:app), in: :groups, limit: 3, wait: 10 do
    #     # Here we can do anything such as:
    #     # within release_path do
    #     #   execute :rake, 'cache:clear'
    #     # end
    #   end
    # end
    before :finishing, :restart do
      on roles(:app) do
        invoke 'unicorn:restart'
        invoke 'nginx:restart'
      end
    end

    task :upload_app_yml do
      on roles(:app) do
        info 'Uploading application.yml'
        upload!("\#{Dir.pwd}/config/application.yml", "\#{fetch(:release_path)}/config")
      end
    end

    before :starting, 'maintenance:on'
    before :starting, 'monit:stop'
    before :compile_assets, :upload_app_yml
    before :published, 'nginx:create_nginx_config'
    before :published, 'unicorn:create_unicorn_config'
    before :published,'unicorn:create_unicorn_init'
    after :restart, 'monit:create_monit_conf'
    after :finished, 'monit:start'
    after :finished, 'maintenance:off'
  end
  CODE
            end
        end
configure_capfile() click to toggle source
# File lib/myrails/modules/capistrano.rb, line 19
        def configure_capfile
          gsub_file 'Capfile', '# require "capistrano/rvm"', 'require "capistrano/rvm"'

          insert_into_file 'Capfile', after: "require \"capistrano/rvm\"\n" do <<-CODE
  require "capistrano/rails"
  CODE
          end
        end
configure_deploy() click to toggle source
# File lib/myrails/modules/capistrano.rb, line 29
        def configure_deploy
          gsub_file 'config/deploy.rb', '# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp', 'ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp'
          gsub_file 'config/deploy.rb', '# set :deploy_to, "/var/www/my_app_name"', 'set :deploy_to, "/var/www/#{fetch(:application)}"'
          gsub_file 'config/deploy.rb', '# append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"', 'append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"'

          insert_into_file 'config/deploy.rb', before: '# Default branch is :master' do <<-CODE
set :deploy_via, :remote_cache
set :ssh_options, {forward_agent: true}
  CODE
          end
        end
configure_env_files() click to toggle source
# File lib/myrails/modules/capistrano.rb, line 49
        def configure_env_files
          insert_into_file 'config/deploy/production.rb', before: "# role-based syntax" do <<-CODE
set :fqdn,'domain.com'
  CODE
          end

          insert_into_file 'config/deploy/staging.rb', before: "# role-based syntax" do <<-CODE
set :fqdn,'domain.com'
  CODE
          end
        end
copy_templates() click to toggle source
# File lib/myrails/modules/capistrano.rb, line 42
def copy_templates
  Dir[File.join("#{__dir__}", "..", "templates","capistrano","**","*")].each do |file|
    copy_file file, "#{file.gsub(__dir__+'/../templates/capistrano/', '')}" unless File.directory? file
  end
end
setup_capistrano() click to toggle source
# File lib/myrails/modules/capistrano.rb, line 102
def setup_capistrano
  add_capistrano_gems
  run 'bundle exec cap install'
  configure_capfile
  run 'mkdir -p config/deploy/templates/maintenance'
  copy_templates
  add_tasks
  configure_env_files
end