Shibuya.apk#44 で発表したスライド https://shibuya-apk.connpass.com/event/292311/
お世話になった JCenter 依存を剥がすための話
JCenterをちゃんと差し替えるShibuya.apk #44@red_fat_daruma
View Slide
- Jumpei Matsuda (@red_fat_daruma)- DeployGate で働いています- お酒が飲みたいですじこしょうかい
- そう思う方も一部にはいると思いますが・・・- 実際、障害が発生する度に話題に上がるので使ってる人はまだいそうえ、今更じゃないの?
- 高速で reliable な Maven Repository- Maven Central の mirror- 独自 artifact の配布- 各自の Bintray スペースで配布した artifact を promote できた- Maven Central より圧倒的簡単に配布可能- ⇒ 配布する・される、どちらの界隈でもポピュラーにJCenter powered by JFrog
https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/
- 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 へ redirectJCenter の Sunsetting と Troubles
- 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これはまあ分かる
- 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分からない、どうして・・・
- 多大な恩恵を受けた- 爆速で安定した最高体験な MavenCentral Mirror だった- ストレージ代はじめ、保守コストが高そうなのに無料- ライブラリ開発者から見て利用ハードルが低かった- 何か問題を感じても、責任は自分たちサイドにある- MavenCentral より高速な mirror- 安定版でも JCenter にしか配布しない開発者- JCenter にしかない artifact を利用し続ける利用者分からないけど、そう批判するものではない
- artifact + α を決められた位置に配置してね、のみ- 配置方法はなんでもいい- 実ファイルでもリダイレクトでも Proxy でもなんでもいい- Relay Server や P2P のような分散システムではない- artifact は直接配布した Repository にのみ存在すればよい- (プロトコルを除き)セキュリティ要件は特にない- 一度配布した artifact の差し替えを禁止していない- 署名による所有者確認は不要Maven Repositoryの最低要件
- Google Maven Repository- Artifact の差し替えが”あった” (現在も可能かどうかは不明)- JCenter- 署名なしにアップロードが可能だった- Gradle Plugin Portal- 裏側に JCenter がいる- jitpack.io- 都度ビルドなので環境ロックが不十分だと冪等性がない有名な Maven Repository にある(あった)こと
- 不安定な Maven Repository でも概ね同様- ライブラリ開発者がやること- Maven Central への配布し直し- ライブラリ利用者がやること- 安定した MavenCentral Mirror 探し- JCenter から※配布される artifact から乗り換えるJCenter をやめてみる※ Maven Central や Google Maven などに含まれないが、 JCenter にある artifact
- Maven Central への配布し直し- JCenter から artifact (stableのみ) を取り出す- javadoc/source.jar、pom を Maven Central 用に用意する- jar や pom に署名する- Sonatype に申請する- 各手順は次の記事を読んで下さい(省略)- https://zenn.dev/red_fat_daruma/articles/0f3a01a53dc4fdライブラリ開発者向け
ライブラリ利用者向け - まずは・・・- 安定した Maven Central Mirror 探し- 最近もちょいちょい Maven Central がエラーを吐く- ❌ 自分で JFrog Artifactory などを使って用意する- ✅ Google がホストしてるマルチリージョン用 Repository- https://storage-download.googleapis.com/maven-central/index.html- Edge Location の自動解決はない点に注意
- JCenter でのみ配布された artifact を乗り換えるために指定を削除!ライブラリ利用者向け - 次に・・・
- ❌ JCenter を指定しているか- ✅ 推移的に見て、JCenter で resolve される artifact はないか- Gradle Resolution API でも難しい(とりあえずできなかった)- JCenter を Remote Repository にする Maven Repo は?- e.g. Gradle Plugin Portalそんな簡単な話ではない
Gradle Plugin Portal の例
- jmatsu/maven-repo-interceptor-for-gradle- localhost:3000/repos にロギング用の Repo が立てられるFake Maven Repository を立てればいいじゃない
- 「この Repo までで解決してくれ」の次に挿入する- http://localhost:3000 をブラウザで開いておくFake Maven Repository を立てればいいじゃない
- 強制的にすべての dependency を resolve するFake Maven Repository を立てればいいじゃない
-Fake Maven Repository へのアクセスが記録される
- 同 or 新バージョンが Maven Central などで配布されてないか探す- 保守を考慮すると理想的 ✅- 配布されていてもマイナーな Repository は ❌- 該当バージョンが他 Maven Repository から配布されてないか探す- ただし Redirect されていたら意味がないので要チェック- ローカル埋め込みまたは Remote Maven Repository を用意する- 現状も移行できない人たちは大体これになるJCenter からの artifact を特定したら
- ✅ ローカル埋め込み (Local Maven Repository 含)- 新バージョンはどうあっても JCenter 以外なので手間は変わらない- ✅ Remote Maven Repository- 複数プロジェクトから利用するならローカル埋め込みより有り- 省エネ重視なら GitHub Pages を使えばいいMaven Repository を作成する
- URL を指定すると Maven Repository の形式でダウンロード可能- 指定 URL の Repo に入ってない artifact も炙り出せるMaven Repository を作成する(e.g. 前述のツール)
- 頑張ってやめましょう- JFrog(JCenter) に感謝の気持ちを忘れずに- でも早くやめましょうまとめ