GitLab client-go(GitLab APIのGoクライアント)に僕が投げたパッチがいくつかとりこまれたので紹介
- 1つ目のパッチ:Add gitlab.WithRequestRetry to retry with any status code
- 2つ目のパッチ:Fixed HTTPClient in retryablehttp.Client not taking over in newRetryableHTTPClientWithRetryCheck
- 何が嬉しいか?
1つ目のパッチ:Add gitlab.WithRequestRetry
to retry with any status code
client-goには https://github.com/hashicorp/go-retryablehttp が組み込まれていて、特定のステータス(429エラー、500系エラー)の時には自動リトライする機能があります。
多くの場合はこれで問題ありません。
しかし、MergeRequest(GitHubでいうところのPullRequest)作成直後にAuto mergeを設定しようとすると402エラーや422エラーになることがあるためリトライが必要になります。 *1
そのため任意のAPI呼び出しで任意のステータスコードでリトライ可能にできるようにする機能を追加しました。
実はRubyKaigi前くらいにパッチを投げていたのですが、色々ディスカッションがあってなんやかんやでマージされるまで1ヶ月くらいかかりました。
余談ですが context.Context
をガッツリ使ったのは今回が初めてでした。(処理を追加する場所的にcontextを使う以外に方法がなかった)
このパッチはマージされていてv0.129.0でリリースされています。
2つ目のパッチ:Fixed HTTPClient in retryablehttp.Client
not taking over in newRetryableHTTPClientWithRetryCheck
自分のアプリのテストコードでは https://github.com/jarcoal/httpmock でGitLab APIの通信をモックしていました。
client-go v0.129.0を自分のアプリで使おうとしたところ、自分が実装した gitlab.WithRequestRetry
を使った時だけhttpmockが効かないバグがあったので修正したのがこのパッチです。
自分のアプリの場合テストコードでhttpmockを使うためにHTTPClientを明示的に渡す必要があったのですが、gitlab.WithRequestRetry
を使うとそれが消えてデフォルトのHTTPClientに戻るためhttpmockが効かなくなるというのが原因でした。
このパッチはマージされていてv0.130.0でリリースされています。
何が嬉しいか?
冒頭に書いた、MergeRequestの作成直後にAuto mergeを設定しようとすると402エラーや422エラーになる件の対策として汚い実装を入れていたのですが、v0.130.0のおかげでその辺の実装を消してきれいにすることができました。