こんにちは、 id:numanuma08 です。
私が今携わっているAndroidアプリのプロジェクトは、依存ライブラリのアップデートに追従するためRenovateを使っています。
Auto mergeは設定しておらず、週1でRenovateが動作しているのでPRが毎週作られるはずでしたが、いつの頃からかPRが作られていませんでした。
今回、その理由を調査したので共有します。
Renovate とは
Renovate は Github を始め Gitlab や Bitbucket などで動作する Bot で依存しているライブラリのアップデートを検知すると依存関係をアップデートしてくれます。設定次第でPull Requestの作成や自動で変更を取り込むAuto mergeが可能です。導入方法が非常に簡単で、Githubの場合はボタンを1つ押すだけで設定ファイルを含んだPull requestが作成され、それをMergeすれば導入完了です。
その一方、非常に設定可能な項目が多くてボタン1つで動作をさせると思わぬところで有効化されていた設定により、思い通りの動作をしないケースが有ります。
Pull Request が作成されない
今のプロジェクトでRenovateは週1で動作しているはずですが、なぜかPull Requestが作成されなくなったので色々と調査をしました。結論としては、PRやブランチの生成上限に到達していた(PRをマージしていなかった)だけでした。どのような方法で調査を行ったのか共有し、今後似たような状況に陥ったときの道標とします。
公式ドキュメント
何はなくともドキュメントを参照します。しかし、ドキュメントの量が膨大です。
Running Renovate - Renovate Docs
全てに目を通すのは難しいので、ローカルな環境でRenovateを動作させてデバッグします。
Renovateのデバッグ
Renovateはnpmで配信されているツールなのでnpm I -g renovate
などのコマンドでローカル環境にインストールします。その後、renovate.json
がある場所で以下のコマンドを実行します。
ちなみに私のシェルはfishなので、適宜読み替えてください。
set -x RENOVATE_TOKEN <GithubのToken> set -x RENOVATE_CONFIG_FILE renovate.json set -x LOG_LEVEL debug renovate <repo owner>/<repo name> --require-config=ignore --dry-run > output.txt
renovateコマンド実行時、--require-config=ignore
をセットするとリモートブランチ上のrenovate.jsonを読み込まなくなります。また、--dry-run
をセットするとPRの作成や更新は実行されません。
ログを読み解く
あとは出力されたログをファイルを読んでいきます。かなり詳細にログを出力してくれるので、じっくり読めば概ね分かるはず。今回、私の場合次のメッセージが表示されていました。
DEBUG: Checking schedule "before 3am on Monday" (repository=<repo owner>/<repo name>, branch=renovate/androidx-camera) "parsedSchedule": {"schedules": [{"t_b": [10800], "d": [2]}], "exceptions": [], "error": -1} DEBUG: Package not scheduled (repository=<repo owner>/<repo name>, branch=renovate/androidx-camera) DEBUG: Skipping branch creation as not within schedule (repository=<repo owner>/<repo name>, branch=renovate/androidx-camera)
ブランチ生成がスケジュールに組み込まれていないのでスキップされています。これ、Dependency Dashboardによって依存関係がリストアップされていたことに気がついておらず、チェックマークをつけていなかったのでPRを作ってくれなかったようです。
他にも
DEBUG: Calculated maximum PRs remaining this run: 10 (repository=<repo owner>/<repo name>) DEBUG: PullRequests limit = 10 (repository=<repo owner>/<repo name>) DEBUG: Calculated maximum branches remaining this run: 2 (repository=<repo owner>/<repo name>) DEBUG: Branches limit = 2 (repository=<repo owner>/<repo name>)
のようにPRの数やブランチの数の制限にヒットしている場合もPRが作られませんでした。
今回、これらに関する設定を見直すことで問題を解消しました。
まとめ
Renovateはボタン1つで導入が完了するツールですが、膨大な設定項目をある程度理解しておかないと思った通りの動作をしない場合があります。問題が起きてもローカル環境で動作させられるので、慌てずに調査をしましょう。