capistrano-ops 1.0.10 → 1.1.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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +18 -0
  3. data/.github/workflows/ci.yml +44 -0
  4. data/.github/workflows/release.yml +25 -0
  5. data/.gitignore +1 -0
  6. data/.rspec +3 -0
  7. data/.rubocop.yml +79 -19
  8. data/.rubocop_todo.yml +55 -0
  9. data/.ruby-version +1 -1
  10. data/CHANGELOG.md +347 -0
  11. data/README.md +14 -5
  12. data/Rakefile +22 -1
  13. data/bin/console +1 -1
  14. data/capistrano-ops.gemspec +13 -10
  15. data/lib/capistrano/ops/backup/helper.rb +4 -4
  16. data/lib/capistrano/ops/backup/tasks/database/create.rake +1 -0
  17. data/lib/capistrano/ops/backup/tasks/database/pull.rake +1 -0
  18. data/lib/capistrano/ops/backup/tasks/storage/create.rake +1 -0
  19. data/lib/capistrano/ops/backup/tasks/storage/pull.rake +1 -0
  20. data/lib/capistrano/ops/figaro_yml/helpers.rb +3 -6
  21. data/lib/capistrano/ops/figaro_yml/tasks/check.rake +1 -0
  22. data/lib/capistrano/ops/figaro_yml/tasks/check_config_present.rake +1 -0
  23. data/lib/capistrano/ops/figaro_yml/tasks/check_figaro_file_exists.rake +1 -0
  24. data/lib/capistrano/ops/figaro_yml/tasks/check_git_tracking.rake +1 -0
  25. data/lib/capistrano/ops/figaro_yml/tasks/create_local.rake +1 -0
  26. data/lib/capistrano/ops/figaro_yml/tasks/figaro_yml_symlink.rake +1 -0
  27. data/lib/capistrano/ops/figaro_yml/tasks/get.rake +4 -3
  28. data/lib/capistrano/ops/figaro_yml/tasks/get_stage.rake +1 -0
  29. data/lib/capistrano/ops/figaro_yml/tasks/sort_local.rake +1 -0
  30. data/lib/capistrano/ops/figaro_yml.rb +2 -1
  31. data/lib/capistrano/ops/invoke/tasks/invoke.rake +1 -1
  32. data/lib/capistrano/ops/logrotate/paths.rb +2 -0
  33. data/lib/capistrano/ops/logrotate/tasks/disable.rake +1 -0
  34. data/lib/capistrano/ops/logrotate.rb +2 -1
  35. data/lib/capistrano/ops/rails/lib/backup/api.rb +1 -1
  36. data/lib/capistrano/ops/rails/lib/backup/s3.rb +9 -8
  37. data/lib/capistrano/ops/rails/lib/backup.rb +2 -0
  38. data/lib/capistrano/ops/rails/lib/notification/api.rb +1 -1
  39. data/lib/capistrano/ops/rails/lib/notification/slack.rb +4 -4
  40. data/lib/capistrano/ops/rails/lib/notification/webhook.rb +4 -4
  41. data/lib/capistrano/ops/rails/lib/tasks/pg/dump.rake +3 -3
  42. data/lib/capistrano/ops/rails/lib/tasks/pg/postgres_helper.rb +3 -3
  43. data/lib/capistrano/ops/rails/lib/tasks/pg/remove_old_dumps.rake +1 -1
  44. data/lib/capistrano/ops/rails/lib/tasks/storage/backup.rake +1 -1
  45. data/lib/capistrano/ops/rails/lib/tasks/storage/remove_old_backups.rake +2 -2
  46. data/lib/capistrano/ops/rails/lib/tasks/storage/storage_helper.rb +5 -5
  47. data/lib/capistrano/ops/version.rb +1 -1
  48. data/lib/capistrano/ops/whenever.rb +2 -1
  49. data/lib/capistrano/ops/wkhtmltopdf/tasks/setup.rake +1 -0
  50. data/scripts/bump_version.rb +172 -0
  51. data/spec/capistrano/ops/version_spec.rb +9 -0
  52. data/spec/spec_helper.rb +20 -0
  53. metadata +92 -30
  54. data/.travis.yml +0 -13
  55. data/lib/capistrano/ops/capistrano/v3/tasks/backup.rake +0 -25
@@ -0,0 +1,172 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Version management script for Capistrano Ops Gem
5
+ # Usage: ruby scripts/bump_version.rb [patch|minor|major]
6
+
7
+ require 'fileutils'
8
+ require_relative '../lib/capistrano/ops/version'
9
+
10
+ class VersionBumper
11
+ VALID_TYPES = %w[patch minor major].freeze
12
+ VERSION_FILE = 'lib/capistrano/ops/version.rb'
13
+ CHANGELOG_FILE = 'CHANGELOG.md'
14
+
15
+ def initialize(bump_type)
16
+ @bump_type = bump_type.to_s.downcase
17
+ @current_version = Capistrano::Ops::VERSION
18
+ validate_bump_type!
19
+ end
20
+
21
+ def bump!
22
+ puts "Current version: #{@current_version}"
23
+
24
+ new_version = calculate_new_version
25
+ puts "New version: #{new_version}"
26
+
27
+ # Update version file
28
+ update_version_file(new_version)
29
+
30
+ # Update changelog
31
+ update_changelog(new_version)
32
+
33
+ # Create git commit
34
+ create_git_commit(new_version) if git_available?
35
+
36
+ puts 'Version bumped successfully!'
37
+ puts ''
38
+ puts '📋 Next steps:'
39
+ puts '1. Review the changes (git diff)'
40
+ puts '2. Fill in CHANGELOG.md with actual changes'
41
+ puts '3. Commit and tag:'
42
+ puts " git add #{VERSION_FILE} #{CHANGELOG_FILE}"
43
+ puts " git commit -m 'Release version #{new_version}'"
44
+ puts " git tag -a v#{new_version} -m 'Release version #{new_version}'"
45
+ puts '4. Push to GitHub:'
46
+ puts " git push origin main && git push origin v#{new_version}"
47
+ puts '5. Create GitHub Release:'
48
+ puts " gh release create v#{new_version} --title 'v#{new_version}' \\"
49
+ puts " --notes-file <(sed -n '/## \\[#{new_version}\\]/,/## \\[/p' CHANGELOG.md | sed '$d')"
50
+ puts ''
51
+ puts '→ GitHub Actions will automatically publish to RubyGems.org! 🚀'
52
+ end
53
+
54
+ private
55
+
56
+ def validate_bump_type!
57
+ return if VALID_TYPES.include?(@bump_type)
58
+
59
+ puts "Error: Invalid bump type '#{@bump_type}'"
60
+ puts "Valid types: #{VALID_TYPES.join(', ')}"
61
+ exit 1
62
+ end
63
+
64
+ def calculate_new_version
65
+ parts = @current_version.split('.').map(&:to_i)
66
+
67
+ case @bump_type
68
+ when 'patch'
69
+ parts[2] += 1
70
+ when 'minor'
71
+ parts[1] += 1
72
+ parts[2] = 0
73
+ when 'major'
74
+ parts[0] += 1
75
+ parts[1] = 0
76
+ parts[2] = 0
77
+ end
78
+
79
+ parts.join('.')
80
+ end
81
+
82
+ def update_version_file(new_version)
83
+ puts "Updating #{VERSION_FILE}..."
84
+
85
+ content = File.read(VERSION_FILE)
86
+ updated_content = content.gsub(
87
+ /VERSION = ['"][^'"]*['"]/,
88
+ "VERSION = '#{new_version}'"
89
+ )
90
+
91
+ File.write(VERSION_FILE, updated_content)
92
+ puts '✓ Version file updated'
93
+ end
94
+
95
+ def update_changelog(new_version)
96
+ return unless File.exist?(CHANGELOG_FILE)
97
+
98
+ puts "Updating #{CHANGELOG_FILE}..."
99
+
100
+ # Read existing changelog
101
+ content = File.read(CHANGELOG_FILE)
102
+
103
+ # Find the [Unreleased] section and replace it
104
+ lines = content.lines
105
+
106
+ today = Time.now.strftime('%Y-%m-%d')
107
+
108
+ # Replace [Unreleased] header with new version
109
+ unreleased_index = lines.find_index { |line| line.start_with?('## [Unreleased]') }
110
+
111
+ if unreleased_index
112
+ # Create new version entry
113
+ new_entry = [
114
+ "## [Unreleased]\n",
115
+ "\n",
116
+ "## [#{new_version}] - #{today}\n"
117
+ ]
118
+
119
+ # Replace [Unreleased] line
120
+ lines[unreleased_index] = new_entry.join
121
+
122
+ # Update comparison links at the bottom
123
+ # Find and update the [Unreleased] link
124
+ unreleased_link_index = lines.rindex { |line| line.start_with?('[Unreleased]:') }
125
+ if unreleased_link_index
126
+ # Update [Unreleased] to compare from new version to HEAD
127
+ lines[unreleased_link_index] = "[Unreleased]: https://github.com/zauberware/capistrano-ops/compare/v#{new_version}...HEAD\n"
128
+ # Add new version link
129
+ lines.insert(unreleased_link_index + 1, "[#{new_version}]: https://github.com/zauberware/capistrano-ops/releases/tag/v#{new_version}\n")
130
+ end
131
+ end
132
+
133
+ # Write back to file
134
+ File.write(CHANGELOG_FILE, lines.join)
135
+ puts '✓ Changelog updated (please fill in the release notes under the new version)'
136
+ end
137
+
138
+ def git_available?
139
+ system('git --version > /dev/null 2>&1')
140
+ end
141
+
142
+ def create_git_commit(new_version)
143
+ puts 'Creating git commit...'
144
+
145
+ # Add modified files
146
+ system("git add #{VERSION_FILE}")
147
+ system("git add #{CHANGELOG_FILE}") if File.exist?(CHANGELOG_FILE)
148
+
149
+ # Create commit
150
+ commit_message = "Bump version to #{new_version}"
151
+ if system("git commit -m '#{commit_message}'")
152
+ puts "✓ Git commit created: #{commit_message}"
153
+ else
154
+ puts '⚠ Failed to create git commit (you may need to commit manually)'
155
+ end
156
+ end
157
+ end
158
+
159
+ # Main execution
160
+ if ARGV.empty?
161
+ puts "Usage: #{$PROGRAM_NAME} [patch|minor|major]"
162
+ puts ''
163
+ puts 'Examples:'
164
+ puts " #{$PROGRAM_NAME} patch # 1.0.0 -> 1.0.1"
165
+ puts " #{$PROGRAM_NAME} minor # 1.0.0 -> 1.1.0"
166
+ puts " #{$PROGRAM_NAME} major # 1.0.0 -> 2.0.0"
167
+ exit 1
168
+ end
169
+
170
+ bump_type = ARGV[0]
171
+ bumper = VersionBumper.new(bump_type)
172
+ bumper.bump!
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Capistrano::Ops do
6
+ it 'has a version number' do
7
+ expect(Capistrano::Ops::VERSION).to match(/\A\d+\.\d+\.\d+\z/)
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'capistrano/ops/version'
4
+
5
+ RSpec.configure do |config|
6
+ config.expect_with :rspec do |expectations|
7
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
8
+ end
9
+
10
+ config.mock_with :rspec do |mocks|
11
+ mocks.verify_partial_doubles = true
12
+ end
13
+
14
+ config.shared_context_metadata_behavior = :apply_to_host_groups
15
+ config.disable_monkey_patching!
16
+ config.warnings = false
17
+ config.default_formatter = 'doc' if config.files_to_run.one?
18
+ config.order = :random
19
+ Kernel.srand config.seed
20
+ end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-ops
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.10
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Crusius
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-03-04 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: aws-sdk-s3
@@ -16,112 +15,172 @@ dependencies:
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
- version: '1.175'
18
+ version: '1.208'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - "~>"
25
24
  - !ruby/object:Gem::Version
26
- version: '1.175'
25
+ version: '1.208'
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: faraday
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - ">="
32
31
  - !ruby/object:Gem::Version
33
- version: '0'
32
+ version: '2.0'
33
+ - - "<"
34
+ - !ruby/object:Gem::Version
35
+ version: '3.0'
34
36
  type: :runtime
35
37
  prerelease: false
36
38
  version_requirements: !ruby/object:Gem::Requirement
37
39
  requirements:
38
40
  - - ">="
39
41
  - !ruby/object:Gem::Version
40
- version: '0'
42
+ version: '2.0'
43
+ - - "<"
44
+ - !ruby/object:Gem::Version
45
+ version: '3.0'
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: nokogiri
43
48
  requirement: !ruby/object:Gem::Requirement
44
49
  requirements:
45
50
  - - ">="
46
51
  - !ruby/object:Gem::Version
47
- version: '0'
52
+ version: '1.15'
48
53
  type: :runtime
49
54
  prerelease: false
50
55
  version_requirements: !ruby/object:Gem::Requirement
51
56
  requirements:
52
57
  - - ">="
53
58
  - !ruby/object:Gem::Version
54
- version: '0'
59
+ version: '1.15'
55
60
  - !ruby/object:Gem::Dependency
56
61
  name: rails
57
62
  requirement: !ruby/object:Gem::Requirement
58
63
  requirements:
59
64
  - - ">="
60
65
  - !ruby/object:Gem::Version
61
- version: '0'
66
+ version: '7.2'
67
+ - - "<"
68
+ - !ruby/object:Gem::Version
69
+ version: '9'
62
70
  type: :runtime
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
65
73
  requirements:
66
74
  - - ">="
67
75
  - !ruby/object:Gem::Version
68
- version: '0'
76
+ version: '7.2'
77
+ - - "<"
78
+ - !ruby/object:Gem::Version
79
+ version: '9'
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: bundler
82
+ requirement: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '2.4'
87
+ - - "<"
88
+ - !ruby/object:Gem::Version
89
+ version: '5'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '2.4'
97
+ - - "<"
98
+ - !ruby/object:Gem::Version
99
+ version: '5'
100
+ - !ruby/object:Gem::Dependency
101
+ name: bundler-audit
71
102
  requirement: !ruby/object:Gem::Requirement
72
103
  requirements:
73
104
  - - "~>"
74
105
  - !ruby/object:Gem::Version
75
- version: 2.4.12
106
+ version: '0.9'
76
107
  type: :development
77
108
  prerelease: false
78
109
  version_requirements: !ruby/object:Gem::Requirement
79
110
  requirements:
80
111
  - - "~>"
81
112
  - !ruby/object:Gem::Version
82
- version: 2.4.12
113
+ version: '0.9'
83
114
  - !ruby/object:Gem::Dependency
84
115
  name: rake
85
116
  requirement: !ruby/object:Gem::Requirement
86
117
  requirements:
87
118
  - - "~>"
88
119
  - !ruby/object:Gem::Version
89
- version: '12.3'
120
+ version: '13.0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '13.0'
128
+ - !ruby/object:Gem::Dependency
129
+ name: rspec
130
+ requirement: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: '3.0'
90
135
  type: :development
91
136
  prerelease: false
92
137
  version_requirements: !ruby/object:Gem::Requirement
93
138
  requirements:
94
139
  - - "~>"
95
140
  - !ruby/object:Gem::Version
96
- version: '12.3'
141
+ version: '3.0'
97
142
  - !ruby/object:Gem::Dependency
98
143
  name: rubocop
99
144
  requirement: !ruby/object:Gem::Requirement
100
145
  requirements:
101
146
  - - "~>"
102
147
  - !ruby/object:Gem::Version
103
- version: 1.56.2
148
+ version: '1.80'
149
+ type: :development
150
+ prerelease: false
151
+ version_requirements: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: '1.80'
156
+ - !ruby/object:Gem::Dependency
157
+ name: rubocop-rake
158
+ requirement: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - "~>"
161
+ - !ruby/object:Gem::Version
162
+ version: '0.7'
104
163
  type: :development
105
164
  prerelease: false
106
165
  version_requirements: !ruby/object:Gem::Requirement
107
166
  requirements:
108
167
  - - "~>"
109
168
  - !ruby/object:Gem::Version
110
- version: 1.56.2
169
+ version: '0.7'
111
170
  - !ruby/object:Gem::Dependency
112
- name: rubocop-performance
171
+ name: rubocop-rspec
113
172
  requirement: !ruby/object:Gem::Requirement
114
173
  requirements:
115
174
  - - "~>"
116
175
  - !ruby/object:Gem::Version
117
- version: 1.19.0
176
+ version: '3.0'
118
177
  type: :development
119
178
  prerelease: false
120
179
  version_requirements: !ruby/object:Gem::Requirement
121
180
  requirements:
122
181
  - - "~>"
123
182
  - !ruby/object:Gem::Version
124
- version: 1.19.0
183
+ version: '3.0'
125
184
  description: A collection of devops tasks for rails applications
126
185
  email:
127
186
  - florian@zauberware.com
@@ -131,10 +190,15 @@ executables:
131
190
  extensions: []
132
191
  extra_rdoc_files: []
133
192
  files:
193
+ - ".github/dependabot.yml"
194
+ - ".github/workflows/ci.yml"
195
+ - ".github/workflows/release.yml"
134
196
  - ".gitignore"
197
+ - ".rspec"
135
198
  - ".rubocop.yml"
199
+ - ".rubocop_todo.yml"
136
200
  - ".ruby-version"
137
- - ".travis.yml"
201
+ - CHANGELOG.md
138
202
  - Gemfile
139
203
  - LICENSE.txt
140
204
  - README.md
@@ -150,7 +214,6 @@ files:
150
214
  - lib/capistrano/ops/backup/tasks/storage/create.rake
151
215
  - lib/capistrano/ops/backup/tasks/storage/pull.rake
152
216
  - lib/capistrano/ops/capistrano.rb
153
- - lib/capistrano/ops/capistrano/v3/tasks/backup.rake
154
217
  - lib/capistrano/ops/figaro_yml.rb
155
218
  - lib/capistrano/ops/figaro_yml/helpers.rb
156
219
  - lib/capistrano/ops/figaro_yml/paths.rb
@@ -208,11 +271,14 @@ files:
208
271
  - lib/capistrano/ops/wkhtmltopdf.rb
209
272
  - lib/capistrano/ops/wkhtmltopdf/helpers.rb
210
273
  - lib/capistrano/ops/wkhtmltopdf/tasks/setup.rake
274
+ - scripts/bump_version.rb
275
+ - spec/capistrano/ops/version_spec.rb
276
+ - spec/spec_helper.rb
211
277
  homepage: https://github.com/zauberware/capistrano-ops
212
278
  licenses:
213
279
  - MIT
214
- metadata: {}
215
- post_install_message:
280
+ metadata:
281
+ rubygems_mfa_required: 'true'
216
282
  rdoc_options: []
217
283
  require_paths:
218
284
  - lib
@@ -220,18 +286,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
220
286
  requirements:
221
287
  - - ">="
222
288
  - !ruby/object:Gem::Version
223
- version: 2.7.0
224
- - - "<"
225
- - !ruby/object:Gem::Version
226
- version: 3.4.0
289
+ version: '3.2'
227
290
  required_rubygems_version: !ruby/object:Gem::Requirement
228
291
  requirements:
229
292
  - - ">="
230
293
  - !ruby/object:Gem::Version
231
294
  version: '0'
232
295
  requirements: []
233
- rubygems_version: 3.4.22
234
- signing_key:
296
+ rubygems_version: 3.6.9
235
297
  specification_version: 4
236
298
  summary: devops tasks for rails applications
237
299
  test_files: []
data/.travis.yml DELETED
@@ -1,13 +0,0 @@
1
- language: ruby
2
-
3
- before_install: gem install bundler
4
-
5
- rvm:
6
- - 2.4.6
7
- - 2.5.5
8
- - 2.6.3
9
- - jruby-9.2.6.0
10
-
11
- env:
12
- global:
13
- - JRUBY_OPTS=--debug
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'backup/backup_helper'
4
-
5
- namespace :backup do
6
- include BackupHelper
7
- # Default to :app role
8
- rake_roles = fetch(:rake_roles, :app)
9
-
10
- desc 'create a backup of the server database (deprecated, use backup:database:create instead)'
11
- task :create do
12
- on roles(rake_roles) do
13
- warn "deprecated: use 'backup:database:create' instead, in future versions this task will be removed"
14
- execute "#{prepare_env} BACKUPS_ENABLED=true EXTERNAL_BACKUP_ENABLED=false bundle exec rake pg:dump"
15
- end
16
- end
17
- desc 'pull latest database backups from server to local (deprecated, use backup:database:pull instead)'
18
- task :pull do
19
- on roles(rake_roles) do
20
- warn "deprecated: use 'backup:database:pull' instead, in future versions this task will be removed"
21
- backup_file = backup_file_name('database')
22
- download! "#{shared_path}/backups/#{backup_file}", backup_file
23
- end
24
- end
25
- end