GeekFactory

int128.hatenablog.com

Gradle Updateをカイゼンした

int128.hatenablog.com

Gradle Wrapperを自動更新してくれるサービス Gradle Update を公開してから積み残しがいくつかあったので改善しました。

Done

  • README
  • Gradle Update Badge
    • リポジトリのREADMEに貼っておけば、Gradle Wrapperが最新版であるかチェックできます。
    • こんな感じです: Gradle Status
    • README.mdにはこれを追記で: [![Gradle Status](https://gradleupdate.appspot.com/USER/REPO/status.svg?branch=master)](https://gradleupdate.appspot.com/USER/REPO/status)
    • Gradle Updateにスターを付けていなくても使えます!
  • GitHub User Content対応
    • GitHub APIリポジトリのコンテンツ(build.gradleなど)を取得していましたが、APIの使用回数にカウントされてしまうのと若干重いので、raw.githubusercontent.com から取得するように変えました。
    • 合わせて ETagIf-None-Match でキャッシュする仕組みを入れました。
  • ページング対応
    • アルファベット順で先頭30件のリポジトリしか更新対象にならないバグがありました。
    • GitHub APIはデフォルトで30件しか返さない(最大100件まで可)ため、より多くの項目を得るにはページをたどる必要があります。次ページのURLはLinkヘッダの rel="next" で取得できます。
    • バッチを再実行しました。以前にStarをもらっていて、かつ、所有リポジトリが30件以上ある方は後から追加分が届いたと思います!
  • Webhookの署名検証
    • 誰でもWebhookを叩ける状態になっていたのですぐに直しました。
  • RESTライブラリの移行
    • これまで groovyx.net.http.HTTPBuilder を使っていましたが、以下のバグに悩まされていました。
      • 204 No Contentを受け取るとNPEが発生する
      • JSONをPOSTするにはなぜかbodyを入れ子の配列にする必要がある(body: object ではダメで body: [object, null] ならOK)
    • groovy-wslite に移行しました。HTTPBuilder とほとんど同じAPIなので簡単に移行できました。割と使いやすそう。
  • HEAD対応
    • SlackbotがHEADリクエストを投げてきて404になっていたので直しました。
  • ロギング
    • バッチ主体のシステムは異常系の処理を追うのが大変なので、なるべく多くの情報を出すようにしています。
    • 即時対処が必要なものは severe、怪しいものは warning とかしてます。
    • バグがあると severe が出まくるのでやばい。
  • テストコード
    • APIを利用する部分は参照系のテストだけ。更新系はやってない。
    • GitHub APIのスタブを作るのは割と大変そう。API結合テストはみんなどうしてるんだろう。
    • Dry-runほしい。

To Do

  • Forkしたリポジトリは更新の対象外にしてもよさそう。
  • Landing Page
  • User Page
  • タスクが冪等になってるか再チェック

int128/gradleupdate · GitHub