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