Renovateとは
プロジェクトの依存関係の更新を検知し、PRを作成してくれるツールです。
私がiOSの開発環境に導入したためiOSをメインに紹介しますが、多くの言語や環境に対応しています。
また、スケジューリング以外にも設定はかなり細かく行え、ドキュメントも詳細に用意されているため導入しやすいツールです。
公式ドキュメント
DependabotというGitHubに統合された同様のツールもありますが、Dependabotは最近更新が進んでおらずSwiftPMにも対応していないので個人的には現状Renovateの方をお勧めします。
今回は基本的に公式ドキュメントに書いてある内容と、Discussionで聞いた内容を少しまとめてあります。
Renovateの仕様
サポートされているプラットフォーム
- GitHub (.comとEnterprise Server)
- GitLab (.comとCE/EE)
- Bitbucket Cloud
- Bitbucket Server
- Azure DevOps
- Gitea
iOSの環境での使用可否
| ツール | ○ or × | メモ |
|---|---|---|
| CocoaPods | ○ | デフォルトで対応されているがXcodeGenを使った場合課題あり |
| Carthage | × | 正規表現を用いたマッチングで対応可能 |
| SwiftPM | × | 正規表現を用いたマッチングで対応可能 |
| XcodeGen | × | 正規表現を用いたマッチングで対応可能 |
なんだかこう見ると全然つかえないじゃーんと思ってしまうが、そんなことはないのでぜひ続きも読んでいただきたいです。
Renovateの機能
Renovateの設定はrenovate.jsonに記載します。
Renovateでどんなことができるのか、よく使う機能を中心にrenovate.jsonの設定を見ていきます。
基本設定
スケジュール
{
"schedule": [
"after 10am before 1pm every weekday"
]
}
日毎の設定
"before 2am"
週毎の設定
"schedule:earlyMondays"
月毎の設定
"before 3am on the first day of the month"
四半期毎の設定
"before 3am on the first day of the month"
年毎の設定
"every 12 months on the first day of the month"
週末の設定
"every weekend"
平日の設定
"every weekday"
非営業日の設定
[
"after 10pm every weekday",
"before 5am every weekday",
"every weekend"
]
PRのラベル
renovateラベルを付与する例。
{
"labels": [
"renovate"
]
}
オートマージ
PRをオートマージするかどうかの設定。
{
"automerge": false
}
どのバージョンが上がったかどうかで設定を分けることもできます。
{
"major": {
"automerge": false
},
"patch": {
"automerge": true
},
{
draftPR
PRをdraftで作成するかどうかの設定。
{
"draftPR": true
}
サポートされているパッケージの設定 (packageRules)
packageRulesで複数のルールを指定でき、全ての指定で正規表現を使用できます。
packageRules
パッケージの指定
matchManagersでパッケージ名を指定します。
ここで指定できるパッケージはサポートされているパッケージになります。
CocoaPodsを指定する場合
{
"packageRules": [
{
"matchManagers": [ "cocoapods"]
}
]
}
特定のパッケージを更新の対象外にする
enableですればよい。
Rubyのバージョンアップを対象外とする場合
{
"packageRules": [
{
"matchManagers": [ "ruby-version"],
"enabled": false
}
]
}
複数のパッケージをまとめる
matchPackageNamesで指定するとグループ化できます。groupNameを設定すると分かりやすいです。
Firebaseをまとめてバージョンアップする場合
{
"packageRules": [
{
"matchManagers": [
"cocoapods"
],
"groupName": "Firebase",
"matchPackageNames": [
"Firebase",
"Firebase/Core",
"Firebase/Auth",
"Firebase/Analytics"
]
}
]
}
ちょっとした応用
特定のパッケージだけマージのルールを変えたい
基本設定でオートマージをオンにしているが、特定のパッケージは必ずマージ前にアップデート内容を確認したい場合、packageRulesの中にそのグループだけマージのルールを変更することができる。
{
"automerge": true,
"packageRules": [
{
"matchManagers": [
"cocoapods"
],
"groupName": "Firebase",
"matchPackageNames": [
"Firebase",
"Firebase/Core",
"Firebase/Auth",
"Firebase/Analytics"
],
"automerge": false,
}
]
}
サポートされていないパッケージの設定(regexManagers)
サポートされているパッケージの一覧にないものや、独自のファイル形式・規約はregexManagersで正規表現を用いて対応できます。
regexManagers
名前のマッピングをする
regexManagersは以下の項目のマッピングをする (例: (?<depName>.*)) かdepNameTemplateを設定する必要があります。
両方設定してしまうと混乱するため、どちらか一方にしましょう。
- datasource
- depName
- currentValue
matchStringsでマッピングをする
project.ymlにてSwiftPMを扱っているのを参考に紹介します。
packages:
Kingfisher:
url: https://github.com/onevcat/Kingfisher
version: 7.0.0
この場合のregexManagersの記載はこうなります。
{
"regexManagers": [
{
"fileMatch": [
"^project.yml$"
],
"matchStrings": [
"url: https:\\/\\/github\\.com\\/(?<depName>.*?)(\\.git)?\\s*version: (?<currentValue>.*)\\s"
],
"datasourceTemplate": "github-releases"
}
]
}
この例ではdepNameTemplateを使用せずにdepNameとcurrentValueをマッピングしています。
url: https://github.com/onevcat/KingfisherからdepNameにはonevcat/Kingfisherがマッピングすることがわかります。
同様にversion: 7.0.0からcurrentValueには7.0.0がマッピングされます。
この方法だとpackagesに書いてあるものが全て対象になります。
ただ、その中でも前に紹介したようにenable: falseで対象外にしたいケースもありますよね。そんな時はpackageRulesと組み合わせると設定できます。
regexManagersで特定の依存関係を更新の対象外にする
例えばこのようなproject.ymlがあるとします。
packages:
Kingfisher:
url: https://github.com/onevcat/Kingfisher
version: 7.0.0
APIKit:
url: https://github.com/ishkawa/APIKit
version: 5.2.0
なんらかの理由でAPIKitのアップデートを一定期間無視したいとします。
そんな時はmatchStringsでマッピングしたdepNameを使用して指定することができます。
{
"packageRules": [
{
"matchPackageNames": [ "ishkawa/APIKit"],
"enabled": false
}
]
"regexManagers": [
{
"fileMatch": [
"^project.yml$"
],
"matchStrings": [
"url: https:\\/\\/github\\.com\\/(?<depName>.*?)(\\.git)?\\s*version: (?<currentValue>.*)\\s"
],
"datasourceTemplate": "github-releases"
}
]
}
ローカルでRenovate.jsonのチェックをする
作ったjsonのテストをローカルで簡単にテストできます。
jsonと同じ階層で以下のコマンドを実行してください。これが通過すればRenovateは動作します。
$ npx --package renovate -c 'renovate-config-validator'
Renovateのインストール
使っているプラットフォームによりますが、一番多いであろうGitHubではGitHub Appが用意されているため、これを対象のリポジトリに入れるだけで動作します。
残っている課題
-
Package.swiftを使用している場合Package.resolvedが更新されない
PRは上がっていますが、一向にマージされる気配はありません。 -
XcodeGenを使用しているとPodfile.lockが更新されない
上記問題はUnitTestなどをCIで自動化している場合には、そのついでにコミットプッシュをCI上でするのが一番簡単かなと思います。
おわりに
Renovateを入れると最低限の手作業でライブラリを最新に保つことができるのでとても快適です。
社内で導入した後の話もそのうち書こうと思います。