Handle 429 and prevent 301 in gp_downloadmetadata#406
Conversation
d5e27fb to
31daea9
Compare
gp_downloadmetadata to offer to retry when receiving a 429gp_downloadmetadata
| if loc.is_a?(Array) | ||
| puts "Downloading language: #{loc[1]}" | ||
| complete_url = "#{params[:project_url]}#{loc[0]}/default/export-translations?filters[status]=current&format=json" | ||
| UI.message "Downloading language: #{loc[1]}" |
There was a problem hiding this comment.
Converted the puts to UI.message for more consistent logs.
| if UI.confirm("Retry downloading `#{locale}` after receiving 429 from the API?") | ||
| download(locale, response.uri, is_source) | ||
| else | ||
| UI.error("Abandoning `#{locale}` download as requested.") |
There was a problem hiding this comment.
I decided to make this error so it would print red to mark the difference in behavior.

(The 301 is because I hadn't updated the URLs yet)
I can see how error/red might be misleading though, and look like a wholesale failure. If you think that's too confusing, I can update to a message:
| UI.error("Abandoning `#{locale}` download as requested.") | |
| UI.message("Abandoning `#{locale}` download as requested.") |
There was a problem hiding this comment.
Given the error message is pretty clear and it's in reaction of us explicitly replying n in the prompt on the previous line, I vote for keeping it red with UI.error 👍
| @@ -16,12 +16,7 @@ def initialize(target_folder, target_files) | |||
| def download(target_locale, glotpress_url, is_source) | |||
| uri = URI(glotpress_url) | |||
| response = Net::HTTP.get_response(uri) | |||
There was a problem hiding this comment.
Just a thought, not related to this PR: it might be good to use faraday which has features like following redirects and retry with an interval (which could be a replacement for handling 429 error?).
There was a problem hiding this comment.
Yeah... I don't know about faraday or other Ruby networking clients, but given the number of network requests we do with this toolkit, having a feature-rich way to do requests would be handy.
There was a problem hiding this comment.
iinm Farady is also the network client that fastlane itself uses, so it should already be part of our ruby dependencies anyway.
This is one of those items part of a long list of little things I'd love to improve / refactor to clean up the release-toolkit in many areas and modernize it… but never got the bandwidth to 😅
lib/fastlane/plugin/wpmreleasetoolkit/helper/metadata_download_helper.rb
Outdated
Show resolved
Hide resolved
AliSoftware
left a comment
There was a problem hiding this comment.
You're missing a CHANGELOG.md entry, so I'm blocking the merge to avoid accidentally landing this without it 😉
But apart from that, the rest LGTM 👍 So should be good to ship once you add that.
| if UI.confirm("Retry downloading `#{locale}` after receiving 429 from the API?") | ||
| download(locale, response.uri, is_source) | ||
| else | ||
| UI.error("Abandoning `#{locale}` download as requested.") |
There was a problem hiding this comment.
Given the error message is pretty clear and it's in reaction of us explicitly replying n in the prompt on the previous line, I vote for keeping it red with UI.error 👍
Co-authored-by: Olivier Halligon <olivier.halligon@automattic.com>
Suggestions have been implemented
| ### Breaking Changes | ||
|
|
||
| _None_ | ||
| - Propose to retry when `gp_downloadmetadata` receives a `429 - Too Many Requests` error. [#406] |
There was a problem hiding this comment.
@mokagio I'm not sure this is really a breaking change — as in, that won't require any change to client repos adopting the new release-toolkit to update their call sites or config or whatnot, will it?
I think it's not worth a major version bump on the next release, while a New Feature and minor bump would make more sense for this change 🙃
There was a problem hiding this comment.
Yep, not at all a breaking change. That was an oversight which I realized only after merging this. It's fixed in 39808da.
There was a problem hiding this comment.
Oh, perfect, thanks for following-up 👍
During the WordPress 20.6 finalization, we noticed that
gp_downloadmetadatadidn't offer to retry the GlotPress request when receiving a 429 (see details in this comment and this commit)This PR adds a crude retry mechanism to the action.
While working on this, I noticed that the URL used was lacking the
/, consistently resulting in a 301 from the API. I addressed that, too.gp_downloadmetadatais set to be removed in favor of a better alternative as soon as we'll have time for it. I tried to write new code that was good, but kept the refactoring and improvements to a minimum.Testing
I tested this by pointing my WordPress iOS to my local copy of the repo.
I then run
bundle exec fastlane download_wordpress_localized_app_store_metadatatill I got a 429.