capistrano-mb 0.22.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/CHANGELOG.md +114 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +173 -0
- data/Rakefile +5 -0
- data/capistrano-mb.gemspec +34 -0
- data/lib/capistrano/fiftyfive.rb +6 -0
- data/lib/capistrano/mb.rb +29 -0
- data/lib/capistrano/mb/compatibility.rb +17 -0
- data/lib/capistrano/mb/dsl.rb +187 -0
- data/lib/capistrano/mb/recipe.rb +48 -0
- data/lib/capistrano/mb/templates/crontab.erb +1 -0
- data/lib/capistrano/mb/templates/csr_config.erb +10 -0
- data/lib/capistrano/mb/templates/delayed_job_init.erb +36 -0
- data/lib/capistrano/mb/templates/logrotate.erb +9 -0
- data/lib/capistrano/mb/templates/maintenance.html.erb +26 -0
- data/lib/capistrano/mb/templates/nginx.erb +64 -0
- data/lib/capistrano/mb/templates/nginx_unicorn.erb +109 -0
- data/lib/capistrano/mb/templates/pgpass.erb +1 -0
- data/lib/capistrano/mb/templates/postgresql-backup-logrotate.erb +11 -0
- data/lib/capistrano/mb/templates/rbenv_bashrc +4 -0
- data/lib/capistrano/mb/templates/sidekiq_init.erb +100 -0
- data/lib/capistrano/mb/templates/ssl_setup +43 -0
- data/lib/capistrano/mb/templates/unicorn.rb.erb +71 -0
- data/lib/capistrano/mb/templates/unicorn_init.erb +84 -0
- data/lib/capistrano/mb/templates/version.rb.erb +3 -0
- data/lib/capistrano/mb/version.rb +5 -0
- data/lib/capistrano/tasks/aptitude.rake +101 -0
- data/lib/capistrano/tasks/crontab.rake +14 -0
- data/lib/capistrano/tasks/defaults.rake +122 -0
- data/lib/capistrano/tasks/delayed_job.rake +33 -0
- data/lib/capistrano/tasks/dotenv.rake +57 -0
- data/lib/capistrano/tasks/fiftyfive.rake +59 -0
- data/lib/capistrano/tasks/logrotate.rake +16 -0
- data/lib/capistrano/tasks/maintenance.rake +28 -0
- data/lib/capistrano/tasks/migrate.rake +29 -0
- data/lib/capistrano/tasks/nginx.rake +31 -0
- data/lib/capistrano/tasks/postgresql.rake +177 -0
- data/lib/capistrano/tasks/provision.rake +18 -0
- data/lib/capistrano/tasks/rake.rake +20 -0
- data/lib/capistrano/tasks/rbenv.rake +93 -0
- data/lib/capistrano/tasks/seed.rake +16 -0
- data/lib/capistrano/tasks/sidekiq.rake +39 -0
- data/lib/capistrano/tasks/ssl.rake +57 -0
- data/lib/capistrano/tasks/ufw.rake +32 -0
- data/lib/capistrano/tasks/unicorn.rake +42 -0
- data/lib/capistrano/tasks/user.rake +32 -0
- data/lib/capistrano/tasks/version.rake +34 -0
- metadata +165 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
# Use at least one worker per core if you're on a dedicated server,
|
2
|
+
# more will usually help for _short_ waits on databases/caches.
|
3
|
+
worker_processes <%= fetch(:mb_unicorn_workers) %>
|
4
|
+
|
5
|
+
# Help ensure your application will always spawn in the symlinked
|
6
|
+
# "current" directory that Capistrano sets up.
|
7
|
+
working_directory "<%= current_path %>"
|
8
|
+
|
9
|
+
# listen on both a Unix domain socket
|
10
|
+
# we use a shorter backlog for quicker failover when busy
|
11
|
+
listen "/tmp/unicorn.<%= application_basename %>.sock", :backlog => 64
|
12
|
+
|
13
|
+
# nuke workers after <%= fetch(:mb_unicorn_timeout) %> seconds (default is 60)
|
14
|
+
timeout <%= fetch(:mb_unicorn_timeout) %>
|
15
|
+
|
16
|
+
pid "<%= fetch(:mb_unicorn_pid) %>"
|
17
|
+
|
18
|
+
# By default, the Unicorn logger will write to stderr.
|
19
|
+
# Additionally, some applications/frameworks log to stderr or stdout,
|
20
|
+
# so prevent them from going to /dev/null when daemonized here:
|
21
|
+
stderr_path "<%= fetch(:mb_unicorn_log) %>"
|
22
|
+
stdout_path "<%= fetch(:mb_unicorn_log) %>"
|
23
|
+
|
24
|
+
preload_app true
|
25
|
+
|
26
|
+
# combine Ruby 2.0.0dev or REE with "preload_app true" for memory savings
|
27
|
+
# http://rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
|
28
|
+
if GC.respond_to?(:copy_on_write_friendly=)
|
29
|
+
GC.copy_on_write_friendly = true
|
30
|
+
end
|
31
|
+
|
32
|
+
before_exec do |server|
|
33
|
+
# Ensure unicorn picks up our newest Gemfile
|
34
|
+
ENV['BUNDLE_GEMFILE'] = "<%= current_path %>/Gemfile"
|
35
|
+
end
|
36
|
+
|
37
|
+
before_fork do |server, worker|
|
38
|
+
|
39
|
+
# the following is highly recomended for Rails + "preload_app true"
|
40
|
+
# as there's no need for the master process to hold a connection
|
41
|
+
if defined? ActiveRecord::Base
|
42
|
+
ActiveRecord::Base.connection.disconnect!
|
43
|
+
end
|
44
|
+
|
45
|
+
# This allows a new master process to incrementally
|
46
|
+
# phase out the old master process with SIGTTOU to avoid a
|
47
|
+
# thundering herd (especially in the "preload_app false" case)
|
48
|
+
# when doing a transparent upgrade. The last worker spawned
|
49
|
+
# will then kill off the old master process with a SIGQUIT.
|
50
|
+
old_pid = "#{server.config[:pid]}.oldbin"
|
51
|
+
if File.exists?(old_pid) && server.pid != old_pid
|
52
|
+
begin
|
53
|
+
sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
|
54
|
+
Process.kill(sig, File.read(old_pid).to_i)
|
55
|
+
rescue Errno::ENOENT, Errno::ESRCH
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Throttle the master from forking too quickly by sleeping. Due
|
60
|
+
# to the implementation of standard Unix signal handlers, this
|
61
|
+
# helps (but does not completely) prevent identical, repeated signals
|
62
|
+
# from being lost when the receiving process is busy.
|
63
|
+
sleep 1
|
64
|
+
end
|
65
|
+
|
66
|
+
after_fork do |server, worker|
|
67
|
+
# the following is *required* for Rails + "preload_app true"
|
68
|
+
if defined?(ActiveRecord::Base)
|
69
|
+
ActiveRecord::Base.establish_connection
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
### BEGIN INIT INFO
|
3
|
+
# Provides: unicorn
|
4
|
+
# Required-Start: $remote_fs $syslog
|
5
|
+
# Required-Stop: $remote_fs $syslog
|
6
|
+
# Default-Start: 2 3 4 5
|
7
|
+
# Default-Stop: 0 1 6
|
8
|
+
# Short-Description: Manage unicorn server
|
9
|
+
# Description: Start, stop, restart unicorn server for a specific application.
|
10
|
+
### END INIT INFO
|
11
|
+
set -e
|
12
|
+
|
13
|
+
# Feel free to change any of the following variables for your app:
|
14
|
+
TIMEOUT=${TIMEOUT-60}
|
15
|
+
APP_ROOT=<%= current_path %>
|
16
|
+
PID=<%= fetch(:mb_unicorn_pid) %>
|
17
|
+
CMD="cd <%= current_path %>; bundle exec unicorn -D -c <%= fetch(:mb_unicorn_config) %> -E <%= fetch(:rails_env) %>"
|
18
|
+
AS_USER=<%= unicorn_user %>
|
19
|
+
set -u
|
20
|
+
|
21
|
+
OLD_PIN="$PID.oldbin"
|
22
|
+
|
23
|
+
sig () {
|
24
|
+
test -s "$PID" && kill -$1 `cat $PID`
|
25
|
+
}
|
26
|
+
|
27
|
+
oldsig () {
|
28
|
+
test -s $OLD_PIN && kill -$1 `cat $OLD_PIN`
|
29
|
+
}
|
30
|
+
|
31
|
+
run () {
|
32
|
+
if [ "$(id -un)" = "$AS_USER" ]; then
|
33
|
+
eval $1
|
34
|
+
else
|
35
|
+
su -c "$1" - $AS_USER
|
36
|
+
fi
|
37
|
+
}
|
38
|
+
|
39
|
+
case "$1" in
|
40
|
+
start)
|
41
|
+
sig 0 && echo >&2 "Already running" && exit 0
|
42
|
+
run "$CMD"
|
43
|
+
;;
|
44
|
+
stop)
|
45
|
+
sig QUIT && exit 0
|
46
|
+
echo >&2 "Not running"
|
47
|
+
;;
|
48
|
+
force-stop)
|
49
|
+
sig TERM && exit 0
|
50
|
+
echo >&2 "Not running"
|
51
|
+
;;
|
52
|
+
restart|reload)
|
53
|
+
sig USR2 && echo reloaded OK && exit 0
|
54
|
+
echo >&2 "Couldn't reload, starting '$CMD' instead"
|
55
|
+
run "$CMD"
|
56
|
+
;;
|
57
|
+
upgrade)
|
58
|
+
if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
|
59
|
+
then
|
60
|
+
n=$TIMEOUT
|
61
|
+
while test -s $OLD_PIN && test $n -ge 0
|
62
|
+
do
|
63
|
+
printf '.' && sleep 1 && n=$(( $n - 1 ))
|
64
|
+
done
|
65
|
+
echo
|
66
|
+
|
67
|
+
if test $n -lt 0 && test -s $OLD_PIN
|
68
|
+
then
|
69
|
+
echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds"
|
70
|
+
exit 1
|
71
|
+
fi
|
72
|
+
exit 0
|
73
|
+
fi
|
74
|
+
echo >&2 "Couldn't upgrade, starting '$CMD' instead"
|
75
|
+
run "$CMD"
|
76
|
+
;;
|
77
|
+
reopen-logs)
|
78
|
+
sig USR1
|
79
|
+
;;
|
80
|
+
*)
|
81
|
+
echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
|
82
|
+
exit 1
|
83
|
+
;;
|
84
|
+
esac
|
@@ -0,0 +1,101 @@
|
|
1
|
+
mb_recipe :aptitude do
|
2
|
+
during :provision, %w(upgrade install)
|
3
|
+
before "provision:14_04", "mb:aptitude:install_postgres_repo"
|
4
|
+
before "provision:14_04", "mb:aptitude:change_postgres_packages"
|
5
|
+
end
|
6
|
+
|
7
|
+
namespace :mb do
|
8
|
+
namespace :aptitude do
|
9
|
+
|
10
|
+
desc "Run `aptitude update` and then run `aptitude safe-upgrade`"
|
11
|
+
task :upgrade do
|
12
|
+
privileged_on roles(:all) do |host|
|
13
|
+
_update
|
14
|
+
_safe_upgrade
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
desc "Run `aptitude install` for packages required by the roles of "\
|
20
|
+
"each server."
|
21
|
+
task :install do
|
22
|
+
privileged_on roles(:all) do |host|
|
23
|
+
packages_to_install = []
|
24
|
+
repos_to_add = []
|
25
|
+
|
26
|
+
_each_package(host) do |pkg, repo|
|
27
|
+
unless _already_installed?(pkg)
|
28
|
+
repos_to_add << repo unless repo.nil?
|
29
|
+
packages_to_install << pkg
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
repos_to_add.uniq.each { |repo| _add_repository(repo) }
|
34
|
+
_update
|
35
|
+
packages_to_install.uniq.each { |pkg| _install(pkg) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "Add the official apt repository for PostgreSQL"
|
40
|
+
task :install_postgres_repo do
|
41
|
+
privileged_on roles(:all) do |host|
|
42
|
+
_add_repository(
|
43
|
+
"deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main",
|
44
|
+
:key => "https://www.postgresql.org/media/keys/ACCC4CF8.asc")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
desc "Change 12.04 PostgreSQL package requirements to 14.04 versions"
|
49
|
+
task :change_postgres_packages do
|
50
|
+
packages = fetch(:mb_aptitude_packages, {})
|
51
|
+
packages = Hash[packages.map do |key, value|
|
52
|
+
[key.sub(/@ppa:pitti\/postgresql$/, ""), value]
|
53
|
+
end]
|
54
|
+
set(:mb_aptitude_packages, packages)
|
55
|
+
end
|
56
|
+
|
57
|
+
def _already_installed?(pkg)
|
58
|
+
test(:sudo, "dpkg", "-s", pkg, "2>/dev/null", "|", :grep, "-q 'ok installed'")
|
59
|
+
end
|
60
|
+
|
61
|
+
def _add_repository(repo, options={})
|
62
|
+
unless _already_installed?("python-software-properties")
|
63
|
+
_install("python-software-properties")
|
64
|
+
end
|
65
|
+
execute :sudo, "apt-add-repository", "-y '#{repo}'"
|
66
|
+
|
67
|
+
if (key = options.fetch(:key, nil))
|
68
|
+
execute "wget --quiet -O - #{key} | sudo apt-key add -"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def _install(pkg)
|
73
|
+
with :debian_frontend => "noninteractive" do
|
74
|
+
execute :sudo, "aptitude", "-y -q install", pkg
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def _update
|
79
|
+
with :debian_frontend => "noninteractive" do
|
80
|
+
execute :sudo, "aptitude", "-q -q -y update"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def _safe_upgrade
|
85
|
+
with :debian_frontend => "noninteractive" do
|
86
|
+
execute :sudo, "aptitude", "-q -q -y safe-upgrade"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def _each_package(host)
|
91
|
+
return to_enum(:_each_package, host) unless block_given?
|
92
|
+
hostname = host.hostname
|
93
|
+
fetch(:mb_aptitude_packages).each do |package_spec, *role_list|
|
94
|
+
next unless roles(*role_list.flatten).map(&:hostname).include?(hostname)
|
95
|
+
|
96
|
+
pkg, repo = package_spec.split("@")
|
97
|
+
yield(pkg, repo)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
mb_recipe :crontab do
|
2
|
+
during :provision, "mb:crontab"
|
3
|
+
end
|
4
|
+
|
5
|
+
namespace :mb do
|
6
|
+
desc "Install crontab using crontab.erb template"
|
7
|
+
task :crontab do
|
8
|
+
on roles(:cron) do
|
9
|
+
tmp_file = "/tmp/crontab"
|
10
|
+
template "crontab.erb", tmp_file
|
11
|
+
execute "crontab #{tmp_file} && rm #{tmp_file}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
namespace :load do
|
2
|
+
task :defaults do
|
3
|
+
|
4
|
+
set :mb_recipes, %w(
|
5
|
+
aptitude
|
6
|
+
crontab
|
7
|
+
dotenv
|
8
|
+
logrotate
|
9
|
+
migrate
|
10
|
+
nginx
|
11
|
+
postgresql
|
12
|
+
rbenv
|
13
|
+
seed
|
14
|
+
ssl
|
15
|
+
ufw
|
16
|
+
unicorn
|
17
|
+
user
|
18
|
+
version
|
19
|
+
)
|
20
|
+
|
21
|
+
set :mb_privileged_user, "root"
|
22
|
+
|
23
|
+
set :mb_aptitude_packages,
|
24
|
+
"curl" => :all,
|
25
|
+
"debian-goodies" => :all,
|
26
|
+
"git-core" => :all,
|
27
|
+
"libpq-dev@ppa:pitti/postgresql" => :all,
|
28
|
+
"nginx@ppa:nginx/stable" => :web,
|
29
|
+
"nodejs@ppa:chris-lea/node.js" => :all,
|
30
|
+
"postgresql-client@ppa:pitti/postgresql" => :all,
|
31
|
+
"postgresql@ppa:pitti/postgresql" => :db,
|
32
|
+
"ufw" => :all
|
33
|
+
|
34
|
+
set :mb_delayed_job_args, "-n 2"
|
35
|
+
set :mb_delayed_job_script, "bin/delayed_job"
|
36
|
+
|
37
|
+
set :mb_dotenv_keys, %w(rails_secret_key_base postmark_api_key)
|
38
|
+
set :mb_dotenv_filename, -> { ".env.#{fetch(:rails_env)}" }
|
39
|
+
|
40
|
+
set :mb_log_file, "log/capistrano.log"
|
41
|
+
|
42
|
+
set :mb_nginx_force_https, false
|
43
|
+
set :mb_nginx_redirect_hosts, {}
|
44
|
+
|
45
|
+
ask :mb_postgresql_password, nil, :echo => false
|
46
|
+
set :mb_postgresql_max_connections, 25
|
47
|
+
set :mb_postgresql_pool_size, 5
|
48
|
+
set :mb_postgresql_host, "localhost"
|
49
|
+
set :mb_postgresql_database,
|
50
|
+
-> { "#{application_basename}_#{fetch(:rails_env)}" }
|
51
|
+
set :mb_postgresql_user, -> { application_basename }
|
52
|
+
set :mb_postgresql_pgpass_path,
|
53
|
+
proc{ "#{shared_path}/config/pgpass" }
|
54
|
+
set :mb_postgresql_backup_path, -> {
|
55
|
+
"#{shared_path}/backups/postgresql-dump.dmp"
|
56
|
+
}
|
57
|
+
set :mb_postgresql_backup_exclude_tables, []
|
58
|
+
set :mb_postgresql_dump_options, -> {
|
59
|
+
options = fetch(:mb_postgresql_backup_exclude_tables).map do |t|
|
60
|
+
"-T #{t.shellescape}"
|
61
|
+
end
|
62
|
+
options.join(" ")
|
63
|
+
}
|
64
|
+
|
65
|
+
set :mb_rbenv_ruby_version, -> { IO.read(".ruby-version").strip }
|
66
|
+
set :mb_rbenv_vars, -> {
|
67
|
+
{
|
68
|
+
"RAILS_ENV" => fetch(:rails_env),
|
69
|
+
"PGPASSFILE" => fetch(:mb_postgresql_pgpass_path)
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
set :mb_sidekiq_concurrency, 25
|
74
|
+
set :mb_sidekiq_role, :sidekiq
|
75
|
+
|
76
|
+
ask :mb_ssl_csr_country, "US"
|
77
|
+
ask :mb_ssl_csr_state, "California"
|
78
|
+
ask :mb_ssl_csr_city, "San Francisco"
|
79
|
+
ask :mb_ssl_csr_org, "Example Company"
|
80
|
+
ask :mb_ssl_csr_name, "www.example.com"
|
81
|
+
|
82
|
+
# WARNING: misconfiguring firewall rules could lock you out of the server!
|
83
|
+
set :mb_ufw_rules,
|
84
|
+
"allow ssh" => :all,
|
85
|
+
"allow http" => :web,
|
86
|
+
"allow https" => :web
|
87
|
+
|
88
|
+
set :mb_unicorn_workers, 2
|
89
|
+
set :mb_unicorn_timeout, 30
|
90
|
+
set :mb_unicorn_config, proc{ "#{current_path}/config/unicorn.rb" }
|
91
|
+
set :mb_unicorn_log, proc{ "#{current_path}/log/unicorn.log" }
|
92
|
+
set :mb_unicorn_pid, proc{ "#{current_path}/tmp/pids/unicorn.pid" }
|
93
|
+
|
94
|
+
set :bundle_binstubs, false
|
95
|
+
set :bundle_flags, "--deployment --retry=3"
|
96
|
+
set :deploy_to, -> { "/home/deployer/apps/#{fetch(:application)}" }
|
97
|
+
set :keep_releases, 10
|
98
|
+
set :linked_dirs, -> {
|
99
|
+
["public/#{fetch(:assets_prefix, 'assets')}"] +
|
100
|
+
%w(
|
101
|
+
log
|
102
|
+
tmp/pids
|
103
|
+
tmp/cache
|
104
|
+
tmp/sockets
|
105
|
+
public/system
|
106
|
+
)
|
107
|
+
}
|
108
|
+
set :linked_files, -> {
|
109
|
+
[fetch(:mb_dotenv_filename)] +
|
110
|
+
%w(
|
111
|
+
config/database.yml
|
112
|
+
config/unicorn.rb
|
113
|
+
)
|
114
|
+
}
|
115
|
+
set :log_level, :debug
|
116
|
+
set :migration_role, :app
|
117
|
+
set :rails_env, -> { fetch(:stage) }
|
118
|
+
set :ssh_options, :compression => false, :keepalive => true
|
119
|
+
|
120
|
+
SSHKit.config.command_map[:rake] = "bundle exec rake"
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
mb_recipe :delayed_job do
|
2
|
+
during :provision, "init_d"
|
3
|
+
during "deploy:start", "start"
|
4
|
+
during "deploy:stop", "stop"
|
5
|
+
during "deploy:restart", "restart"
|
6
|
+
during "deploy:publishing", "restart"
|
7
|
+
end
|
8
|
+
|
9
|
+
namespace :mb do
|
10
|
+
namespace :delayed_job do
|
11
|
+
desc "Install delayed_job service script"
|
12
|
+
task :init_d do
|
13
|
+
privileged_on roles(:delayed_job) do |host, user|
|
14
|
+
template "delayed_job_init.erb",
|
15
|
+
"/etc/init.d/delayed_job_#{application_basename}",
|
16
|
+
:mode => "a+rx",
|
17
|
+
:binding => binding,
|
18
|
+
:sudo => true
|
19
|
+
|
20
|
+
execute "sudo update-rc.d -f delayed_job_#{application_basename} defaults"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
%w[start stop restart].each do |command|
|
25
|
+
desc "#{command} delayed_job"
|
26
|
+
task command do
|
27
|
+
on roles(:delayed_job) do
|
28
|
+
execute "service delayed_job_#{application_basename} #{command}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
mb_recipe :dotenv do
|
2
|
+
during "provision", "update"
|
3
|
+
prior_to "deploy:publishing", "update"
|
4
|
+
end
|
5
|
+
|
6
|
+
namespace :mb do
|
7
|
+
namespace :dotenv do
|
8
|
+
desc "Replace/create .env file with values provided at console"
|
9
|
+
task :replace do
|
10
|
+
set_up_prompts
|
11
|
+
|
12
|
+
on release_roles(:all) do
|
13
|
+
update_dotenv_file
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Update .env file with any missing values"
|
18
|
+
task :update do
|
19
|
+
set_up_prompts
|
20
|
+
|
21
|
+
on release_roles(:all), :in => :sequence do
|
22
|
+
existing_env = if test("[ -f #{shared_dotenv_path} ]")
|
23
|
+
download!(shared_dotenv_path)
|
24
|
+
end
|
25
|
+
update_dotenv_file(existing_env.is_a?(String) ? existing_env : "")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def shared_dotenv_path
|
30
|
+
"#{shared_path}/#{fetch(:mb_dotenv_filename)}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_up_prompts
|
34
|
+
fetch(:mb_dotenv_keys).each do |key|
|
35
|
+
if key.to_s =~ /key|token|secret|password/i
|
36
|
+
ask(key, nil, :echo => false)
|
37
|
+
else
|
38
|
+
ask(key, nil)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def update_dotenv_file(existing="")
|
44
|
+
updated = existing.dup
|
45
|
+
|
46
|
+
fetch(:mb_dotenv_keys).each do |key|
|
47
|
+
next if existing =~ /^#{Regexp.escape(key.upcase)}=/
|
48
|
+
updated << "\n" unless updated.end_with?("\n")
|
49
|
+
updated << "#{key.upcase}=#{fetch(key)}\n"
|
50
|
+
end
|
51
|
+
|
52
|
+
unless existing == updated
|
53
|
+
put(updated, shared_dotenv_path, :mode => "600")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|