Skip to content

Commit be92b11

Browse files
committed
add safe retry logic for members_and_roles_from_rest()
1 parent 6317078 commit be92b11

File tree

5 files changed

+43
-2
lines changed

5 files changed

+43
-2
lines changed

Gemfile.lock

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ PATH
66
faraday (~> 2.0)
77
faraday-retry (~> 2.0)
88
octokit (~> 4.25)
9+
retryable (~> 3.0, >= 3.0.5)
910

1011
GEM
1112
remote: https://rubygems.org/
@@ -79,6 +80,7 @@ GEM
7980
rbs (3.6.1)
8081
logger
8182
regexp_parser (2.9.2)
83+
retryable (3.0.5)
8284
rexml (3.3.9)
8385
rspec (3.13.0)
8486
rspec-core (~> 3.13.0)

entitlements-github-plugin.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
2020
s.add_dependency "faraday", "~> 2.0"
2121
s.add_dependency "faraday-retry", "~> 2.0"
2222
s.add_dependency "octokit", "~> 4.25"
23+
s.add_dependency "retryable", "~> 3.0", ">= 3.0.5"
2324

2425
s.add_development_dependency "entitlements-app", "~> 1.0"
2526
s.add_development_dependency "rake", "~> 13.2", ">= 13.2.1"

lib/entitlements/config/retry.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# frozen_string_literal: true
2+
3+
require "retryable"
4+
5+
module Retry
6+
# This method should be called as early as possible in the startup of your application
7+
# It sets up the Retryable gem with custom contexts and passes through a few options
8+
# Should the number of retries be reached without success, the last exception will be raised
9+
def self.setup!
10+
######## Retryable Configuration ########
11+
# All defaults available here:
12+
# https://github.com/nfedyashev/retryable/blob/6a04027e61607de559e15e48f281f3ccaa9750e8/lib/retryable/configuration.rb#L22-L33
13+
Retryable.configure do |config|
14+
config.contexts[:default] = {
15+
on: [StandardError],
16+
sleep: 1,
17+
tries: 3
18+
}
19+
end
20+
end
21+
end

lib/entitlements/service/github.rb

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# frozen_string_literal: true
22

3+
require_relative "../config/retry"
4+
35
require "net/http"
46
require "octokit"
57
require "uri"
@@ -36,6 +38,9 @@ class GitHub
3638
ignore_not_found: C::Maybe[C::Bool],
3739
] => C::Any
3840
def initialize(addr: nil, org:, token:, ou:, ignore_not_found: false)
41+
# init the retry module
42+
Retry.setup!
43+
3944
# Save some parameters for the connection but don't actually connect yet.
4045
@addr = addr
4146
@org = org
@@ -247,10 +252,22 @@ def members_and_roles_from_graphql
247252
def members_and_roles_from_rest
248253
Entitlements.logger.debug "Loading organization members and roles for #{org}"
249254
result = {}
250-
octokit.organization_members(org, { role: "admin" }).each do |member|
255+
256+
# fetch all the admin members from the org
257+
admin_members = Retryable.with_context(:default) do
258+
octokit.organization_members(org, { role: "admin" })
259+
end
260+
261+
# fetch all the regular members from the org
262+
regular_members = Retryable.with_context(:default) do
263+
octokit.organization_members(org, { role: "member" })
264+
end
265+
266+
admin_members.each do |member|
251267
result[member[:login].downcase] = "ADMIN"
252268
end
253-
octokit.organization_members(org, { role: "member" }).each do |member|
269+
270+
regular_members.each do |member|
254271
result[member[:login].downcase] = "MEMBER"
255272
end
256273

vendor/cache/retryable-3.0.5.gem

13.5 KB
Binary file not shown.

0 commit comments

Comments
 (0)