はてなで使用しているRenovateの設定プリセットを公開しました

こんにちは。毎年のAppleとGoogleからのお達しのおかげで、開発環境やライブラリのアップデートが大好きな id:ikesyo です。普段はiOS・Androidのモバイルアプリ開発を主にしています。

はてなでは先日、はてな社内で使用しているRenovateの設定プリセットをGitHubで公開しました!

リポジトリはこちらです。

Renovateについて

Renovateについて簡単に説明すると、様々なプログラミング言語やツールに対応したライブラリ・依存性の自動アップデートサービス(もしくはツール)です。依存性の更新を定期的にチェックし、更新を検知するとバージョンを更新するプルリクエストを自動で作成してくれます。昨年2019年11月にWhiteSource社がRenovateを買収し、完全無料化されたことで気軽に使い始められるようになりました。

Renovateでは対応する言語やツールをmanagerという単位で定義しますが、本エントリー執筆時点で対応manager数は47個にもなります*1!CocoaPodsやGradleにも対応しているので、iOS・Androidアプリ開発にも活用できて嬉しいですね😊

またCTOの id:motemen の最近のブログエントリーでも活用事例が紹介されていました。

ライブラリ・依存性の更新作業は面倒でつい放置してしまいがちですが、放っておくとどんどん最新バージョンへの追従が大変になり、そうしてさらに億劫になり、と悪循環に陥ってしまいます。こうしたツールがバージョン更新するプルリクエストを自動的に作成し、CIを実行してくれるのはそのハードルを大きく下げてくれます。

同種のものにはGitHubが買収し、先日GitHub本体への統合が完了したDependabotというものがあります。

設定の共通化と共有

Renovateでは、複数のライブラリの更新を1つのプルリクエストにまとめるグルーピングの機能や、自動マージ設定、更新の除外設定やスケジュール設定、プルリクエストのテンプレート設定などなど、非常に多くの項目に対して柔軟な設定ができます。

設定項目が豊富で柔軟ということは、人やチームによって設定の書き方がまちまちになってしまったり、よく使う設定をコピペして回ったり、ということになりがちです。Renovateには設定プリセット(Shareable Config Presets)という機能があり、まとまった設定をプリセットとして定義して共通化・共有できます。利用者側では好みのプリセットを継承し、そこから各自で設定を上書き・カスタマイズできます。プリセット自体も他のプリセットを継承して新しいプリセットを定義できます*2

はてな社内でもRenovateの利用が広まってきており、複数のリポジトリでよく使う設定が出来上がってきたので社内用プリセットを作成していました。しかし設定プリセットは特に秘匿する必要もなく、Renovate活用の知見共有になればと思い、この度パブリックリポジトリとしてGitHubで公開することにしました。

プリセットの利用は次のように、Renovateの設定ファイルであるrenovate.jsonextendsの配列に1行追加するだけです。

{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": [
    "github>hatena/renovate-config"
  ]
}

プリセットの内容の説明(抜粋)

このプリセットの内容のうち、いくつかを抜粋して設定内容とその意図を説明したいと思います。ここで紹介した以外の設定については、ぜひリポジトリをチェックしていただければと思います。

automergeTypesMinor

{
  "packageRules": [
    {
      "packagePatterns": ["^@types/"],
      "automerge": true,
      "major": {
        "automerge": false
      }
    }
  ]
}

DefinitelyTypedで公開されているTypeScriptの型定義パッケージのアップデートのうち、マイナー・パッチバージョンでは自動マージを有効にするものです。型定義についてはCIでビルドやテストがパスしていることを確認できれば基本的には問題ないだろうという前提で、人間のレビューコストを省略する狙いです。Renovateのデフォルトプリセットにも:automergeTypesというものがありますが、メジャーアップデートはライブラリ本体側の更新と合わせてチェックすべきとして、自動マージ対象から除外しているのが違いです。

groupLinters

{
  "packageRules": [
    {
      "groupName": "linters",
      "extends": ["packages:linters"],
      "packageNames": ["prettier"],
      "packagePatterns": ["^@typescript-eslint/"]
    }
  ]
}

JavaScript・TypeScript用のlint・format関連のパッケージをグルーピングする設定です。デフォルトプリセットにもgroup:lintersがありますが、ここにtypescript-eslint monorepoのプラグインと、Prettierを追加しています。Prettierはlinterではなくformatterですが、関心領域が近いのでまとめてしまいます。

schedule

{
  "extends": [
    ":timezone(Asia/Tokyo)"
  ],
  "schedule": [
    "after 10:30 before 18:00 every weekday except after 13:00 before 14:00"
  ]
}

はてなの勤務時間・休憩時間に合わせたスケジュール設定です。深夜や休日に動作してレビューリクエストやアサインの通知がノイズになるのを防ぐようにしています。スケジュール設定については、例えば逆のパターンとして「業務時間中にライブラリのアップデートがCIを占有すると困るので深夜や週末に動かそう」といった考えもあるでしょう。そのように個人やチーム毎に色々な考え方があると思うので、"ignorePresets": ["github>hatena/renovate-config:schedule"] で除外したり、"schedule": ["after 10pm and before 5am on every weekday", "every weekend"]のように上書きをしてもらうことを想定しています。

OSSとしてのRenovate

少し余談です。このようなRenovateですが、WhiteSourceによる買収以前からGitHub上でオープンソースとして開発されています。

社内にRenovateを導入していくにあたって、実際試してみると色々と動かないリポジトリもあったので、機能追加やバグ修正のために私も時々プルリクエストを出してプロジェクトに貢献しています。今後も引き続き貢献していく所存です。

おわりに

  • hatena/renovate-configというRenovateの設定プリセットを公開しました
  • プリセットの内容を抜粋して紹介しました
  • RenovateはOSSなので開発に貢献できます

それほど巨大な設定ではありませんが、このプリセットを参考にしてRenovateを設定してみたり、そのまま使ってもらったり、これをベースにして新たなプリセットを作ったり、はたまたRenovateのデフォルトプリセットを改善したりしてもらえたら幸いです。

はてなでは(私と一緒に)このようなDeveloper Experienceの改善やOSSへの貢献に楽しんで取り組める方を積極的に募集中です!ご応募お待ちしています!!

*1:https://github.com/renovatebot/renovate/tree/master/lib/manager

*2:設定のプリセットによる共有といえばBabelやESLint、JestなどJavaScript界隈ではよく見かける印象です