pact_broker 1.18.0.beta.1 → 1.18.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 +4 -2
- data/README.md +12 -12
- data/example/{heroku → basic_auth}/Gemfile +0 -0
- data/example/{heroku → basic_auth}/Procfile +0 -0
- data/example/{heroku → basic_auth}/README.md +1 -1
- data/example/basic_auth/config.ru +19 -0
- data/example/config.ru +0 -2
- data/lib/pact_broker/api/decorators/versions_decorator.rb +1 -1
- data/lib/pact_broker/api/resources/versions.rb +1 -1
- data/lib/pact_broker/app.rb +7 -6
- data/lib/pact_broker/configuration.rb +4 -42
- data/lib/pact_broker/domain/order_versions.rb +15 -5
- data/lib/pact_broker/domain/webhook.rb +0 -1
- data/lib/pact_broker/domain/webhook_request.rb +6 -4
- data/lib/pact_broker/logging.rb +4 -0
- data/lib/pact_broker/pacticipants/repository.rb +2 -1
- data/lib/pact_broker/pacticipants/service.rb +2 -2
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/webhooks/job.rb +46 -0
- data/lib/pact_broker/webhooks/service.rb +9 -8
- data/lib/pact_broker/webhooks/webhook.rb +1 -1
- data/pact_broker.gemspec +2 -1
- data/pact_broker_client-pact_broker.json +4 -4
- data/script/foo-bar.json +22 -0
- data/script/publish-new.sh +7 -0
- data/script/publish.sh +2 -2
- data/script/recreate-pg-db.sh +7 -0
- data/spec/fixtures/a_consumer-a_provider-2.json +1 -1
- data/spec/fixtures/a_consumer-a_provider-3.json +1 -1
- data/spec/fixtures/a_consumer-a_provider-conflict.json +1 -1
- data/spec/fixtures/a_consumer-a_provider-merged.json +2 -2
- data/spec/fixtures/a_consumer-a_provider.json +1 -1
- data/spec/fixtures/consumer-provider.json +1 -1
- data/spec/fixtures/renderer_pact.json +1 -1
- data/spec/lib/pact_broker/configuration_spec.rb +2 -22
- data/spec/lib/pact_broker/domain/order_versions_spec.rb +30 -10
- data/spec/lib/pact_broker/domain/webhook_request_spec.rb +3 -1
- data/spec/lib/pact_broker/pacticipants/repository_spec.rb +16 -0
- data/spec/lib/pact_broker/webhooks/job_spec.rb +67 -0
- data/spec/lib/pact_broker/webhooks/service_spec.rb +40 -3
- data/spec/support/provider_state_builder.rb +36 -8
- metadata +29 -12
- data/example/heroku/config.ru +0 -12
- data/lib/pact_broker/configuration/configure_basic_auth.rb +0 -83
- data/spec/lib/pact_broker/configuration/configure_basic_auth_spec.rb +0 -267
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7ef22c7934452713d713906de14fade4ecc2a2c8
|
|
4
|
+
data.tar.gz: e20f94e91cd30b71fde2c80393861342e989a33f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b5be0a05dd839aef2b0da83d95f7ea58c0c9934ec6e59162a726fa21c3c9f7f795090f05071506df821ff2a930557a1649111f951ec7321a008faed5f59ea2de
|
|
7
|
+
data.tar.gz: 1fb67c57f5491571a02d096e0243bd20c43f64faf1a5245457743c71663a002ee3c91dd59355ea863164025ef22ca6840c38d226ec324b40d69c237da5bbddae
|
data/CHANGELOG.md
CHANGED
|
@@ -2,8 +2,10 @@ Do this to generate your change history
|
|
|
2
2
|
|
|
3
3
|
$ git log --pretty=format:' * %h - %s (%an, %ad)' vX.Y.Z..HEAD
|
|
4
4
|
|
|
5
|
-
#### 1.18.0
|
|
6
|
-
*
|
|
5
|
+
#### 1.18.0 (2017-05-09)
|
|
6
|
+
* 397060b - Display application versions in reverse order in the Versions resource. (Beth Skurrie, Tue May 9 13:59:54 2017 +1000)
|
|
7
|
+
* 251c878 - Allow application versions to be ordered by creation date where no consistent orderable object can be extracted from the consumer application version. (Beth Skurrie, Tue May 9 13:22:36 2017 +1000)
|
|
8
|
+
* 68bb6d9 - Execute webhooks using sucker punch. (Beth Skurrie, Mon May 8 10:32:45 2017 +1000)
|
|
7
9
|
|
|
8
10
|
#### 1.17.2 (2017-05-04)
|
|
9
11
|
* b8f45e1 - fix issue with pact document link not displaying #94 (Matt Fellows, Wed May 3 11:23:09 2017 +1000)
|
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Pact Broker
|
|
2
2
|
|
|
3
|
-
[](https://travis-ci.org/pact-foundation/pact_broker) [](https://gitter.im/pact-foundation/pact_broker?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
|
4
4
|
|
|
5
5
|
The Pact Broker provides a repository for consumer driven contracts created using the pact gem.
|
|
6
6
|
|
|
@@ -23,7 +23,7 @@ Features:
|
|
|
23
23
|
* Tracks changes between Pact versions so you can tell when a consumer has changed its expectations.
|
|
24
24
|
* [Docker Pact Broker][docker]
|
|
25
25
|
|
|
26
|
-
Travis CI Status: [](https://travis-ci.org/pact-foundation/pact_broker)
|
|
27
27
|
|
|
28
28
|
### How would I use the Pact Broker?
|
|
29
29
|
|
|
@@ -41,47 +41,47 @@ If you don't have a [Pact Broker CI Nerf Gun][nerf], you'll probably want to rea
|
|
|
41
41
|
|
|
42
42
|
## Documentation
|
|
43
43
|
|
|
44
|
-
See the [Pact Broker Client](https://github.com/
|
|
44
|
+
See the [Pact Broker Client](https://github.com/pact-foundation/pact_broker-client) for documentation on how to publish a pact to the Pact Broker, and configure the URLs in the provider project.
|
|
45
45
|
|
|
46
|
-
See the [wiki](https://github.com/
|
|
46
|
+
See the [wiki](https://github.com/pact-foundation/pact_broker/wiki) for documentation related to the Pact Broker itself.
|
|
47
47
|
|
|
48
48
|
### Screenshots
|
|
49
49
|
|
|
50
50
|
#### Index
|
|
51
51
|
|
|
52
52
|
* * *
|
|
53
|
-
<img src="https://raw.githubusercontent.com/wiki/
|
|
53
|
+
<img src="https://raw.githubusercontent.com/wiki/pact-foundation/pact_broker/images/index.png"/>
|
|
54
54
|
|
|
55
55
|
#### Autogenerated documentation
|
|
56
56
|
|
|
57
57
|
Paste the pact URL into a browser to view a HTML version of the pact.
|
|
58
58
|
* * *
|
|
59
|
-
<img src="https://raw.githubusercontent.com/wiki/
|
|
59
|
+
<img src="https://raw.githubusercontent.com/wiki/pact-foundation/pact_broker/images/autogenerated_documentation.png"/>
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
#### Network diagram
|
|
63
63
|
|
|
64
64
|
* * *
|
|
65
|
-
<img src="https://raw.githubusercontent.com/wiki/
|
|
65
|
+
<img src="https://raw.githubusercontent.com/wiki/pact-foundation/pact_broker/images/network_diagram.png"/>
|
|
66
66
|
|
|
67
67
|
#### HAL browser
|
|
68
68
|
|
|
69
69
|
Use the embedded HAL browser to navigate the API.
|
|
70
70
|
* * *
|
|
71
|
-
<img src="https://raw.githubusercontent.com/wiki/
|
|
71
|
+
<img src="https://raw.githubusercontent.com/wiki/pact-foundation/pact_broker/images/hal_browser.png"/>
|
|
72
72
|
|
|
73
73
|
#### HAL documentation
|
|
74
74
|
|
|
75
75
|
Use the HAL browser to view documentation as you browse.
|
|
76
76
|
* * *
|
|
77
|
-
<img src="https://raw.githubusercontent.com/wiki/
|
|
77
|
+
<img src="https://raw.githubusercontent.com/wiki/pact-foundation/pact_broker/images/hal_documentation.png"/>
|
|
78
78
|
|
|
79
79
|
## Usage
|
|
80
80
|
|
|
81
81
|
### To have a play around on your local machine
|
|
82
82
|
|
|
83
83
|
* Install ruby 2.2.0 or later and bundler >= 1.12.0
|
|
84
|
-
* Run `git clone git@github.com:
|
|
84
|
+
* Run `git clone git@github.com:pact-foundation/pact_broker.git && cd pact_broker/example`
|
|
85
85
|
* Run `bundle`
|
|
86
86
|
* Run `bundle exec rackup -p 8080`
|
|
87
87
|
* Open [http://localhost:8080](http://localhost:8080) and you should see a list containing the pact between the Zoo App and the Animal Service.
|
|
@@ -100,7 +100,7 @@ the [Hosted Pact Broker](https://pact.dius.com.au/?utm_source=github&utm_campaig
|
|
|
100
100
|
You can use the [Pact Broker Docker container][docker] or [Terraform on AWS][terraform] or to roll your own...
|
|
101
101
|
|
|
102
102
|
* Create a database using a product that is supported by the Sequel gem (listed on this page http://sequel.jeremyevans.net/rdoc/files/README_rdoc.html). The migrations have been tested on MySQL and PostgreSQL - your mileage will vary on other databases.
|
|
103
|
-
* __Note:__ It is recommended to use __PostgreSQL__ as it will support JSON search features that are planned in a future release, however MySQL the other [semi supported](https://github.com/
|
|
103
|
+
* __Note:__ It is recommended to use __PostgreSQL__ as it will support JSON search features that are planned in a future release, however MySQL the other [semi supported](https://github.com/pact-foundation/pact_broker/issues/33) database.
|
|
104
104
|
* Install ruby 2.2.0 or later and bundler >= 1.12.0
|
|
105
105
|
* Copy the [example](/example) directory to the location you want to install the application.
|
|
106
106
|
* Modify the config.ru and Gemfile as desired (eg. choose database driver gem, set your database credentials. Use the "pg" gem if using Postgres.)
|
|
@@ -110,7 +110,7 @@ You can use the [Pact Broker Docker container][docker] or [Terraform on AWS][ter
|
|
|
110
110
|
|
|
111
111
|
[decouple]: http://techblog.realestate.com.au/enter-the-pact-matrix-or-how-to-decouple-the-release-cycles-of-your-microservices/
|
|
112
112
|
[pact]: https://github.com/realestate-com-au/pact
|
|
113
|
-
[nerf]: https://github.com/
|
|
113
|
+
[nerf]: https://github.com/pact-foundation/pact_broker/wiki/pact-broker-ci-nerf-gun
|
|
114
114
|
[different-teams]: https://github.com/realestate-com-au/pact/wiki/Using-pact-where-the-consumer-team-is-different-from-the-provider-team
|
|
115
115
|
[docker]: https://hub.docker.com/r/dius/pact-broker
|
|
116
116
|
[terraform]: https://github.com/nadnerb/terraform-pact-broker
|
|
File without changes
|
|
File without changes
|
|
@@ -27,7 +27,7 @@ $ git push heroku master
|
|
|
27
27
|
Your Pact Broker instance is now available!
|
|
28
28
|
|
|
29
29
|
## Publish consumer pacts - consumer side
|
|
30
|
-
You will need to set these environment variables with your basic auth credentials
|
|
30
|
+
You will need to set these environment variables with your basic auth credentials
|
|
31
31
|
```
|
|
32
32
|
export PACT_BROKER_USERNAME=admin
|
|
33
33
|
export PACT_BROKER_PASSWORD=changeme
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'logger'
|
|
3
|
+
require 'sequel'
|
|
4
|
+
require 'pact_broker'
|
|
5
|
+
require 'pg'
|
|
6
|
+
|
|
7
|
+
use Rack::Auth::Basic, "Restricted Area" do |username, password|
|
|
8
|
+
username == ENV['PACT_BROKER_USERNAME'] and password == ENV['PACT_BROKER_PASSWORD']
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
app = PactBroker::App.new do | config |
|
|
12
|
+
# change these from their default values if desired
|
|
13
|
+
# config.log_dir = "./log"
|
|
14
|
+
# config.auto_migrate_db = true
|
|
15
|
+
# config.use_hal_browser = true
|
|
16
|
+
config.database_connection = Sequel.connect(ENV['DATABASE_URL'], adapter: "postgres", encoding: 'utf8')
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
run app
|
data/example/config.ru
CHANGED
|
@@ -27,8 +27,6 @@ app = PactBroker::App.new do | config |
|
|
|
27
27
|
# config.use_hal_browser = true
|
|
28
28
|
config.database_connection = Sequel.connect(DATABASE_CREDENTIALS.merge(:logger => config.logger))
|
|
29
29
|
config.database_connection.timezone = :utc
|
|
30
|
-
# See configuration section of wiki for more basic auth configuration options
|
|
31
|
-
# config.protect_with_basic_auth :app_read, {username: 'username', password: 'password'}
|
|
32
30
|
end
|
|
33
31
|
|
|
34
32
|
run app
|
data/lib/pact_broker/app.rb
CHANGED
|
@@ -3,7 +3,7 @@ require 'pact_broker/db'
|
|
|
3
3
|
require 'pact_broker/project_root'
|
|
4
4
|
require 'rack/hal_browser'
|
|
5
5
|
require 'rack/pact_broker/convert_file_extension_to_accept_header'
|
|
6
|
-
require '
|
|
6
|
+
require 'sucker_punch'
|
|
7
7
|
|
|
8
8
|
module PactBroker
|
|
9
9
|
|
|
@@ -33,6 +33,7 @@ module PactBroker
|
|
|
33
33
|
PactBroker::DB.connection = configuration.database_connection
|
|
34
34
|
PactBroker::DB.connection.timezone = :utc
|
|
35
35
|
PactBroker::DB.validate_connection_config if configuration.validate_database_connection_config
|
|
36
|
+
SuckerPunch.logger = configuration.logger
|
|
36
37
|
|
|
37
38
|
if configuration.auto_migrate_db
|
|
38
39
|
logger.info "Migrating database"
|
|
@@ -71,12 +72,12 @@ module PactBroker
|
|
|
71
72
|
apps << PactBroker::UI::App.new
|
|
72
73
|
apps << PactBroker::API
|
|
73
74
|
|
|
74
|
-
cascade = Rack::Cascade.new(apps)
|
|
75
|
-
app_with_basic_auth = PactBroker::Configuration::ConfigureBasicAuth.call(cascade, configuration)
|
|
76
|
-
|
|
77
75
|
@app.map "/" do
|
|
78
|
-
run
|
|
76
|
+
run Rack::Cascade.new(apps)
|
|
79
77
|
end
|
|
78
|
+
|
|
80
79
|
end
|
|
80
|
+
|
|
81
81
|
end
|
|
82
|
-
|
|
82
|
+
|
|
83
|
+
end
|
|
@@ -4,33 +4,13 @@ module PactBroker
|
|
|
4
4
|
@@configuration ||= Configuration.default_configuration
|
|
5
5
|
end
|
|
6
6
|
|
|
7
|
-
def self.reset_configuration
|
|
8
|
-
@@configuration = Configuration.default_configuration
|
|
9
|
-
end
|
|
10
|
-
|
|
11
7
|
class Configuration
|
|
12
8
|
|
|
13
|
-
REQUEST_METHOD = 'REQUEST_METHOD'.freeze
|
|
14
|
-
GET = 'GET'.freeze
|
|
15
|
-
PATH_INFO = 'PATH_INFO'.freeze
|
|
16
|
-
DIAGNOSTIC = '/diagnostic/'.freeze
|
|
17
|
-
|
|
18
9
|
attr_accessor :log_dir, :database_connection, :auto_migrate_db, :use_hal_browser, :html_pact_renderer
|
|
19
10
|
attr_accessor :validate_database_connection_config, :enable_diagnostic_endpoints, :version_parser
|
|
20
|
-
attr_accessor :use_case_sensitive_resource_names, :
|
|
11
|
+
attr_accessor :use_case_sensitive_resource_names, :order_versions_by_date
|
|
21
12
|
attr_writer :logger
|
|
22
13
|
|
|
23
|
-
def initialize
|
|
24
|
-
@basic_auth_config = {}
|
|
25
|
-
@basic_auth_predicates = [
|
|
26
|
-
[:diagnostic, ->(env) { env[PATH_INFO].start_with? DIAGNOSTIC }],
|
|
27
|
-
[:app, ->(env) { !env[PATH_INFO].start_with? DIAGNOSTIC } ],
|
|
28
|
-
[:app_read, ->(env) { env[REQUEST_METHOD] == GET }],
|
|
29
|
-
[:app_write, ->(env) { env[REQUEST_METHOD] != GET }],
|
|
30
|
-
[:all, ->(env) { true }]
|
|
31
|
-
]
|
|
32
|
-
end
|
|
33
|
-
|
|
34
14
|
def logger
|
|
35
15
|
@logger ||= create_logger log_path
|
|
36
16
|
end
|
|
@@ -46,10 +26,12 @@ module PactBroker
|
|
|
46
26
|
config.use_case_sensitive_resource_names = true
|
|
47
27
|
config.html_pact_renderer = default_html_pact_render
|
|
48
28
|
config.version_parser = PactBroker::Versions::ParseSemanticVersion
|
|
29
|
+
# Not recommended to set this to true unless there is no way to
|
|
30
|
+
# consistently extract an orderable object from the consumer application version number.
|
|
31
|
+
config.order_versions_by_date = false
|
|
49
32
|
config
|
|
50
33
|
end
|
|
51
34
|
|
|
52
|
-
# public
|
|
53
35
|
def self.default_html_pact_render
|
|
54
36
|
lambda { |pact|
|
|
55
37
|
require 'pact_broker/api/renderers/html_pact_renderer'
|
|
@@ -57,28 +39,8 @@ module PactBroker
|
|
|
57
39
|
}
|
|
58
40
|
end
|
|
59
41
|
|
|
60
|
-
# public
|
|
61
|
-
def protect_with_basic_auth scopes, credentials
|
|
62
|
-
[*scopes].each do | scope |
|
|
63
|
-
basic_auth_config[scope] ||= []
|
|
64
|
-
basic_auth_config[scope] << credentials
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# private
|
|
69
|
-
def protect_with_basic_auth? scope
|
|
70
|
-
!!basic_auth_credentials_list_for(scope)
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# private
|
|
74
|
-
def basic_auth_credentials_list_for scope
|
|
75
|
-
basic_auth_config[scope]
|
|
76
|
-
end
|
|
77
|
-
|
|
78
42
|
private
|
|
79
43
|
|
|
80
|
-
attr_reader :basic_auth_config
|
|
81
|
-
|
|
82
44
|
def create_logger path
|
|
83
45
|
FileUtils::mkdir_p File.dirname(path)
|
|
84
46
|
logger = Logger.new(path)
|
|
@@ -4,9 +4,17 @@ module PactBroker
|
|
|
4
4
|
module Domain
|
|
5
5
|
class OrderVersions
|
|
6
6
|
|
|
7
|
+
include PactBroker::Logging
|
|
8
|
+
# TODO select for update
|
|
7
9
|
def self.call pacticipant_id
|
|
8
|
-
|
|
9
|
-
orderable_versions.
|
|
10
|
+
|
|
11
|
+
orderable_versions = PactBroker::Domain::Version.for_update.where(:pacticipant_id => pacticipant_id).order(:created_at, :id).collect{| version | OrderableVersion.new(version) }
|
|
12
|
+
ordered_versions = if PactBroker.configuration.order_versions_by_date
|
|
13
|
+
orderable_versions # already ordered in SQL
|
|
14
|
+
else
|
|
15
|
+
orderable_versions.sort
|
|
16
|
+
end
|
|
17
|
+
ordered_versions.each_with_index{ | version, i | version.update_model(i) }
|
|
10
18
|
end
|
|
11
19
|
|
|
12
20
|
class OrderableVersion
|
|
@@ -23,9 +31,11 @@ module PactBroker
|
|
|
23
31
|
end
|
|
24
32
|
|
|
25
33
|
def update_model new_order
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
34
|
+
if version_model.order != new_order
|
|
35
|
+
# Avoid modifying the updated_at flag by doing a manual update
|
|
36
|
+
# In 99% of cases, this will only set the order of the most recent version
|
|
37
|
+
PactBroker::Domain::Version.where(id: version_model.id).update(order: new_order)
|
|
38
|
+
end
|
|
29
39
|
end
|
|
30
40
|
end
|
|
31
41
|
end
|
|
@@ -22,7 +22,7 @@ module PactBroker
|
|
|
22
22
|
include PactBroker::Logging
|
|
23
23
|
include PactBroker::Messages
|
|
24
24
|
|
|
25
|
-
attr_accessor :method, :url, :headers, :body, :username, :password
|
|
25
|
+
attr_accessor :method, :url, :headers, :body, :username, :password, :uuid
|
|
26
26
|
|
|
27
27
|
# Reform gets confused by the :method method, as :method is a standard
|
|
28
28
|
# Ruby method.
|
|
@@ -35,6 +35,7 @@ module PactBroker
|
|
|
35
35
|
@password = attributes[:password]
|
|
36
36
|
@headers = attributes[:headers] || {}
|
|
37
37
|
@body = attributes[:body]
|
|
38
|
+
@uuid = attributes[:uuid]
|
|
38
39
|
end
|
|
39
40
|
|
|
40
41
|
def description
|
|
@@ -64,17 +65,18 @@ module PactBroker
|
|
|
64
65
|
end
|
|
65
66
|
end
|
|
66
67
|
|
|
67
|
-
logger.info "Making webhook request #{to_s}"
|
|
68
|
+
logger.info "Making webhook #{uuid} request #{to_s}"
|
|
68
69
|
response = Net::HTTP.start(uri.hostname, uri.port,
|
|
69
70
|
:use_ssl => uri.scheme == 'https') do |http|
|
|
70
71
|
http.request req
|
|
71
72
|
end
|
|
72
73
|
|
|
73
|
-
logger.info "Received response
|
|
74
|
+
logger.info "Received response for webhook #{uuid} status=#{response.code}"
|
|
75
|
+
logger.debug "body=#{response.body}"
|
|
74
76
|
WebhookExecutionResult.new(response)
|
|
75
77
|
|
|
76
78
|
rescue StandardError => e
|
|
77
|
-
logger.error "Error executing webhook #{e.class.name} - #{e.message}"
|
|
79
|
+
logger.error "Error executing webhook #{uuid} #{e.class.name} - #{e.message}"
|
|
78
80
|
logger.error e.backtrace.join("\n")
|
|
79
81
|
WebhookExecutionResult.new(nil, e)
|
|
80
82
|
end
|
data/lib/pact_broker/logging.rb
CHANGED
|
@@ -20,11 +20,12 @@ module PactBroker
|
|
|
20
20
|
PactBroker::Domain::Pacticipant.order(:name).all
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
def
|
|
23
|
+
def find_all_pacticipant_versions_in_reverse_order name
|
|
24
24
|
PactBroker::Domain::Version
|
|
25
25
|
.select(:versions__id, :versions__number, :versions__pacticipant_id, :versions__order, :versions__created_at, :versions__updated_at)
|
|
26
26
|
.join(:pacticipants, {id: :pacticipant_id})
|
|
27
27
|
.where(name_like(:name, name))
|
|
28
|
+
.reverse_order(:order)
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
def find_by_name_or_create name
|
|
@@ -41,8 +41,8 @@ module PactBroker
|
|
|
41
41
|
pacticipant_repository.find_by_name(name)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
def self.
|
|
45
|
-
pacticipant_repository.
|
|
44
|
+
def self.find_all_pacticipant_versions_in_reverse_order name
|
|
45
|
+
pacticipant_repository.find_all_pacticipant_versions_in_reverse_order(name)
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
def self.find_pacticipant_repository_url_by_pacticipant_name name
|
data/lib/pact_broker/version.rb
CHANGED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require 'sucker_punch'
|
|
2
|
+
require 'pact_broker/webhooks/service'
|
|
3
|
+
require 'pact_broker/logging'
|
|
4
|
+
|
|
5
|
+
module PactBroker
|
|
6
|
+
module Webhooks
|
|
7
|
+
class Job
|
|
8
|
+
|
|
9
|
+
BACKOFF_TIMES = [10, 60, 120, 300, 600, 1200] #10 sec, 1 min, 2 min, 5 min, 10 min, 20 min => 38 minutes
|
|
10
|
+
|
|
11
|
+
include SuckerPunch::Job
|
|
12
|
+
include PactBroker::Logging
|
|
13
|
+
|
|
14
|
+
def perform data
|
|
15
|
+
@webhook = data[:webhook]
|
|
16
|
+
@error_count = data[:error_count] || 0
|
|
17
|
+
begin
|
|
18
|
+
webhook_execution_result = PactBroker::Webhooks::Service.execute_webhook_now webhook
|
|
19
|
+
reschedule_job unless webhook_execution_result.success?
|
|
20
|
+
rescue StandardError => e
|
|
21
|
+
handle_error e
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
attr_reader :webhook, :error_count
|
|
28
|
+
|
|
29
|
+
def handle_error e
|
|
30
|
+
log_error e
|
|
31
|
+
reschedule_job
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def reschedule_job
|
|
35
|
+
case error_count
|
|
36
|
+
when 0...BACKOFF_TIMES.size
|
|
37
|
+
logger.debug "Re-enqeuing job for webhook #{webhook.uuid} to run in #{BACKOFF_TIMES[error_count]} seconds"
|
|
38
|
+
Job.perform_in(BACKOFF_TIMES[error_count], {webhook: webhook, error_count: error_count+1})
|
|
39
|
+
else
|
|
40
|
+
logger.error "Failed to execute webhook #{webhook.uuid} after #{BACKOFF_TIMES.size} times."
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|