capistrano-ops 0.2.14 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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 }