capistrano-ops 0.2.14 → 1.0.0

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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +121 -29
  3. data/lib/capistrano/ops/backup/helper.rb +56 -0
  4. data/lib/capistrano/ops/{capistrano/v3/tasks/backup → backup/tasks}/database/create.rake +1 -2
  5. data/lib/capistrano/ops/{capistrano/v3/tasks/backup → backup/tasks}/database/pull.rake +1 -2
  6. data/lib/capistrano/ops/{capistrano/v3/tasks/backup → backup/tasks}/storage/create.rake +1 -2
  7. data/lib/capistrano/ops/{capistrano/v3/tasks/backup → backup/tasks}/storage/pull.rake +1 -2
  8. data/lib/capistrano/ops/backup.rb +14 -4
  9. data/lib/capistrano/ops/capistrano.rb +8 -13
  10. data/lib/capistrano/ops/figaro_yml/helpers.rb +184 -0
  11. data/lib/capistrano/ops/figaro_yml/paths.rb +19 -0
  12. data/lib/capistrano/ops/figaro_yml/tasks/backup.rake +26 -0
  13. data/lib/capistrano/ops/figaro_yml/tasks/check.rake +12 -0
  14. data/lib/capistrano/ops/figaro_yml/tasks/check_config_present.rake +12 -0
  15. data/lib/capistrano/ops/figaro_yml/tasks/check_figaro_file_exists.rake +12 -0
  16. data/lib/capistrano/ops/figaro_yml/tasks/check_git_tracking.rake +12 -0
  17. data/lib/capistrano/ops/{capistrano/v3/tasks/figaro_yml → figaro_yml/tasks}/compare.rake +10 -19
  18. data/lib/capistrano/ops/figaro_yml/tasks/create_local.rake +27 -0
  19. data/lib/capistrano/ops/figaro_yml/tasks/figaro_yml_symlink.rake +10 -0
  20. data/lib/capistrano/ops/figaro_yml/tasks/get.rake +45 -0
  21. data/lib/capistrano/ops/figaro_yml/tasks/get_stage.rake +15 -0
  22. data/lib/capistrano/ops/figaro_yml/tasks/load.rake +10 -0
  23. data/lib/capistrano/ops/figaro_yml/tasks/rollback.rake +22 -0
  24. data/lib/capistrano/ops/figaro_yml/tasks/setup.rake +16 -0
  25. data/lib/capistrano/ops/{capistrano/v3/tasks/figaro_yml → figaro_yml/tasks}/sort_local.rake +2 -4
  26. data/lib/capistrano/ops/figaro_yml.rb +29 -0
  27. data/lib/capistrano/ops/helper.rb +14 -0
  28. data/lib/capistrano/ops/invoke/tasks/invoke.rake +25 -0
  29. data/lib/capistrano/ops/invoke.rb +3 -0
  30. data/lib/capistrano/ops/logrotate/helpers.rb +50 -0
  31. data/lib/capistrano/ops/logrotate/paths.rb +47 -0
  32. data/lib/capistrano/ops/{capistrano/v3/tasks/logrotate → logrotate/tasks}/check.rake +3 -5
  33. data/lib/capistrano/ops/{capistrano/v3/tasks/logrotate → logrotate/tasks}/disable.rake +2 -5
  34. data/lib/capistrano/ops/logrotate/tasks/enable.rake +28 -0
  35. data/lib/capistrano/ops/logrotate/tasks/load.rake +10 -0
  36. data/lib/capistrano/ops/logrotate.rb +19 -0
  37. data/lib/capistrano/ops/logs/helpers.rb +16 -0
  38. data/lib/capistrano/ops/logs/paths.rb +23 -0
  39. data/lib/capistrano/ops/logs/tasks/load.rake +9 -0
  40. data/lib/capistrano/ops/logs/tasks/rails.rake +18 -0
  41. data/lib/capistrano/ops/logs/tasks/sidekiq.rake +42 -0
  42. data/lib/capistrano/ops/logs.rb +18 -0
  43. data/lib/capistrano/ops/{backup → rails/lib/backup}/s3.rb +1 -1
  44. data/lib/capistrano/ops/rails/lib/backup.rb +6 -0
  45. data/lib/capistrano/ops/rails/lib/notification.rb +9 -0
  46. data/lib/capistrano/ops/rails/lib/railtie.rb +17 -0
  47. data/lib/capistrano/ops/{tasks → rails/lib/tasks}/pg/postgres_helper.rb +1 -1
  48. data/lib/capistrano/ops/version.rb +1 -1
  49. data/lib/capistrano/ops/{capistrano/v3/tasks/whenever.rake → whenever/tasks/show_crontab.rake} +1 -3
  50. data/lib/capistrano/ops/whenever.rb +17 -0
  51. data/lib/capistrano/ops/wkhtmltopdf/helpers.rb +50 -0
  52. data/lib/capistrano/ops/wkhtmltopdf/tasks/setup.rake +17 -0
  53. data/lib/capistrano/ops/wkhtmltopdf.rb +17 -1
  54. data/lib/capistrano/ops.rb +4 -3
  55. metadata +60 -36
  56. data/lib/capistrano/ops/capistrano/tasks/wkhtmltopdf.rake +0 -48
  57. data/lib/capistrano/ops/capistrano/v3/tasks/backup/backup_helper.rb +0 -50
  58. data/lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/figaro_yaml_helper.rb +0 -74
  59. data/lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/get.rake +0 -68
  60. data/lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/get_stage.rake +0 -13
  61. data/lib/capistrano/ops/capistrano/v3/tasks/figaro_yml.rb +0 -3
  62. data/lib/capistrano/ops/capistrano/v3/tasks/invoke.rake +0 -23
  63. data/lib/capistrano/ops/capistrano/v3/tasks/logrotate/enable.rake +0 -24
  64. data/lib/capistrano/ops/capistrano/v3/tasks/logrotate/logrotate_helper.rb +0 -68
  65. data/lib/capistrano/ops/capistrano/v3/tasks/logs/rails.rake +0 -16
  66. data/lib/capistrano/ops/notification.rb +0 -9
  67. data/lib/capistrano/ops/railtie.rb +0 -15
  68. /data/lib/capistrano/ops/{capistrano/v3/tasks/logrotate → logrotate/tasks}/templates/logrotate.conf.erb +0 -0
  69. /data/lib/capistrano/ops/{capistrano/v3/tasks/logrotate → logrotate/tasks}/templates/schedule.rb.erb +0 -0
  70. /data/lib/capistrano/ops/{backup → rails/lib/backup}/api.rb +0 -0
  71. /data/lib/capistrano/ops/{backup → rails/lib/backup}/s3_helper.rb +0 -0
  72. /data/lib/capistrano/ops/{notification → rails/lib/notification}/api.rb +0 -0
  73. /data/lib/capistrano/ops/{notification → rails/lib/notification}/slack.rb +0 -0
  74. /data/lib/capistrano/ops/{notification → rails/lib/notification}/webhook.rb +0 -0
  75. /data/lib/capistrano/ops/{tasks → rails/lib/tasks}/pg/dump.rake +0 -0
  76. /data/lib/capistrano/ops/{tasks → rails/lib/tasks}/pg/remove_old_dumps.rake +0 -0
  77. /data/lib/capistrano/ops/{tasks → rails/lib/tasks}/storage/backup.rake +0 -0
  78. /data/lib/capistrano/ops/{tasks → rails/lib/tasks}/storage/remove_old_backups.rake +0 -0
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :logs do
4
+ include Capistrano::Ops::Logs::Paths
5
+ include Capistrano::Ops::Logs::Helpers
6
+
7
+ desc 'Tail Rails info logs'
8
+ task 'sidekiq:info' do
9
+ on roles(fetch(:rake_roles, :app)) do
10
+ trap_interrupt
11
+
12
+ execute "tail -f #{sidekiq_log_file_path}" do |_channel, stream, data|
13
+ puts data
14
+ break if stream == :err
15
+ end
16
+ end
17
+ end
18
+
19
+ desc 'Tail Sidekiq error logs'
20
+ task 'sidekiq:errors' do
21
+ on roles(fetch(:rake_roles, :app)) do
22
+ trap_interrupt
23
+
24
+ execute "tail -f #{sidekiq_error_log_file_path}" do |_channel, stream, data|
25
+ puts data
26
+ break if stream == :err
27
+ end
28
+ end
29
+ end
30
+
31
+ desc 'Tail all Sidekiq logs'
32
+ task :sidekiq do
33
+ on roles(fetch(:rake_roles, :app)) do
34
+ trap_interrupt
35
+
36
+ execute "tail -f #{sidekiq_log_file_path} & tail -f #{sidekiq_error_log_file_path}" do |_channel, stream, data|
37
+ puts data
38
+ break if stream == :err
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'capistrano/ops/helper'
4
+ require 'capistrano/ops/logs/paths'
5
+ require 'capistrano/ops/logs/helpers'
6
+
7
+ module TaskLoader
8
+ extend Capistrano::Ops::Helper
9
+ def self.load_tasks_if_gem_present(gem_name, task_path, warning_message)
10
+ if gem_in_gemfile?(gem_name)
11
+ Dir.glob("#{File.expand_path(__dir__)}/#{task_path}/**/*.rake").each { |f| load f }
12
+ else
13
+ puts warning_message
14
+ end
15
+ end
16
+ end
17
+
18
+ TaskLoader.load_tasks_if_gem_present('rails', 'logs/tasks', 'WARNING: Gemfile does not include rails gem which is required for logs tasks')
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Backup
4
4
  require 'aws-sdk-s3'
5
- require 'capistrano/ops/backup/s3_helper'
5
+ require 'capistrano/ops/rails/lib/backup/s3_helper'
6
6
  class S3
7
7
  include Backup::S3Helper
8
8
  attr_accessor :endpoint, :region, :access_key_id, :secret_access_key, :s3_resource
@@ -0,0 +1,6 @@
1
+ require 'capistrano/ops/rails/lib/backup/api'
2
+ require 'capistrano/ops/rails/lib/backup/s3'
3
+
4
+ module Backup
5
+ class Error < StandardError; end
6
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'capistrano/ops/rails/lib/notification/api'
4
+ require 'capistrano/ops/rails/lib/notification/slack'
5
+ require 'capistrano/ops/rails/lib/notification/webhook'
6
+
7
+ module Notification
8
+ class Error < StandardError; end
9
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails'
4
+ # require 'capistrano/ops'
5
+ module Capistrano
6
+ module Ops
7
+ module Libs
8
+ class Railtie < ::Rails::Railtie
9
+ railtie_name :ops
10
+ rake_tasks do
11
+ path = File.expand_path(__dir__)
12
+ Dir.glob("#{path}/tasks/**/*.rake").each { |f| load f }
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -54,7 +54,7 @@ module PostgresHelper
54
54
  commandlist = []
55
55
  commandlist << "export PGPASSWORD='#{@password}'"
56
56
  commandlist << "cd #{@backup_path}"
57
- commandlist << "pg_dump -Fc #{options.join('')} > #{@filename}"
57
+ commandlist << "pg_dump --no-acl --no-owner #{options.join('')} > #{@filename}"
58
58
  commandlist.join(' && ')
59
59
  end
60
60
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Capistrano
4
4
  module Ops
5
- VERSION = '0.2.14'
5
+ VERSION = '1.0.0'
6
6
  end
7
7
  end
@@ -1,11 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  namespace :whenever do
4
- # Default to :app role
5
- rake_roles = fetch(:rake_roles, :app)
6
4
  desc 'show crontab'
7
5
  task :show_crontab do
8
- on roles(rake_roles) do
6
+ on roles(fetch(:rake_roles, :app)) do
9
7
  puts capture 'crontab -l'
10
8
  end
11
9
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'capistrano/ops/helper'
4
+
5
+ module TaskLoader
6
+ extend Capistrano::Ops::Helper
7
+
8
+ def self.load_tasks_if_gem_present(gem_name, task_path, warning_message)
9
+ if gem_in_gemfile?(gem_name)
10
+ Dir.glob("#{File.expand_path(__dir__)}/#{task_path}/**/*.rake").each { |f| load f }
11
+ else
12
+ puts warning_message
13
+ end
14
+ end
15
+ end
16
+
17
+ TaskLoader.load_tasks_if_gem_present('whenever', 'whenever/tasks', 'WARNING: Gemfile does not include whenever gem which is required for logrotate tasks')
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Capistrano
4
+ module Ops
5
+ module Helper
6
+ def binary_path
7
+ gem_path = capture(:bundle, 'show', 'wkhtmltopdf-binary').strip
8
+ "#{gem_path}/bin"
9
+ end
10
+
11
+ def gem_version
12
+ capture(:cat, 'config/initializers/wicked_pdf.rb').scan(/wkhtmltopdf_ubuntu_(\d+\.\d+)_amd64/).flatten.first
13
+ end
14
+
15
+ def binary_path_and_version
16
+ [binary_path, gem_version]
17
+ end
18
+
19
+ def file_existing?(file)
20
+ test("[ -f #{file} ]")
21
+ end
22
+
23
+ def right_permissions?(file)
24
+ test("[ $(stat -c '%a' #{file}) = '777' ]")
25
+ end
26
+
27
+ def check_file_and_permissions(binary_path, version)
28
+ binary_file = "#{binary_path}/wkhtmltopdf_ubuntu_#{version}_amd64"
29
+
30
+ if file_existing?(binary_file)
31
+ info('wkhtmltopdf binary already extracted')
32
+
33
+ if right_permissions?(binary_file)
34
+ info('wkhtmltopdf binary has already the right permissions')
35
+ else
36
+ info('adding right permissions to wkhtmltopdf binary')
37
+ execute("chmod 777 #{binary_file}")
38
+ end
39
+ else
40
+ info('extracting wkhtmltopdf binary')
41
+ # extract the binary but keep the gzip file
42
+ execute("cd #{binary_path} && gzip -dk wkhtmltopdf_ubuntu_#{version}_amd64.gz")
43
+ # add execute permission to the binary
44
+ execute("chmod 777 #{binary_file}")
45
+ end
46
+ info('wkhtmltopdf setup finished')
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :wkhtmltopdf do
4
+ include Capistrano::Ops::Wkhtmltopdf::Helpers
5
+ after 'deploy:symlink:release', 'wkhtmltopdf:setup'
6
+
7
+ desc 'unzip wkhtmltopdf if necessary'
8
+ task :setup do
9
+ on roles(:app) do
10
+ within release_path do
11
+ binary_path, version = binary_path_and_version
12
+ info("setup wkhtmltopdf version #{version}")
13
+ check_file_and_permissions(binary_path, version)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- load File.expand_path('capistrano/tasks/wkhtmltopdf.rake', __dir__)
3
+ require 'capistrano/ops/helper'
4
+ require 'capistrano/ops/wkhtmltopdf/helpers'
5
+
6
+ module TaskLoader
7
+ extend Capistrano::Ops::Helper
8
+
9
+ def self.load_tasks_if_gem_present(gem_name, task_path, warning_message)
10
+ if gem_in_gemfile?(gem_name)
11
+ Dir.glob("#{File.expand_path(__dir__)}/#{task_path}/**/*.rake").each { |f| load f }
12
+ else
13
+ puts warning_message
14
+ end
15
+ end
16
+ end
17
+
18
+ TaskLoader.load_tasks_if_gem_present('wicked-pdf', 'wkhtmltopdf/tasks',
19
+ 'WARNING: Gemfile does not include wkhtmltopdf-binary gem which is required for wkhtmltopdf tasks')
@@ -2,10 +2,11 @@
2
2
 
3
3
  module Capistrano
4
4
  module Ops
5
- require 'capistrano/ops/backup'
6
- require 'capistrano/ops/notification'
7
- require 'capistrano/ops/railtie' if defined?(Rails)
5
+ require 'capistrano/ops/rails/lib/backup'
6
+ require 'capistrano/ops/rails/lib/notification'
7
+ require 'capistrano/ops/rails/lib/railtie' if defined?(Rails)
8
8
  require 'capistrano/ops/capistrano' if defined?(Capistrano::VERSION)
9
+
9
10
  def self.path
10
11
  Dir.pwd
11
12
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-ops
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.14
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Crusius
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-29 00:00:00.000000000 Z
11
+ date: 2024-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-s3
@@ -144,44 +144,68 @@ files:
144
144
  - capistrano-ops.gemspec
145
145
  - lib/capistrano/ops.rb
146
146
  - lib/capistrano/ops/backup.rb
147
- - lib/capistrano/ops/backup/api.rb
148
- - lib/capistrano/ops/backup/s3.rb
149
- - lib/capistrano/ops/backup/s3_helper.rb
147
+ - lib/capistrano/ops/backup/helper.rb
148
+ - lib/capistrano/ops/backup/tasks/database/create.rake
149
+ - lib/capistrano/ops/backup/tasks/database/pull.rake
150
+ - lib/capistrano/ops/backup/tasks/storage/create.rake
151
+ - lib/capistrano/ops/backup/tasks/storage/pull.rake
150
152
  - lib/capistrano/ops/capistrano.rb
151
- - lib/capistrano/ops/capistrano/tasks/wkhtmltopdf.rake
152
153
  - lib/capistrano/ops/capistrano/v3/tasks/backup.rake
153
- - lib/capistrano/ops/capistrano/v3/tasks/backup/backup_helper.rb
154
- - lib/capistrano/ops/capistrano/v3/tasks/backup/database/create.rake
155
- - lib/capistrano/ops/capistrano/v3/tasks/backup/database/pull.rake
156
- - lib/capistrano/ops/capistrano/v3/tasks/backup/storage/create.rake
157
- - lib/capistrano/ops/capistrano/v3/tasks/backup/storage/pull.rake
158
- - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml.rb
159
- - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/compare.rake
160
- - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/figaro_yaml_helper.rb
161
- - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/get.rake
162
- - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/get_stage.rake
163
- - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/sort_local.rake
164
- - lib/capistrano/ops/capistrano/v3/tasks/invoke.rake
165
- - lib/capistrano/ops/capistrano/v3/tasks/logrotate/check.rake
166
- - lib/capistrano/ops/capistrano/v3/tasks/logrotate/disable.rake
167
- - lib/capistrano/ops/capistrano/v3/tasks/logrotate/enable.rake
168
- - lib/capistrano/ops/capistrano/v3/tasks/logrotate/logrotate_helper.rb
169
- - lib/capistrano/ops/capistrano/v3/tasks/logrotate/templates/logrotate.conf.erb
170
- - lib/capistrano/ops/capistrano/v3/tasks/logrotate/templates/schedule.rb.erb
171
- - lib/capistrano/ops/capistrano/v3/tasks/logs/rails.rake
172
- - lib/capistrano/ops/capistrano/v3/tasks/whenever.rake
173
- - lib/capistrano/ops/notification.rb
174
- - lib/capistrano/ops/notification/api.rb
175
- - lib/capistrano/ops/notification/slack.rb
176
- - lib/capistrano/ops/notification/webhook.rb
177
- - lib/capistrano/ops/railtie.rb
178
- - lib/capistrano/ops/tasks/pg/dump.rake
179
- - lib/capistrano/ops/tasks/pg/postgres_helper.rb
180
- - lib/capistrano/ops/tasks/pg/remove_old_dumps.rake
181
- - lib/capistrano/ops/tasks/storage/backup.rake
182
- - lib/capistrano/ops/tasks/storage/remove_old_backups.rake
154
+ - lib/capistrano/ops/figaro_yml.rb
155
+ - lib/capistrano/ops/figaro_yml/helpers.rb
156
+ - lib/capistrano/ops/figaro_yml/paths.rb
157
+ - lib/capistrano/ops/figaro_yml/tasks/backup.rake
158
+ - lib/capistrano/ops/figaro_yml/tasks/check.rake
159
+ - lib/capistrano/ops/figaro_yml/tasks/check_config_present.rake
160
+ - lib/capistrano/ops/figaro_yml/tasks/check_figaro_file_exists.rake
161
+ - lib/capistrano/ops/figaro_yml/tasks/check_git_tracking.rake
162
+ - lib/capistrano/ops/figaro_yml/tasks/compare.rake
163
+ - lib/capistrano/ops/figaro_yml/tasks/create_local.rake
164
+ - lib/capistrano/ops/figaro_yml/tasks/figaro_yml_symlink.rake
165
+ - lib/capistrano/ops/figaro_yml/tasks/get.rake
166
+ - lib/capistrano/ops/figaro_yml/tasks/get_stage.rake
167
+ - lib/capistrano/ops/figaro_yml/tasks/load.rake
168
+ - lib/capistrano/ops/figaro_yml/tasks/rollback.rake
169
+ - lib/capistrano/ops/figaro_yml/tasks/setup.rake
170
+ - lib/capistrano/ops/figaro_yml/tasks/sort_local.rake
171
+ - lib/capistrano/ops/helper.rb
172
+ - lib/capistrano/ops/invoke.rb
173
+ - lib/capistrano/ops/invoke/tasks/invoke.rake
174
+ - lib/capistrano/ops/logrotate.rb
175
+ - lib/capistrano/ops/logrotate/helpers.rb
176
+ - lib/capistrano/ops/logrotate/paths.rb
177
+ - lib/capistrano/ops/logrotate/tasks/check.rake
178
+ - lib/capistrano/ops/logrotate/tasks/disable.rake
179
+ - lib/capistrano/ops/logrotate/tasks/enable.rake
180
+ - lib/capistrano/ops/logrotate/tasks/load.rake
181
+ - lib/capistrano/ops/logrotate/tasks/templates/logrotate.conf.erb
182
+ - lib/capistrano/ops/logrotate/tasks/templates/schedule.rb.erb
183
+ - lib/capistrano/ops/logs.rb
184
+ - lib/capistrano/ops/logs/helpers.rb
185
+ - lib/capistrano/ops/logs/paths.rb
186
+ - lib/capistrano/ops/logs/tasks/load.rake
187
+ - lib/capistrano/ops/logs/tasks/rails.rake
188
+ - lib/capistrano/ops/logs/tasks/sidekiq.rake
189
+ - lib/capistrano/ops/rails/lib/backup.rb
190
+ - lib/capistrano/ops/rails/lib/backup/api.rb
191
+ - lib/capistrano/ops/rails/lib/backup/s3.rb
192
+ - lib/capistrano/ops/rails/lib/backup/s3_helper.rb
193
+ - lib/capistrano/ops/rails/lib/notification.rb
194
+ - lib/capistrano/ops/rails/lib/notification/api.rb
195
+ - lib/capistrano/ops/rails/lib/notification/slack.rb
196
+ - lib/capistrano/ops/rails/lib/notification/webhook.rb
197
+ - lib/capistrano/ops/rails/lib/railtie.rb
198
+ - lib/capistrano/ops/rails/lib/tasks/pg/dump.rake
199
+ - lib/capistrano/ops/rails/lib/tasks/pg/postgres_helper.rb
200
+ - lib/capistrano/ops/rails/lib/tasks/pg/remove_old_dumps.rake
201
+ - lib/capistrano/ops/rails/lib/tasks/storage/backup.rake
202
+ - lib/capistrano/ops/rails/lib/tasks/storage/remove_old_backups.rake
183
203
  - lib/capistrano/ops/version.rb
204
+ - lib/capistrano/ops/whenever.rb
205
+ - lib/capistrano/ops/whenever/tasks/show_crontab.rake
184
206
  - lib/capistrano/ops/wkhtmltopdf.rb
207
+ - lib/capistrano/ops/wkhtmltopdf/helpers.rb
208
+ - lib/capistrano/ops/wkhtmltopdf/tasks/setup.rake
185
209
  homepage: https://github.com/zauberware/capistrano-ops
186
210
  licenses:
187
211
  - MIT
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace :wkhtmltopdf do
4
- after 'deploy:symlink:release', 'wkhtmltopdf:setup'
5
-
6
- desc 'unzip wkhtmltopdf if necessary'
7
- task :setup do
8
- on roles(:app) do
9
- within release_path do
10
- binary_path, version = binary_path_and_version
11
- info("setup wkhtmltopdf version #{version}")
12
- check_file_and_permissions(binary_path, version)
13
- end
14
- end
15
- end
16
- end
17
- def binary_path_and_version
18
- # get the binary path of wkhtmltopdf-binary
19
- gem_path = capture(:bundle, 'show', 'wkhtmltopdf-binary').strip
20
- binary_path = "#{gem_path}/bin"
21
-
22
- # get the use wkhtmltopdf_ubuntu version from the wicked_pdf initializer
23
- version = capture(:cat, 'config/initializers/wicked_pdf.rb').scan(/wkhtmltopdf_ubuntu_(\d+\.\d+)_amd64/).flatten.first
24
-
25
- [binary_path, version]
26
- end
27
-
28
- def check_file_and_permissions(binary_path, version)
29
- binary_file = "#{binary_path}/wkhtmltopdf_ubuntu_#{version}_amd64"
30
-
31
- if test("[ -f #{binary_file} ]")
32
- info('wkhtmltopdf binary already extracted')
33
-
34
- if test("[ $(stat -c '%a' #{binary_file}) = '777' ]")
35
- info('wkhtmltopdf binary has already the right permissions')
36
- else
37
- info('adding right permissions to wkhtmltopdf binary')
38
- execute("chmod 777 #{binary_file}")
39
- end
40
- else
41
- info('extracting wkhtmltopdf binary')
42
- # extract the binary but keep the gzip file
43
- execute("cd #{binary_path} && gzip -dk wkhtmltopdf_ubuntu_#{version}_amd64.gz")
44
- # add execute permission to the binary
45
- execute("chmod 777 #{binary_file}")
46
- end
47
- info('wkhtmltopdf setup finished')
48
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module BackupHelper
4
- def backup_file_name(type)
5
- regex = type == 'storage' ? "'.{0,}\.tar.gz'" : "'.{0,}\.dump'"
6
- @backup_file_name ||= capture "cd #{shared_path}/backups && ls -lt | grep -E -i #{regex} | head -n 1 | awk '{print $9}'"
7
- end
8
-
9
- def backup_file_size
10
- @backup_file_size ||= capture "cd #{shared_path}/backups && wc -c #{@backup_file_name} | awk '{print $1}'"
11
- end
12
-
13
- def download_backup(backup_file, type)
14
- puts "Downloading #{type} backup"
15
- download! "#{shared_path}/backups/#{backup_file}", backup_file
16
- puts "Download finished\nDeleting temporary backup..."
17
- cleanup_backup(backup_file, "Download finished\nDeleting temporary backup...")
18
- end
19
-
20
- def cleanup_backup(backup_file, message)
21
- puts message
22
- execute "cd #{shared_path}/backups && rm #{backup_file}"
23
- puts 'Temporary backup deleted'
24
- end
25
-
26
- def question(question, default = 'n', &block)
27
- print "#{question} #{default.downcase == 'n' ? '(y/N)' : '(Y/n)'}: "
28
- input = $stdin.gets.strip.downcase
29
- answer = (input.empty? ? default : input).downcase.to_s
30
-
31
- if %w[y n].include?(answer)
32
- block.call(answer == 'y')
33
- else
34
- question(question, default, &block)
35
- end
36
- end
37
-
38
- def prepare_env
39
- @env = "RAILS_ENV=#{fetch(:stage)}"
40
- @path_cmd = "PATH=$HOME/.rbenv/versions/#{RUBY_VERSION}/bin:$PATH"
41
- @test_command = "cd #{release_path} && #{@path_cmd} && #{@env}"
42
- end
43
-
44
- def size_str(size)
45
- units = %w[B KB MB GB TB]
46
- e = (Math.log(size) / Math.log(1024)).floor
47
- s = format('%.2f', size.to_f / 1024**e)
48
- s.sub(/\.?0*$/, units[e])
49
- end
50
- end
@@ -1,74 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FigaroYmlHelper
4
- def environments
5
- Dir.glob('config/deploy/*.rb')
6
- end
7
-
8
- def local_yaml
9
- YAML.safe_load(File.read('config/application.yml')) || {}
10
- end
11
-
12
- def write_to_file(file, content)
13
- File.open(file, 'w') do |f|
14
- f.write(content)
15
- end
16
- end
17
-
18
- def write_combined_yaml(yamls_combined)
19
- if yamls_combined.empty?
20
- info 'No data to write.'
21
- else
22
- # write to new file
23
- info 'writing to config/application.yml'
24
- write_to_file('config/application.yml', yamls_combined.to_yaml)
25
- end
26
- end
27
-
28
- def compare_hashes(hash1, hash2)
29
- all_keys = hash1.keys | hash2.keys # Union of all keys from both hashes
30
- all_keys.each_with_object({}) do |key, changes_hash|
31
- old_value = hash2[key].nil? ? 'nil' : hash2[key].to_s
32
- new_value = hash1[key].nil? ? 'nil' : hash1[key].to_s
33
-
34
- changes_hash[key] = { old: old_value, new: new_value } if old_value != new_value
35
- end.tap { |changes| return changes.empty? ? nil : changes }
36
- end
37
-
38
- def print_changes(changes, message)
39
- return unless changes
40
-
41
- puts "#{message}:\n\n"
42
- changes.each do |key, diff|
43
- puts "#{key}: #{diff[:old]} => #{diff[:new]}"
44
- end
45
- puts "\n"
46
- end
47
-
48
- def ask_to_overwrite(question)
49
- answer = ''
50
- until %w[y n].include?(answer)
51
- print "#{question}? (y/N): "
52
- answer = $stdin.gets.strip.downcase
53
- end
54
- answer == 'y'
55
- end
56
-
57
- def configs(yaml, env)
58
- stage_yml = yaml[env.to_s]&.sort.to_h
59
- global_yml = remove_nested(yaml)&.sort.to_h
60
- [global_yml, stage_yml]
61
- end
62
-
63
- def remove_nested(hash)
64
- hash.each_with_object({}) do |(key, value), new_hash|
65
- new_hash[key] = value unless value.is_a?(Hash)
66
- end
67
- end
68
-
69
- def sort_with_nested(hash)
70
- hash.each_with_object({}) do |(key, value), new_hash|
71
- new_hash[key] = value.is_a?(Hash) ? sort_with_nested(value) : value
72
- end.sort.to_h
73
- end
74
- end
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'figaro_yaml_helper'
4
-
5
- namespace :figaro_yml do
6
- include FigaroYmlHelper
7
-
8
- rake_roles = fetch(:rake_roles, :app)
9
- desc 'get the `application.yml` file from server and create local if it does not exist'
10
- task :get do
11
- env = fetch(:stage)
12
- if !File.exist?('config/application.yml')
13
- run_locally do
14
- puts "found #{environments.count} stages"
15
- yamls_combined = {}
16
-
17
- stages.each do |f|
18
- stage = File.basename(f, '.rb')
19
- puts "download #{stage} application.yml"
20
- begin
21
- res = capture "cap #{stage} figaro_yml:get_stage"
22
- stage_yaml = YAML.safe_load(res)
23
- stage_yaml[stage.to_s] = stage_yaml[stage.to_s].sort.to_h
24
- yamls_combined.merge!(stage_yaml) if stage_yaml
25
- rescue StandardError
26
- puts "could not get #{stage} application.yml"
27
- end
28
- end
29
-
30
- write_combined_yaml(yamls_combined.sort.to_h)
31
- end
32
- else
33
- on roles(rake_roles) do
34
- local_yml = local_yaml.sort.to_h
35
- local_global, local_stage = configs(local_yml, env)
36
-
37
- remote = capture("cat #{shared_path}/config/application.yml")
38
- remote_yml = YAML.safe_load(remote).sort.to_h
39
- remote_global, remote_stage = configs(remote_yml, env)
40
-
41
- differences_global = compare_hashes(remote_global, local_global || {})
42
- differences_stage = compare_hashes(remote_stage, local_stage || {})
43
-
44
- print_changes(differences_global,
45
- 'Remote application.yml has extra/different global entries compared to local.')
46
- print_changes(differences_stage, "Remote application.yml has extra/different entries in #{env} section compared to local.") if differences_stage
47
-
48
- puts 'No Differences found between remote and local application.yml' unless differences_global || differences_stage
49
-
50
- # ask to overwrite local yml if differences found
51
- stage_overwrite = ask_to_overwrite("Overwrite local application.yml #{env} section") if differences_stage
52
- global_overwrite = ask_to_overwrite('Overwrite local application.yml globals') if differences_global
53
- puts 'Nothing written to local application.yml' unless stage_overwrite || global_overwrite
54
- exit unless stage_overwrite || global_overwrite
55
-
56
- # compose new yml
57
- composed_yml = {}
58
- composed_yml.merge!(local_yml) # local yml is always included to avoid losing any data
59
- composed_yml.merge!(local_global) unless global_overwrite
60
- composed_yml.merge!(remote_global) if global_overwrite
61
- composed_yml[env.to_s] = stage_overwrite ? remote_stage : local_stage
62
-
63
- # write to new file
64
- write_combined_yaml(composed_yml.sort.to_h)
65
- end
66
- end
67
- end
68
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'figaro_yaml_helper'
4
-
5
- namespace :figaro_yml do
6
- rake_roles = fetch(:rake_roles, :app)
7
-
8
- task :get_stage do
9
- on roles(rake_roles) do
10
- puts capture "cat #{shared_path}/config/application.yml"
11
- end
12
- end
13
- end
@@ -1,3 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- Dir.glob("#{File.expand_path(__dir__)}/figaro_yml/**/*.rake").each { |f| load f }