From 1db5a00eaecd5728bb0eb443c504e9f164a1eafb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Salvador=20P=C3=A9rez=20Garc=C3=ADa?= Date: Fri, 8 Jun 2018 11:51:44 +0200 Subject: [PATCH] Prepare capistrano/db migrations to support more setups (#2) The following parameters have been added to deploy-secrets.yml: * **use_rvm**: yes/no * **ruby_version**: Ruby version for rvm. Defaults to 2.3.2 * **repository**: Git repository. Defaults to the oficial repository * **branch**: Branch to deploy. Defaults to master * **rails_env**: Defaults to the stage. Fixed migrations that required admin rights. Now first check if the postgress extensions are available. If so finish without doing nothin. Added support for passenger. --- Capfile | 1 - config/deploy-secrets.yml.example | 5 ++++ config/deploy.rb | 30 ++++++++++++++----- config/deploy/preproduction.rb | 1 - config/deploy/production.rb | 1 - config/deploy/staging.rb | 8 ++--- .../20151028213830_add_unaccent_extension.rb | 8 ++++- .../20151028221647_add_pg_trgm_extension.rb | 8 ++++- docker-compose.yml | 3 ++ lib/capistrano/tasks/restart.cap | 17 ++++++++--- 10 files changed, 61 insertions(+), 21 deletions(-) diff --git a/Capfile b/Capfile index ea11eb9b6..2e367e175 100644 --- a/Capfile +++ b/Capfile @@ -10,7 +10,6 @@ require 'capistrano/rails/migrations' #require 'capistrano/passenger' require 'capistrano/delayed_job' require 'whenever/capistrano' -require 'rvm1/capistrano3' #SCM: Git require "capistrano/scm/git" diff --git a/config/deploy-secrets.yml.example b/config/deploy-secrets.yml.example index 175026cb1..9755ee4a5 100644 --- a/config/deploy-secrets.yml.example +++ b/config/deploy-secrets.yml.example @@ -6,6 +6,11 @@ staging: user: "xxxxx" server_name: "staging.consul.es" full_app_name: "consul" +# use_rvm: Yes +# ruby_version: 2.3.7 +# repository: https://github.com/consul/consul.git +# branch: master +# rails_env: staging preproduction: deploy_to: "/var/www/consul" diff --git a/config/deploy.rb b/config/deploy.rb index a268bb326..3e8cce298 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -1,19 +1,23 @@ # config valid only for current version of Capistrano lock '~> 3.10.1' -def deploysecret(key) +def deploysecret(key, default = 'undefined') @deploy_secrets_yml ||= YAML.load_file('config/deploy-secrets.yml')[fetch(:stage).to_s] - @deploy_secrets_yml.fetch(key.to_s, 'undefined') + @deploy_secrets_yml.fetch(key.to_s, default) end set :rails_env, fetch(:stage) -set :rvm1_ruby_version, '2.3.2' + +if deploysecret(:use_rvm, true) + require 'rvm1/capistrano3' + set :rvm1_ruby_version, deploysecret(:ruby_version, '2.3.2') +end set :application, 'consul' set :full_app_name, deploysecret(:full_app_name) set :server_name, deploysecret(:server_name) -set :repo_url, 'https://github.com/consul/consul.git' +set :repo_url, deploysecret(:repository, 'https://github.com/consul/consul.git') set :revision, `git rev-parse --short #{fetch(:branch)}`.strip @@ -40,10 +44,22 @@ set(:config_files, %w( set :whenever_roles, -> { :app } +set :user, deploysecret(:user) +set :ssh_options, -> { + { + user: deploysecret(:user), + forward_agent: true, + compression: 'none', + port: deploysecret(:ssh_port) + } +} + namespace :deploy do - before :starting, 'rvm1:install:rvm' # install/update RVM - before :starting, 'rvm1:install:ruby' # install Ruby and create gemset - before :starting, 'install_bundler_gem' # install bundler gem + if deploysecret(:use_rvm, true) + before :starting, 'rvm1:install:rvm' # install/update RVM + before :starting, 'rvm1:install:ruby' # install Ruby and create gemset + before :starting, 'install_bundler_gem' # install bundler gem + end after :publishing, 'deploy:restart' after :published, 'delayed_job:restart' diff --git a/config/deploy/preproduction.rb b/config/deploy/preproduction.rb index 74c96871e..fec5d3306 100644 --- a/config/deploy/preproduction.rb +++ b/config/deploy/preproduction.rb @@ -2,7 +2,6 @@ set :deploy_to, deploysecret(:deploy_to) set :server_name, deploysecret(:server_name) set :db_server, deploysecret(:db_server) set :branch, ENV['branch'] || :master -set :ssh_options, port: deploysecret(:ssh_port) set :stage, :preproduction set :rails_env, :preproduction diff --git a/config/deploy/production.rb b/config/deploy/production.rb index 90eb501c2..17d14e44d 100644 --- a/config/deploy/production.rb +++ b/config/deploy/production.rb @@ -2,7 +2,6 @@ set :deploy_to, deploysecret(:deploy_to) set :server_name, deploysecret(:server_name) set :db_server, deploysecret(:db_server) set :branch, :stable -set :ssh_options, port: deploysecret(:ssh_port) set :stage, :production set :rails_env, :production diff --git a/config/deploy/staging.rb b/config/deploy/staging.rb index c97bb9a7f..f416e7c9a 100644 --- a/config/deploy/staging.rb +++ b/config/deploy/staging.rb @@ -1,11 +1,9 @@ -set :deploy_to, deploysecret(:deploy_to) +set :deploy_to, -> { deploysecret(:deploy_to) } set :server_name, deploysecret(:server_name) set :db_server, deploysecret(:db_server) -set :branch, ENV['branch'] || :master -set :ssh_options, port: deploysecret(:ssh_port) +set :branch, deploysecret(:branch, ENV['branch']) || :master set :stage, :staging -set :rails_env, :staging +set :rails_env, deploysecret(:rails_env, 'staging').to_sym server deploysecret(:server), user: deploysecret(:user), roles: %w(web app db importer cron) - diff --git a/db/migrate/20151028213830_add_unaccent_extension.rb b/db/migrate/20151028213830_add_unaccent_extension.rb index 60fbc1310..7e7c03ddc 100644 --- a/db/migrate/20151028213830_add_unaccent_extension.rb +++ b/db/migrate/20151028213830_add_unaccent_extension.rb @@ -1,5 +1,11 @@ class AddUnaccentExtension < ActiveRecord::Migration def change - execute "create extension if not exists unaccent" + return if extension_enabled?('unaccent') + + begin + enable_extension 'unaccent' + rescue StandardError => e + raise "Could not create extension unaccent. Please contact with your system administrator: #{e}" + end end end diff --git a/db/migrate/20151028221647_add_pg_trgm_extension.rb b/db/migrate/20151028221647_add_pg_trgm_extension.rb index 97443c2c2..9d5c851bf 100644 --- a/db/migrate/20151028221647_add_pg_trgm_extension.rb +++ b/db/migrate/20151028221647_add_pg_trgm_extension.rb @@ -1,5 +1,11 @@ class AddPgTrgmExtension < ActiveRecord::Migration def change - execute "create extension if not exists pg_trgm" + return if extension_enabled?('pg_trgm') + + begin + enable_extension 'pg_trgm' + rescue StandardError => e + raise "Could not create extension pg_trgm. Please contact with your system administrator: #{e}" + end end end diff --git a/docker-compose.yml b/docker-compose.yml index 5c03e071b..fbb901fe8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -35,6 +35,9 @@ services: volumes: - .:/var/www/consul:delegated - bundle:/usr/local/bundle:delegated + - "$SSH_AUTH_SOCK:/tmp/agent.sock" + environment: + - SSH_AUTH_SOCK=/tmp/agent.sock volumes: docker-example-postgres: {} bundle: {} diff --git a/lib/capistrano/tasks/restart.cap b/lib/capistrano/tasks/restart.cap index 54c90819a..dd08de9a4 100644 --- a/lib/capistrano/tasks/restart.cap +++ b/lib/capistrano/tasks/restart.cap @@ -1,9 +1,18 @@ namespace :deploy do - desc 'Commands for unicorn application' - %w(start stop force-stop restart upgrade reopen-logs).each do |command| - task command.to_sym do + desc 'Commands for passenger/unicorn application' + if File.exist?("/etc/init.d/unicorn_#{fetch(:full_app_name)}") + %w(start stop force-stop restart upgrade reopen-logs).each do |command| + task command.to_sym do + on roles(:app), in: :sequence, wait: 5 do + execute "/etc/init.d/unicorn_#{fetch(:full_app_name)} #{command}" + end + end + end + else + task :restart do on roles(:app), in: :sequence, wait: 5 do - execute "/etc/init.d/unicorn_#{fetch(:full_app_name)} #{command}" + # Your restart mechanism here, for example: + execute :touch, release_path.join('tmp/restart.txt') end end end