くりにっき

フルスタックキュアエンジニアです

GitLab client-goにパッチが取り込まれた

GitLab client-go(GitLab APIのGoクライアント)に僕が投げたパッチがいくつかとりこまれたので紹介

gitlab.com

1つ目のパッチ:Add gitlab.WithRequestRetry to retry with any status code

gitlab.com

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でリリースされています。

gitlab.com

2つ目のパッチ:Fixed HTTPClient in retryablehttp.Client not taking over in newRetryableHTTPClientWithRetryCheck

gitlab.com

自分のアプリのテストコードでは https://github.com/jarcoal/httpmock でGitLab APIの通信をモックしていました。

client-go v0.129.0を自分のアプリで使おうとしたところ、自分が実装した gitlab.WithRequestRetry を使った時だけhttpmockが効かないバグがあったので修正したのがこのパッチです。

自分のアプリの場合テストコードでhttpmockを使うためにHTTPClientを明示的に渡す必要があったのですが、gitlab.WithRequestRetry を使うとそれが消えてデフォルトのHTTPClientに戻るためhttpmockが効かなくなるというのが原因でした。

このパッチはマージされていてv0.130.0でリリースされています。

gitlab.com

何が嬉しいか?

冒頭に書いた、MergeRequestの作成直後にAuto mergeを設定しようとすると402エラーや422エラーになる件の対策として汚い実装を入れていたのですが、v0.130.0のおかげでその辺の実装を消してきれいにすることができました。

gitlab.com