$30 off During Our Annual Pro Sale. View Details »

JCenterをちゃんと差し替える

 JCenterをちゃんと差し替える

Shibuya.apk#44 で発表したスライド
https://shibuya-apk.connpass.com/event/292311/

お世話になった JCenter 依存を剥がすための話

Matsuda Jumpei

September 01, 2023
Tweet

More Decks by Matsuda Jumpei

Other Decks in Technology

Transcript

  1. JCenterをちゃんと差し替える
    Shibuya.apk #44
    @red_fat_daruma

    View Slide

  2. - Jumpei Matsuda (@red_fat_daruma)
    - DeployGate で働いています
    - お酒が飲みたいです
    じこしょうかい

    View Slide

  3. - そう思う方も一部にはいると思いますが・・・
    - 実際、障害が発生する度に話題に上がるので使ってる人はまだいそう
    え、今更じゃないの?

    View Slide

  4. - 高速で reliable な Maven Repository
    - Maven Central の mirror
    - 独自 artifact の配布
    - 各自の Bintray スペースで配布した artifact を promote できた
    - Maven Central より圧倒的簡単に配布可能
    - ⇒ 配布する・される、どちらの界隈でもポピュラーに
    JCenter powered by JFrog

    View Slide

  5. https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/

    View Slide

  6. - 2021 Feb 03: 🗣 終了予定のアナウンス(初回)
    - 2021 Mar 31: 🗓 新規アップロードの停止
    - 2021 Apr 27: 🗣 終了撤回 & read-only でずっと存続する、と宣言
    - 2021 May 01: 🗓 jcenter 以外の dl.bintray.com/* の停止
    - 2022 Nov 26: ❌ jcenter.bintray.com の証明書が切れる
    - 2023 Jun 23: ❌ JCenter が Maven Central へ redirect
    JCenter の Sunsetting と Troubles

    View Slide

  7. - 2021 Feb 03:   終了予定のアナウンス(初回)
    - 2021 Mar 31:   新規アップロードの停止
    - 2021 Apr 27:   終了撤回 & read-only でずっと存続する、と宣言
    - 2021 May 01:   jcenter 以外の dl.bintray.com/* の停止
    - 2022 Nov 26: ❌ jcenter.bintray.com の証明書が切れる
    - 2023 Jun 23:   JCenter が Maven Central へ redirect
    これはまあ分かる

    View Slide

  8. - 2021 Feb 03:   終了予定のアナウンス(初回)
    - 2021 Mar 31:   新規アップロードの停止
    - 2021 Apr 27:   終了撤回 & read-only でずっと存続する、と宣言
    - 2021 May 01:   jcenter 以外の dl.bintray.com/* の停止
    - 2022 Nov 26:   jcenter.bintray.com の証明書が切れる
    - 2023 Jun 23: ❌ JCenter が Maven Central へ redirect
    分からない、どうして・・・

    View Slide

  9. - 多大な恩恵を受けた
    - 爆速で安定した最高体験な MavenCentral Mirror だった
    - ストレージ代はじめ、保守コストが高そうなのに無料
    - ライブラリ開発者から見て利用ハードルが低かった
    - 何か問題を感じても、責任は自分たちサイドにある
    - MavenCentral より高速な mirror
    - 安定版でも JCenter にしか配布しない開発者
    - JCenter にしかない artifact を利用し続ける利用者
    分からないけど、そう批判するものではない

    View Slide

  10. - artifact + α を決められた位置に配置してね、のみ
    - 配置方法はなんでもいい
    - 実ファイルでもリダイレクトでも Proxy でもなんでもいい
    - Relay Server や P2P のような分散システムではない
    - artifact は直接配布した Repository にのみ存在すればよい
    - (プロトコルを除き)セキュリティ要件は特にない
    - 一度配布した artifact の差し替えを禁止していない
    - 署名による所有者確認は不要
    Maven Repositoryの最低要件

    View Slide

  11. - Google Maven Repository
    - Artifact の差し替えが”あった” (現在も可能かどうかは不明)
    - JCenter
    - 署名なしにアップロードが可能だった
    - Gradle Plugin Portal
    - 裏側に JCenter がいる
    - jitpack.io
    - 都度ビルドなので環境ロックが不十分だと冪等性がない
    有名な Maven Repository にある(あった)こと

    View Slide

  12. - 不安定な Maven Repository でも概ね同様
    - ライブラリ開発者がやること
    - Maven Central への配布し直し
    - ライブラリ利用者がやること
    - 安定した MavenCentral Mirror 探し
    - JCenter から※配布される artifact から乗り換える
    JCenter をやめてみる
    ※ Maven Central や Google Maven などに含まれないが、 JCenter にある artifact

    View Slide

  13. - Maven Central への配布し直し
    - JCenter から artifact (stableのみ) を取り出す
    - javadoc/source.jar、pom を Maven Central 用に用意する
    - jar や pom に署名する
    - Sonatype に申請する
    - 各手順は次の記事を読んで下さい(省略)
    - https://zenn.dev/red_fat_daruma/articles/0f3a01a53dc4fd
    ライブラリ開発者向け

    View Slide

  14. ライブラリ利用者向け - まずは・・・
    - 安定した Maven Central Mirror 探し
    - 最近もちょいちょい Maven Central がエラーを吐く
    - ❌ 自分で JFrog Artifactory などを使って用意する
    - ✅ Google がホストしてるマルチリージョン用 Repository
    - https://storage-download.googleapis.com/maven-central/index.html
    - Edge Location の自動解決はない点に注意

    View Slide

  15. - JCenter でのみ配布された artifact を乗り換えるために指定を削除!
    ライブラリ利用者向け - 次に・・・

    View Slide

  16. - ❌ JCenter を指定しているか
    - ✅ 推移的に見て、JCenter で resolve される artifact はないか
    - Gradle Resolution API でも難しい(とりあえずできなかった)
    - JCenter を Remote Repository にする Maven Repo は?
    - e.g. Gradle Plugin Portal
    そんな簡単な話ではない

    View Slide

  17. Gradle Plugin Portal の例

    View Slide

  18. - ❌ JCenter を指定しているか
    - ✅ 推移的に見て、JCenter で resolve される artifact はないか
    - Gradle Resolution API でも難しい(とりあえずできなかった)
    - JCenter を Remote Repository にする Maven Repo は?
    - e.g. Gradle Plugin Portal
    そんな簡単な話ではない

    View Slide

  19. - jmatsu/maven-repo-interceptor-for-gradle
    - localhost:3000/repos にロギング用の Repo が立てられる
    Fake Maven Repository を立てればいいじゃない

    View Slide

  20. - 「この Repo までで解決してくれ」の次に挿入する
    - http://localhost:3000 をブラウザで開いておく
    Fake Maven Repository を立てればいいじゃない

    View Slide

  21. - 強制的にすべての dependency を resolve する
    Fake Maven Repository を立てればいいじゃない

    View Slide

  22. -
    Fake Maven Repository へのアクセスが記録される

    View Slide

  23. - 同 or 新バージョンが Maven Central などで配布されてないか探す
    - 保守を考慮すると理想的 ✅
    - 配布されていてもマイナーな Repository は ❌
    - 該当バージョンが他 Maven Repository から配布されてないか探す
    - ただし Redirect されていたら意味がないので要チェック
    - ローカル埋め込みまたは Remote Maven Repository を用意する
    - 現状も移行できない人たちは大体これになる
    JCenter からの artifact を特定したら

    View Slide

  24. - ✅ ローカル埋め込み (Local Maven Repository 含)
    - 新バージョンはどうあっても JCenter 以外なので手間は変わらない
    - ✅ Remote Maven Repository
    - 複数プロジェクトから利用するならローカル埋め込みより有り
    - 省エネ重視なら GitHub Pages を使えばいい
    Maven Repository を作成する

    View Slide

  25. - URL を指定すると Maven Repository の形式でダウンロード可能
    - 指定 URL の Repo に入ってない artifact も炙り出せる
    Maven Repository を作成する(e.g. 前述のツール)

    View Slide

  26. - 頑張ってやめましょう
    - JFrog(JCenter) に感謝の気持ちを忘れずに
    - でも早くやめましょう
    まとめ

    View Slide