LoginSignup
13

Renovateまとめ(iOSを例に解説)

Last updated at Posted at 2022-10-29

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の設定を見ていきます。

基本設定

スケジュール

Sample.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ラベルを付与する例。

Sample.json
{
  "labels": [
    "renovate"
  ]
}

オートマージ

PRをオートマージするかどうかの設定。

Sample.json
{
  "automerge": false
}

どのバージョンが上がったかどうかで設定を分けることもできます。

{
  "major": {
    "automerge": false
  },
  "patch": {
    "automerge": true
  },
{

draftPR

PRをdraftで作成するかどうかの設定。

Sample.json
{
  "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を扱っているのを参考に紹介します。

project.yml
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を使用せずにdepNamecurrentValueをマッピングしています。
url: https://github.com/onevcat/KingfisherからdepNameにはonevcat/Kingfisherがマッピングすることがわかります。
同様にversion: 7.0.0からcurrentValueには7.0.0がマッピングされます。

この方法だとpackagesに書いてあるものが全て対象になります。
ただ、その中でも前に紹介したようにenable: falseで対象外にしたいケースもありますよね。そんな時はpackageRulesと組み合わせると設定できます。

regexManagersで特定の依存関係を更新の対象外にする

例えばこのようなproject.ymlがあるとします。

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を入れると最低限の手作業でライブラリを最新に保つことができるのでとても快適です。
社内で導入した後の話もそのうち書こうと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13