$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

Renovateを使ってライブラリアップデートの自動マージ

利用しているライブラリのアップデートは常に行いたいが、中々コストの掛かる作業でもある。その時にテストが通ったらOK・型検証が通ったらOKみたいなライブラリ(例: TypeScriptなら @types/系やjestなど)なら人間の目を通さずに自動でPullRequestをマージしてくれたら、その分コストが減り、人間の目が必要な作業を行う時間が増える。

そこでRenovateを使って上記のようなことをやってみたのでメモしておく。

出来たもの

https://github.com/shibayu36/typescript-cli-project/pull/10 のように、Renovateのbotが勝手にPRを作り、勝手にApproveし、テストが通ったら(GitHubのchecksが通ったら)勝手にマージしてくれるようになった。

実現するためにやること

  • Renovateを有効にして、自動マージできるように設定ファイルを作る
  • renovate-approveを有効にして、レビューが必須でも勝手にApproveしてくれるようにする

の2つだけしたら良い。

Renovateを有効にして、自動マージできるように設定ファイルを作る

https://github.com/apps/renovate を入れたいレポジトリに設定すれば良い。するとConfigure Renovateというissue( https://github.com/shibayu36/typescript-cli-project/pull/6 )が作られるので、それを見ながら設定する。

自動マージを実現するために以下のようにrenovate.jsonを設定した。

{
  // VSCodeで補完が効くようになって便利
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  // 一般的な設定を有効にし、timezoneも設定する
  "extends": [
    "config:base",
    ":timezone(Asia/Tokyo)"
  ],
  // ラベル付ける
  "labels": ["dependencies", "renovate"],
  // CIを阻害しないように、夜や週末に実行する
  "schedule": ["after 10pm and before 5am every weekday", "every weekend"],
  // これを設定しておくと https://github.com/shibayu36/typescript-cli-project/issues/17 みたいなのが作られて便利
  "dependencyDashboard": true,
  // pinのPRは自動マージ
  "pin": {
    "automerge": true
  },
  // npmではrangeのバージョンを使う
  "npm": {
    "rangeStrategy": "bump"
  },
  // @types/系はmajorが変更される以外は自動マージ
  "packageRules": [
    {
      "packagePatterns": ["^@types/"],
      "automerge": true,
      "major": {
        "automerge": false
      }
    },
    // jestはまとめる(一旦自動マージしない)
    {
      "groupName": "jest",
      "sourceUrlPrefixes": [
        "https://github.com/facebook/jest",
        "https://github.com/kulshekhar/ts-jest"
      ]
    },
    // linter系はまとめる(一旦自動マージしない)
    {
      "groupName": "linters",
      "extends": ["packages:linters"],
      "packageNames": ["prettier"],
      "packagePatterns": ["^@typescript-eslint/"]
    }
  ]
}

必要があればjestの自動マージやlinterの自動マージを設定すると良いだろう。

renovate-approveを有効にして、レビューが必須でも勝手にApproveしてくれるようにする

基本は上記設定でも問題ない。しかしGitHubのBranch protection rulesの設定でRequire pull request reviews before mergingを有効にしている場合、ReviewsのApproveがないことで自動マージが出来ないという問題がある。

この場合の解決策もRenovateは用意してくれていて、https://github.com/apps/renovate-approve を入れるだけで済む。とりあえず入れておくと良いだろう。

まとめ

今回はRenovateで自動マージを実現する方法を調べたのでメモしておいた。今回は調査のために1から設定したが、とにかく素早く使いたいなら下のような設定を使うのも良いだろうと思う。

developer.hatenastaff.com