patches 2.4.1 → 3.5.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +28 -0
- data/bin/console +0 -0
- data/docs/usage.md +22 -13
- data/lib/patches.rb +1 -0
- data/lib/patches/application_version_validation.rb +9 -0
- data/lib/patches/config.rb +11 -16
- data/lib/patches/notifier.rb +1 -11
- data/lib/patches/tenant_run_concern.rb +3 -2
- data/lib/patches/tenant_runner.rb +5 -1
- data/lib/patches/tenant_worker.rb +7 -2
- data/lib/patches/version.rb +4 -1
- data/lib/patches/worker.rb +7 -2
- data/lib/tasks/patches.rake +4 -1
- data/patches.gemspec +1 -2
- metadata +6 -21
- data/script/buildkite.sh +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 00a5a2af4415f00b094e7a41da3c17ddb61d17c9e23987aa16dddf789aec7794
|
4
|
+
data.tar.gz: 3125f98fb50e54c658a2be70a369f2627c138fb50c1ba8f9c417c5139a144f56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d57ccb9aca3ab7c179dce484a7e2021631ef0c70d86bc00f73c921636184d42e372a85a6ab321e599731c72dfcf40716b52a234d7c33bebb9ba8d102d64ba212
|
7
|
+
data.tar.gz: ed55b40b2ebb05dc6db25c7ccc07a09f774360816fe39a21e1b79903c306bcdd4a4a5b82b2db262966224e1f712656b8eac7bb423f93db004d59d63af26a6763
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,34 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [3.5.0] - 2020-07-22
|
10
|
+
### Added
|
11
|
+
- Enable application version constraint support on `Patches::TenantWorker`
|
12
|
+
|
13
|
+
## [3.4.0] - 2020-07-22
|
14
|
+
### Added
|
15
|
+
- `Patches::TenantWorker` application version constraint forward compatibility
|
16
|
+
|
17
|
+
## [3.3.0] - 2020-07-20
|
18
|
+
### Added
|
19
|
+
- Application version constraints
|
20
|
+
|
21
|
+
## [3.2.0] - 2020-07-16
|
22
|
+
### Added
|
23
|
+
- Added `Patches::Worker` extra parameters to support forward compatibility with the upcoming releases
|
24
|
+
|
25
|
+
## [3.1.0] - 2019-11-25
|
26
|
+
### Fixed
|
27
|
+
- Gem compatibility with Apartment 2
|
28
|
+
|
29
|
+
## [3.0.1] - 2018-11-19
|
30
|
+
### Added
|
31
|
+
- Set icon_emoji of posted slack message to :dog:
|
32
|
+
|
33
|
+
## [3.0.0] - 2018-11-19
|
34
|
+
### Removed
|
35
|
+
- Hipchat is no longer supported
|
36
|
+
|
9
37
|
## [2.4.1] - 2018-09-19
|
10
38
|
### Changed
|
11
39
|
- Corrected gem ownership and authors.
|
data/bin/console
CHANGED
File without changes
|
data/docs/usage.md
CHANGED
@@ -23,21 +23,13 @@ bundle exec rake db:migrate
|
|
23
23
|
## Configuration
|
24
24
|
|
25
25
|
If you would like to run the patches asynchronously, or would like them to notify
|
26
|
-
your
|
26
|
+
your Slack channel when they fail or succeed, you need to set up
|
27
27
|
an initializer to set those options.
|
28
28
|
|
29
|
-
```
|
29
|
+
```ruby
|
30
30
|
Patches::Config.configure do |config|
|
31
31
|
config.use_sidekiq = true
|
32
32
|
|
33
|
-
config.use_hipchat = true
|
34
|
-
config.hipchat_options = {
|
35
|
-
api_token: ENV['HIPCHAT_TOKEN'],
|
36
|
-
room: ENV['HIPCHAT_ROOM'],
|
37
|
-
user: ENV['HIPCHAT_USERNAME'], # maximum of 15 characters
|
38
|
-
api_version: 'v1', # optional
|
39
|
-
}
|
40
|
-
|
41
33
|
config.use_slack = true
|
42
34
|
config.slack_options = {
|
43
35
|
webhook_url: ENV['SLACK_WEBHOOK_URL'],
|
@@ -52,7 +44,7 @@ end
|
|
52
44
|
If you are using the Apartment gem, you can run the patches for each tenant in parallel.
|
53
45
|
Just set the config ```sidekiq_parallel``` to ```true``` and you're good to go.
|
54
46
|
|
55
|
-
```
|
47
|
+
```ruby
|
56
48
|
Patches::Config.configure do |config|
|
57
49
|
config.use_sidekiq = true
|
58
50
|
config.sidekiq_parallel = true
|
@@ -62,6 +54,23 @@ end
|
|
62
54
|
*Note:* Make sure your sidekiq queue is able to process concurrent jobs.
|
63
55
|
You can use ```config.sidekiq_options``` to customise it.
|
64
56
|
|
57
|
+
### Application version verification
|
58
|
+
|
59
|
+
In environments where a rolling update of sidekiq workers is performed during the deployment, multiple versions of the application run at the same time. If a Patches job is scheduled by the new application version during the rolling update, there is a possibility that it can be executed by the old application version, which will not have all the required patch files.
|
60
|
+
|
61
|
+
To prevent this case, set the application version in the config:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
Patches::Config.configure do |config|
|
65
|
+
revision_file_path = Rails.root.join('REVISION')
|
66
|
+
|
67
|
+
if File.exist?(revision_file_path)
|
68
|
+
config.application_version = File.read(revision_file_path)
|
69
|
+
config.retry_after_version_mismatch_in = 1.minute
|
70
|
+
end
|
71
|
+
end
|
72
|
+
```
|
73
|
+
|
65
74
|
## Creating Patches
|
66
75
|
|
67
76
|
Generate a patch
|
@@ -84,7 +93,7 @@ update the run method and then execute
|
|
84
93
|
|
85
94
|
Generate patch with specs
|
86
95
|
|
87
|
-
```
|
96
|
+
```bash
|
88
97
|
bundle exec rails g patches:patch PreferenceUpdate --specs=true
|
89
98
|
```
|
90
99
|
|
@@ -116,7 +125,7 @@ after sidekiq restarts, otherwise there is no guarentee the tasks will run.
|
|
116
125
|
If a patch requires data assets, you could use S3 to store the file.
|
117
126
|
If credentials are defined in env vars, as per https://docs.aws.amazon.com/cli/latest/topic/config-vars.html#id1
|
118
127
|
|
119
|
-
```
|
128
|
+
```ruby
|
120
129
|
require 'aws-sdk-s3'
|
121
130
|
Aws::S3::Client.new.get_object(bucket: @bucket_name, key: filename, response_target: destination)
|
122
131
|
```
|
data/lib/patches.rb
CHANGED
@@ -22,6 +22,7 @@ end
|
|
22
22
|
require "patches/base"
|
23
23
|
require "patches/config"
|
24
24
|
require "patches/tenant_run_concern"
|
25
|
+
require "patches/application_version_validation"
|
25
26
|
require "patches/tenant_worker" if defined?(Sidekiq)
|
26
27
|
require "patches/engine" if defined?(Rails)
|
27
28
|
require "patches/patch"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Patches
|
2
|
+
module ApplicationVersionValidation
|
3
|
+
def valid_application_version?(application_version)
|
4
|
+
return true unless application_version
|
5
|
+
return true unless Patches::Config.configuration.application_version
|
6
|
+
Patches::Config.configuration.application_version == application_version
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
data/lib/patches/config.rb
CHANGED
@@ -14,8 +14,15 @@ module Patches
|
|
14
14
|
end
|
15
15
|
|
16
16
|
class Configuration
|
17
|
-
attr_accessor
|
18
|
-
:
|
17
|
+
attr_accessor \
|
18
|
+
:application_version,
|
19
|
+
:retry_after_version_mismatch_in,
|
20
|
+
:sidekiq_options,
|
21
|
+
:sidekiq_parallel,
|
22
|
+
:sidekiq_queue,
|
23
|
+
:slack_options,
|
24
|
+
:use_sidekiq,
|
25
|
+
:use_slack
|
19
26
|
|
20
27
|
def initialize
|
21
28
|
@sidekiq_queue = 'default'
|
@@ -25,20 +32,8 @@ module Patches
|
|
25
32
|
@sidekiq_options ||= { retry: false, queue: sidekiq_queue }
|
26
33
|
end
|
27
34
|
|
28
|
-
def
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
def hipchat_init_options
|
33
|
-
hipchat_options.except(:api_token, :room, :user)
|
34
|
-
end
|
35
|
-
|
36
|
-
def hipchat_room
|
37
|
-
hipchat_options[:room]
|
38
|
-
end
|
39
|
-
|
40
|
-
def hipchat_user
|
41
|
-
hipchat_options[:user]
|
35
|
+
def retry_after_version_mismatch_in
|
36
|
+
@retry_after_version_mismatch_in ||= 1.minute
|
42
37
|
end
|
43
38
|
|
44
39
|
def slack_channel
|
data/lib/patches/notifier.rb
CHANGED
@@ -3,12 +3,10 @@ require 'slack-notifier'
|
|
3
3
|
class Patches::Notifier
|
4
4
|
class << self
|
5
5
|
def notify_success(patches)
|
6
|
-
send_hipchat_message(success_message(patches), color: 'green')
|
7
6
|
send_slack_message(success_message(patches), 'good')
|
8
7
|
end
|
9
8
|
|
10
9
|
def notify_failure(patch_path, error)
|
11
|
-
send_hipchat_message(failure_message(patch_path, error), color: 'red')
|
12
10
|
send_slack_message(failure_message(patch_path, error), 'danger')
|
13
11
|
end
|
14
12
|
|
@@ -32,14 +30,6 @@ class Patches::Notifier
|
|
32
30
|
message
|
33
31
|
end
|
34
32
|
|
35
|
-
def send_hipchat_message(message, options)
|
36
|
-
return unless defined?(HipChat) && config.use_hipchat
|
37
|
-
|
38
|
-
client = HipChat::Client.new(config.hipchat_api_token, config.hipchat_init_options)
|
39
|
-
room = client[config.hipchat_room]
|
40
|
-
room.send(config.hipchat_user, message, options)
|
41
|
-
end
|
42
|
-
|
43
33
|
def send_slack_message(message, color)
|
44
34
|
return unless defined?(Slack) && config.use_slack
|
45
35
|
|
@@ -48,7 +38,7 @@ class Patches::Notifier
|
|
48
38
|
channel: config.slack_channel,
|
49
39
|
username: config.slack_username)
|
50
40
|
|
51
|
-
payload = { attachments: [{ color: color, text: message }] }
|
41
|
+
payload = { icon_emoji: ":dog:", attachments: [{ color: color, text: message }] }
|
52
42
|
|
53
43
|
notifier.post payload
|
54
44
|
end
|
@@ -11,7 +11,11 @@ class Patches::TenantRunner
|
|
11
11
|
Patches.logger.info("Patches tenant runner for: #{tenants.join(',')}")
|
12
12
|
tenants.each do |tenant|
|
13
13
|
if parallel?
|
14
|
-
Patches::TenantWorker.perform_async(
|
14
|
+
Patches::TenantWorker.perform_async(
|
15
|
+
tenant,
|
16
|
+
path,
|
17
|
+
application_version: Patches::Config.configuration.application_version
|
18
|
+
)
|
15
19
|
else
|
16
20
|
run(tenant, path)
|
17
21
|
end
|
@@ -3,10 +3,15 @@ require 'sidekiq'
|
|
3
3
|
class Patches::TenantWorker
|
4
4
|
include Sidekiq::Worker
|
5
5
|
include Patches::TenantRunConcern
|
6
|
+
include Patches::ApplicationVersionValidation
|
6
7
|
|
7
8
|
sidekiq_options Patches::Config.configuration.sidekiq_options
|
8
9
|
|
9
|
-
def perform(tenant_name, path)
|
10
|
-
|
10
|
+
def perform(tenant_name, path, params = {})
|
11
|
+
if valid_application_version?(params['application_version'])
|
12
|
+
run(tenant_name, path)
|
13
|
+
else
|
14
|
+
self.class.perform_in(Patches::Config.configuration.retry_after_version_mismatch_in, tenant_name, path, params)
|
15
|
+
end
|
11
16
|
end
|
12
17
|
end
|
data/lib/patches/version.rb
CHANGED
data/lib/patches/worker.rb
CHANGED
@@ -2,10 +2,15 @@ require 'sidekiq'
|
|
2
2
|
|
3
3
|
class Patches::Worker
|
4
4
|
include Sidekiq::Worker
|
5
|
+
include Patches::ApplicationVersionValidation
|
5
6
|
|
6
7
|
sidekiq_options Patches::Config.configuration.sidekiq_options
|
7
8
|
|
8
|
-
def perform(runner)
|
9
|
-
|
9
|
+
def perform(runner, params = {})
|
10
|
+
if valid_application_version?(params['application_version'])
|
11
|
+
runner.constantize.new.perform
|
12
|
+
else
|
13
|
+
self.class.perform_in(Patches::Config.configuration.retry_after_version_mismatch_in, runner, params)
|
14
|
+
end
|
10
15
|
end
|
11
16
|
end
|
data/lib/tasks/patches.rake
CHANGED
@@ -8,7 +8,10 @@ namespace :patches do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
if defined?(Sidekiq) && Patches::Config.configuration.use_sidekiq
|
11
|
-
Patches::Worker.perform_async(
|
11
|
+
Patches::Worker.perform_async(
|
12
|
+
runner,
|
13
|
+
application_version: Patches::Config.configuration.application_version
|
14
|
+
)
|
12
15
|
else
|
13
16
|
runner.new.perform
|
14
17
|
end
|
data/patches.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.8"
|
26
26
|
spec.add_development_dependency "rake", "~> 10.0"
|
27
27
|
spec.add_development_dependency "sqlite3", "~> 1.3.5"
|
28
|
-
spec.add_development_dependency "rspec-rails", "~>
|
28
|
+
spec.add_development_dependency "rspec-rails", "~> 4.0.0"
|
29
29
|
spec.add_development_dependency "capybara", "~> 2.3.0"
|
30
30
|
spec.add_development_dependency "generator_spec", "~> 0.9.0"
|
31
31
|
spec.add_development_dependency "simplecov", "~> 0.10"
|
@@ -34,7 +34,6 @@ Gem::Specification.new do |spec|
|
|
34
34
|
spec.add_development_dependency "database_cleaner", "~> 1.3.0"
|
35
35
|
spec.add_development_dependency "pry"
|
36
36
|
spec.add_development_dependency "sidekiq", "~> 3.4.1"
|
37
|
-
spec.add_development_dependency "hipchat"
|
38
37
|
spec.add_development_dependency "webmock"
|
39
38
|
spec.add_development_dependency "byebug"
|
40
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: patches
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- JobReady
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 4.0.0
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 4.0.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: capybara
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,20 +206,6 @@ dependencies:
|
|
206
206
|
- - "~>"
|
207
207
|
- !ruby/object:Gem::Version
|
208
208
|
version: 3.4.1
|
209
|
-
- !ruby/object:Gem::Dependency
|
210
|
-
name: hipchat
|
211
|
-
requirement: !ruby/object:Gem::Requirement
|
212
|
-
requirements:
|
213
|
-
- - ">="
|
214
|
-
- !ruby/object:Gem::Version
|
215
|
-
version: '0'
|
216
|
-
type: :development
|
217
|
-
prerelease: false
|
218
|
-
version_requirements: !ruby/object:Gem::Requirement
|
219
|
-
requirements:
|
220
|
-
- - ">="
|
221
|
-
- !ruby/object:Gem::Version
|
222
|
-
version: '0'
|
223
209
|
- !ruby/object:Gem::Dependency
|
224
210
|
name: webmock
|
225
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -275,6 +261,7 @@ files:
|
|
275
261
|
- lib/generators/patches/templates/patch.rb.erb
|
276
262
|
- lib/generators/patches/templates/patch_spec.rb.erb
|
277
263
|
- lib/patches.rb
|
264
|
+
- lib/patches/application_version_validation.rb
|
278
265
|
- lib/patches/base.rb
|
279
266
|
- lib/patches/capistrano.rb
|
280
267
|
- lib/patches/capistrano/tasks.rake
|
@@ -291,7 +278,6 @@ files:
|
|
291
278
|
- lib/patches/worker.rb
|
292
279
|
- lib/tasks/patches.rake
|
293
280
|
- patches.gemspec
|
294
|
-
- script/buildkite.sh
|
295
281
|
homepage: http://github.com/jobready/patches
|
296
282
|
licenses:
|
297
283
|
- MIT
|
@@ -311,8 +297,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
311
297
|
- !ruby/object:Gem::Version
|
312
298
|
version: '0'
|
313
299
|
requirements: []
|
314
|
-
|
315
|
-
rubygems_version: 2.7.6
|
300
|
+
rubygems_version: 3.0.3
|
316
301
|
signing_key:
|
317
302
|
specification_version: 4
|
318
303
|
summary: A simple gem for one off tasks
|
data/script/buildkite.sh
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
set -e
|
3
|
-
|
4
|
-
echo '--- setting ruby version'
|
5
|
-
cd /var/lib/buildkite-agent/.rbenv/plugins/ruby-build && git pull && cd -
|
6
|
-
rbenv install 2.3.7 -s
|
7
|
-
rbenv local 2.3.7
|
8
|
-
|
9
|
-
echo '--- setting up env'
|
10
|
-
REVISION=https://github.com/$BUILDBOX_PROJECT_SLUG/commit/$BUILDBOX_COMMIT
|
11
|
-
|
12
|
-
echo '--- bundling'
|
13
|
-
bundle install -j $(nproc) --without production --quiet
|
14
|
-
|
15
|
-
echo '--- running specs'
|
16
|
-
if bundle exec rspec; then
|
17
|
-
echo "[Successful] $BUILDBOX_PROJECT_SLUG - Build - $BUILDBOX_BUILD_URL - Commit - $REVISION" | hipchat_room_message -t $HIPCHAT_TOKEN -r $HIPCHAT_ROOM -f "Buildbox" -c "green"
|
18
|
-
else
|
19
|
-
echo "[Failed] Build $BUILDBOX_PROJECT_SLUG - Build - $BUILDBOX_BUILD_URL - Commit - $REVISION" | hipchat_room_message -t $HIPCHAT_TOKEN -r $HIPCHAT_ROOM -f "Buildbox" -c "red"
|
20
|
-
exit 1;
|
21
|
-
fi
|