spaceship/lib/spaceship/tunes/tunes_client.rb in fastlane-2.54.0.beta.20170818010002 vs spaceship/lib/spaceship/tunes/tunes_client.rb in fastlane-2.54.0.beta.20170819010003
- old
+ new
@@ -8,10 +8,14 @@
# raised if the server failed to save temporarily
class ITunesConnectTemporaryError < ITunesConnectError
end
+ # raised if the server failed to save, and it might be caused by an invisible server error
+ class ITunesConnectPotentialServerError < ITunesConnectError
+ end
+
attr_reader :du_client
def initialize
super
@@ -106,11 +110,13 @@
clear_user_cached_data
send_shared_login_request(user, password)
end
# rubocop:disable Metrics/PerceivedComplexity
- def handle_itc_response(raw)
+ # If the response is coming from a flaky api, set flaky_api_call to true so we retry a little.
+ # Patience is a virtue.
+ def handle_itc_response(raw, flaky_api_call: false)
return unless raw
return unless raw.kind_of? Hash
data = raw['data'] || raw # sometimes it's with data, sometimes it isn't
@@ -162,10 +168,12 @@
# This is a special error which we really don't care about
elsif errors.count == 1 and errors.first.include?("try again later")
raise ITunesConnectTemporaryError.new, errors.first
elsif errors.count == 1 and errors.first.include?("Forbidden")
raise_insuffient_permission_error!
+ elsif flaky_api_call
+ raise ITunesConnectPotentialServerError.new, errors.join(' ')
else
raise ITunesConnectError.new, errors.join(' ')
end
end
@@ -341,11 +349,11 @@
req.url "ra/apps/#{app_id}/platforms/ios/versions/#{version_id}"
req.body = data.to_json
req.headers['Content-Type'] = 'application/json'
end
- handle_itc_response(r.body)
+ handle_itc_response(r.body, flaky_api_call: true)
end
end
#####################################################
# @!group Members
@@ -1313,20 +1321,29 @@
parse_response(r, 'data')
end
private
- def with_tunes_retry(tries = 5, &_block)
+ def with_tunes_retry(tries = 5, potential_server_error_tries = 3, &_block)
return yield
rescue Spaceship::TunesClient::ITunesConnectTemporaryError => ex
unless (tries -= 1).zero?
msg = "iTunes Connect temporary error received: '#{ex.message}'. Retrying after 60 seconds (remaining: #{tries})..."
puts msg
logger.warn msg
sleep 60 unless defined? SpecHelper # unless FastlaneCore::Helper.is_test?
retry
end
raise ex # re-raise the exception
+ rescue Spaceship::TunesClient::ITunesConnectPotentialServerError => ex
+ unless (potential_server_error_tries -= 1).zero?
+ msg = "Potential server error received: '#{ex.message}'. Retrying after 10 seconds (remaining: #{tries})..."
+ puts msg
+ logger.warn msg
+ sleep 10 unless defined? SpecHelper # unless FastlaneCore::Helper.is_test?
+ retry
+ end
+ raise ex
end
def clear_user_cached_data
@content_provider_id = nil
@sso_token_for_image = nil