minne事業部プロダクト開発チームのtepiです。DependabotでAndroidのライブラリが検知できない場合の対処方法についてご紹介したいと思います。
Dependabotとは
DependabotはGitHub上で動く自動でライブラリのアップデートを検知できるツールです。 ペパボではGitHub Enterpriseを使って開発を行っており、社内的にはDependabotが推奨されているため、先日公開された記事にも記載の通りRenovateからDependabotに移行しました。
事象
上記の通り移行を行ったのですが、全くPRが作成されないライブラリがいくつもあり、 最初はライブラリがきちんとアップデートされているかつそこまで更新頻度が多くないのかと気にしていなかったのですが、 ある時調べたところ全くアップデートが追いついてないライブラリがたくさんあることに気づきました。
よくよくみると検出できていないライブラリのほとんどがGoogleが提供するAndroid Jetpackライブラリに含まれるライブラリ等でした。
デバッグ
まずはなぜ検出されていないのか調べるべく調査を開始しました。
ローカルでDryrunを実行するためにはDependabotが提供しているOSSのdependabot-scriptが良さそうでしたが、現時点では、
We recently refactored the monolithic docker image used within the Dependabot Core library into one-image-per-ecosystem. Unfortunately, that broke the scripts in this repo, and we haven't had time to update them yet. We are aware of the problem and hope to provide a solution soon.
という記載があって動かせそうにありません。
それで色々といじっている中で、実はGitHubのDependabotの設定画面上でログが見られることがわかりました。 具体的には、以下のような手順で表示できます。
- リポジトリのタブにあるInsightsをクリック
- 出てきたページのサイドにあるDependency graph`をクリック
- 出てきた画面のDependabotタブを開くと以下のように表示されます
- この表示の中の、「
View logs
」をクリック
※上記のスクリーンショットにもあるように事前にログを残す設定をしてある必要があります。
※ここで確認できるログは手動でDependabotを実行した場合のログです。
すると、GitHub Actionsのログを見る画面と同じ画面が開き、実際にGitHub上でDependabotが動作した時のログをみることができます。 今回の事象の場合だと、以下のようなログが出ていました。
Checking if com.google.firebase:firebase-crashlytics-gradle x.x.x needs updating
GET [https://repo.maven.apache.org:443/maven2/com/google/firebase/firebase-crashlytics-gradle/maven-metadata.xml](https://repo.maven.apache.org/maven2/com/google/firebase/firebase-crashlytics-gradle/maven-metadata.xml)
404 [https://repo.maven.apache.org:443/maven2/com/google/firebase/firebase-crashlytics-gradle/maven-metadata.xml](https://repo.maven.apache.org/maven2/com/google/firebase/firebase-crashlytics-gradle/maven-metadata.xml)
Latest version is
Requirements to unlock update_not_possible
見て分かる通り、404 = Not Found
となっており、最新バージョンを比較するためのmaven-metadata.xml
が見つかっていないことがわかりました。
理由
maven-metadata.xml
が見つからない理由はすごく簡単で、参照先のrepo.maven.apache.org
にmaven-metadata.xml
が無いためです。
JetpackライブラリやFirebase等、GoogleのライブラリはGoogleが管理するmavenリポジトリに存在しており、確認するのであればそちらのURLを参照する必要があります。
つまり上記の例の場合は、https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-crashlytics-gradle/maven-metadata.xml
を参照する必要があります。
なお、これはDependabotの仕組みも関与していて、DependabotはGradleを実行して確認しているのではないため、 Gradleの設定に記載されているレジストリは使われません。
対処法
DependabotがGoogleのリポジトリも参照するように変更します。これはドキュメントにも記載があるregistriesという設定にて行うことができます。
最終的な設定の記載方法は以下の通りです。
# 一部抜粋
version: 2
registries:
maven-google:
type: maven-repository
url: https://dl.google.com/dl/android/maven2/
updates:
- package-ecosystem: 'gradle'
registries:
- maven-google
ドキュメントに記載があるのですが、以下少し引っかかった箇所を共有します。
注意点1:registriesの記載場所
レジストリの場所そのものを設定するregistries
の記載箇所はupdates
と並列です。updates
内にも記載するので勘違いしてupdates
内にのみに記載してしまい正常に動作しませんでした。
# ダメな例
updates:
- package-ecosystem: 'gradle'
registries:
maven-google:
type: maven-repository
url: https://dl.google.com/dl/android/maven2/
注意点2:updates内のregistriesが必要
上記の注意点を解消するため、updates
とregistries
を並列で記載することで満足してはいけません。上記にも記載の通りupdates
内のregistries
内にも必要です。
これを指定しないと実際にDependabotは追加されたレジストリを確認しにいってはくれません。
# ダメな例
version: 2
registries:
maven-google:
type: maven-repository
url: https://dl.google.com/dl/android/maven2/
updates:
- package-ecosystem: 'gradle'
対処法後
設定を終えて再度ログを確認すると、以下のように最新バージョンが確認できるようになりました。
Checking if com.google.firebase:firebase-crashlytics-gradle x.x.x needs updating
GET https://repo.maven.apache.org:443/maven2/com/google/firebase/firebase-crashlytics-gradle/maven-metadata.xml
404 https://repo.maven.apache.org:443/maven2/com/google/firebase/firebase-crashlytics-gradle/maven-metadata.xml
GET https://dl.google.com:443/dl/android/maven2/com/google/firebase/firebase-crashlytics-gradle/maven-metadata.xml
200 https://dl.google.com:443/dl/android/maven2/com/google/firebase/firebase-crashlytics-gradle/maven-metadata.xml
Latest version is x.x.x //←ここでちゃんとバージョンが取得できている
No update needed for com.google.firebase:firebase-crashlytics-gradle x.x.x
上記の通り、すべてのライブラリでデフォルトのレジストリと追加分のレジストリを見に行くようになり通信量が増えるため、注意が必要です。
まとめ
以上が、DependabotでAndroidのライブラリを検知できない場合の対処方法です。
恐らく検知できない原因は今回の原因以外にもあるかとは思いますが、少なくともログから何が起きているか見られることで、デバッグはしやすくなりそうです。
ただ、例えば複数のリポジトリでたくさんのライブラリを扱いながらGitHub Enterprizeを使っていると、最後に記載した通り通信量は増えるためその通信料金の負担が大きくなることが懸念されます(もしかするとすでに回避する方法があるかもしれません)。
引き続きこういったツールを活かしてライブラリを最新に保つことで、最新技術にすぐ対応できるようなアプリにしていきたいです。