j-cap-recipes 0.0.16 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +1 -1
- data/README.md +11 -0
- data/lib/j-cap-recipes/tasks/database.rake +18 -9
- data/lib/j-cap-recipes/tasks/db.rake +43 -29
- data/lib/j-cap-recipes/tasks/deploy.rake +11 -0
- data/lib/j-cap-recipes/tasks/files.rake +1 -1
- data/lib/j-cap-recipes/tasks/git.rake +11 -0
- data/lib/j-cap-recipes/util.rb +12 -0
- data/lib/j-cap-recipes/version.rb +1 -1
- data/lib/j-cap-recipes.rb +1 -0
- data/lib/sshkit/backends/ssh_command.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c956d783e3a5cc9334124c40c98d4b6d6d8f0486
|
4
|
+
data.tar.gz: ff287d34e0858d0d7c4dcbed8fcacb2dc461b763
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 916166821d2a71988cebb4cd810cc9be36361ffebf238df3f8a0e1bffb3a28e4095ae639f4d78b91de8ada42b9236bb5709480ae1e5b09bd5fed8a6bb2340023
|
7
|
+
data.tar.gz: 05e3a11711e3988095ef5f43a94da4cc3366b414e96f21914b0006b806c3536a0cc7ac1d653d0e4ef58e3f165a9228dba47d9a3f44694799f929c77d8cc7feef
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
## Changelog
|
2
2
|
|
3
|
+
## 0.0.17
|
4
|
+
|
5
|
+
* Added ability to define what the env to download or upload for database backups. If it differs from the rails env.
|
6
|
+
* Added task to update the version with current revision and deploy timestamp.
|
7
|
+
|
3
8
|
## 0.0.16
|
4
9
|
|
5
10
|
* Added handy task to remote edit settings file.
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -51,7 +51,9 @@ Also you need to include rake tasks in your `Rakefile`:
|
|
51
51
|
`cap production db:create`
|
52
52
|
`cap production db:backup`
|
53
53
|
`cap production db:dump_download`
|
54
|
+
`cap production db:dump_download[rails_env]` - Download the file that located in `<current>/db/backups/<application>_<rails_env>_latest.dump`
|
54
55
|
`cap production db:dump_upload`
|
56
|
+
`cap production db:dump_upload[rails_env]` - Upload the file `<current>/db/backups/<application>_<rails_env>_latest.dump` to remote host
|
55
57
|
`cap production db:restore`
|
56
58
|
|
57
59
|
|
@@ -107,6 +109,15 @@ There are tasks available:
|
|
107
109
|
- `cap staging config:settings:get` Download the remote config file to local one
|
108
110
|
- `cap staging config:settings:edit` Direct editing of the settings file
|
109
111
|
|
112
|
+
### Update VERSION file with build number
|
113
|
+
|
114
|
+
Task `deploy:update_version` adds to end of line the `:build_number` string. You may set it to:
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
set :build_number, proc { [fetch(:current_revision), Time.now.strftime("%Y%m%d"), ].compact.join('-') }
|
118
|
+
set :version_filename, 'VERSION'
|
119
|
+
```
|
120
|
+
|
110
121
|
### Git
|
111
122
|
|
112
123
|
First should add `require 'j-cap-recipes/git'` to `Capfile`.
|
@@ -40,29 +40,34 @@ namespace :db do
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
desc '
|
44
|
-
task :dump_download do
|
43
|
+
desc 'Download to local machine the latest backup'
|
44
|
+
task :dump_download, :env_name do |task, args|
|
45
45
|
on primary fetch(:migration_role) do
|
46
46
|
within release_path do
|
47
47
|
FileUtils.mkdir_p 'db/backups'
|
48
|
-
|
49
|
-
|
48
|
+
env_name = args[:env_name] || fetch(:rails_env).to_s
|
49
|
+
database_config_content = read_remote_database_config
|
50
|
+
database_name = JCap::Recipes::Util.database_name(env_name, database_config_content)
|
51
|
+
backup_file = "db/backups/#{database_name}_latest.dump"
|
52
|
+
download! "#{release_path}/#{backup_file}", backup_file
|
50
53
|
end
|
51
54
|
end
|
52
55
|
end
|
53
56
|
|
54
|
-
desc '
|
55
|
-
task :dump_upload do
|
57
|
+
desc 'Download to local machine the latest backup'
|
58
|
+
task :dump_upload, :env_name do |task, args|
|
56
59
|
on primary fetch(:migration_role) do
|
57
60
|
within release_path do
|
58
61
|
FileUtils.mkdir_p 'db/backups'
|
59
|
-
|
60
|
-
|
62
|
+
env_name = args[:env_name] || fetch(:rails_env).to_s
|
63
|
+
database_config_content = read_remote_database_config
|
64
|
+
database_name = JCap::Recipes::Util.database_name(env_name, database_config_content)
|
65
|
+
backup_file = "db/backups/#{database_name}_latest.dump"
|
66
|
+
upload! backup_file, "#{release_path}/#{backup_file}"
|
61
67
|
end
|
62
68
|
end
|
63
69
|
end
|
64
70
|
|
65
|
-
|
66
71
|
end
|
67
72
|
|
68
73
|
remote_file 'config/database.yml' => '/tmp/database.yml', roles: :app
|
@@ -94,3 +99,7 @@ file '/tmp/database.yml' do |t|
|
|
94
99
|
f.puts config.result(binding)
|
95
100
|
end
|
96
101
|
end
|
102
|
+
|
103
|
+
def read_remote_database_config(path = 'config/database.yml')
|
104
|
+
capture :cat, path
|
105
|
+
end
|
@@ -13,56 +13,65 @@ namespace :db do
|
|
13
13
|
backup_file = File.join(backup_dir, "#{database_name}_#{datestamp}.dump")
|
14
14
|
|
15
15
|
#dump the backup and zip it up
|
16
|
-
dump_command = "pg_dump #{database_name} -w -F c"
|
17
|
-
dump_command
|
18
|
-
dump_command
|
19
|
-
dump_command += " > #{backup_file}"
|
16
|
+
dump_command = "#{postgres_password(config)} pg_dump #{database_name} -w -F c"
|
17
|
+
dump_command += postgres_auth_options(config)
|
18
|
+
dump_command += " > #{backup_file}"
|
20
19
|
|
21
20
|
sh dump_command
|
22
21
|
|
23
22
|
safe_ln backup_file, File.join(backup_dir, "#{database_name}_latest.dump")
|
24
|
-
|
25
|
-
#send_to_amazon backup_file
|
26
|
-
#remove the file on completion so we don't clog up our app
|
27
|
-
#File.delete backup_file
|
28
23
|
end
|
29
24
|
|
30
25
|
desc 'PG restore from the last backup file'
|
31
|
-
task restore: [:environment, :load_config] do
|
26
|
+
task restore: ['db:create', :environment, :load_config] do
|
32
27
|
config = ActiveRecord::Base.connection_config
|
33
28
|
database_name = ActiveRecord::Base.connection.current_database
|
34
29
|
backup_dir = ENV['backup-path'] || Rails.root.join('db', 'backups')
|
35
30
|
backup_file = File.join(backup_dir, "#{database_name}_latest.dump")
|
36
31
|
|
37
|
-
|
38
|
-
|
39
|
-
|
32
|
+
execute_task!('db:kill_postgres_connections')
|
33
|
+
execute_task!('db:drop')
|
34
|
+
execute_task!('db:create')
|
40
35
|
|
41
|
-
restore_command = "pg_restore -d #{database_name} -F c -w #{backup_file}"
|
42
|
-
restore_command
|
36
|
+
restore_command = "#{postgres_password(config)} pg_restore -d #{database_name} -F c -w #{backup_file}"
|
37
|
+
restore_command += postgres_auth_options(config)
|
38
|
+
restore_command += ' -O -c'
|
43
39
|
sh "#{restore_command} || echo 'done'"
|
44
40
|
end
|
45
41
|
|
46
42
|
task :kill_postgres_connections => :environment do
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
43
|
+
db_name = ActiveRecord::Base.connection.current_database
|
44
|
+
pid_column_name = if ActiveRecord::Base.connection.send(:postgresql_version) > 90200
|
45
|
+
'pid'
|
46
|
+
else
|
47
|
+
'procpid'
|
48
|
+
end
|
49
|
+
|
50
|
+
kill_query = <<-QUERY
|
51
|
+
SELECT pg_terminate_backend(#{pid_column_name})
|
52
|
+
FROM pg_stat_activity
|
53
|
+
WHERE datname = '#{db_name}';
|
54
|
+
QUERY
|
55
|
+
|
56
|
+
begin
|
57
|
+
ActiveRecord::Base.connection.exec_query(kill_query)
|
58
|
+
rescue ActiveRecord::StatementInvalid => ex
|
59
|
+
puts "All connections to #{db_name} were killed successfully!"
|
60
|
+
puts "Database message: #{ex.message}"
|
61
|
+
end
|
57
62
|
end
|
58
63
|
|
59
64
|
end
|
60
65
|
|
61
|
-
def
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
+
def postgres_password(config)
|
67
|
+
"PGPASSWORD='#{config[:password]}'" if config[:password].present?
|
68
|
+
end
|
69
|
+
|
70
|
+
def postgres_auth_options(config)
|
71
|
+
command_options = ''
|
72
|
+
command_options += " -h #{config[:hostname]}" if config[:hostname].present?
|
73
|
+
command_options += " -U #{config[:username]}" if config[:username].present?
|
74
|
+
command_options
|
66
75
|
end
|
67
76
|
|
68
77
|
#TODO: Use setting to get S3 credentials
|
@@ -73,3 +82,8 @@ def send_to_amazon(file_path)
|
|
73
82
|
#push the file up
|
74
83
|
AWS::S3::S3Object.store(file_name, File.open(file_path), bucket)
|
75
84
|
end
|
85
|
+
|
86
|
+
def execute_task!(task_name)
|
87
|
+
Rake::Task[task_name].reenable
|
88
|
+
Rake::Task[task_name].invoke
|
89
|
+
end
|
@@ -5,4 +5,15 @@ namespace :deploy do
|
|
5
5
|
execute :touch, current_path.join('tmp/restart.txt')
|
6
6
|
end
|
7
7
|
end
|
8
|
+
|
9
|
+
desc 'Store the deploy date and version to project file'
|
10
|
+
task :update_version do
|
11
|
+
on release_roles(:all) do
|
12
|
+
within release_path do
|
13
|
+
build_number = fetch(:build_number, [fetch(:current_revision), release_timestamp].compact.join('-'))
|
14
|
+
version_file_name = fetch(:version_filename, 'VERSION')
|
15
|
+
execute %{sed -i.bak 's/$/@#{build_number}/' #{release_path.join(version_file_name)}}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
8
19
|
end
|
@@ -11,4 +11,15 @@ namespace :git do
|
|
11
11
|
(puts "Created tag `#{tag_name}`")
|
12
12
|
end
|
13
13
|
end
|
14
|
+
|
15
|
+
desc 'Updates repository url'
|
16
|
+
task :update_repo_url do
|
17
|
+
on release_roles :all do
|
18
|
+
within repo_path do
|
19
|
+
with fetch(:git_environmental_variables) do
|
20
|
+
execute :git, :remote, 'set-url', 'origin', fetch(:repo_url)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
14
25
|
end
|
data/lib/j-cap-recipes.rb
CHANGED
@@ -19,7 +19,7 @@ module SSHKit
|
|
19
19
|
host_url = String(host.hostname)
|
20
20
|
host_url = '%s@%s' % [host.username, host_url] if host.username
|
21
21
|
result = 'ssh %s -t "%s"' % [host_url, command(*args).to_command]
|
22
|
-
output << Command.new(result)
|
22
|
+
output << Command.new(result, host: host)
|
23
23
|
system(result)
|
24
24
|
end
|
25
25
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: j-cap-recipes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Nikitochkin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -107,6 +107,7 @@ files:
|
|
107
107
|
- lib/j-cap-recipes/tasks/templates/database.yml.erb
|
108
108
|
- lib/j-cap-recipes/tasks/unicorn.rake
|
109
109
|
- lib/j-cap-recipes/unicorn.rb
|
110
|
+
- lib/j-cap-recipes/util.rb
|
110
111
|
- lib/j-cap-recipes/version.rb
|
111
112
|
- lib/sshkit/backends/ssh_command.rb
|
112
113
|
homepage: https://github.com/jetthoughts/j-cap-recipes
|
@@ -129,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
130
|
version: '0'
|
130
131
|
requirements: []
|
131
132
|
rubyforge_project:
|
132
|
-
rubygems_version: 2.
|
133
|
+
rubygems_version: 2.4.5
|
133
134
|
signing_key:
|
134
135
|
specification_version: 4
|
135
136
|
summary: Capistrano 3 recipes for nginx, monit, rails log, setup, unicorn
|