🤞

パッケージの自動管理にはRenovateがおすすめ

2024/11/06に公開

どうもK1mu21です

前回GitLabでのdependabotが微妙だったというブログを書いたので、その続きとしてRenovateを使った話をします

https://zenn.dev/aeon_mall/articles/a62a1cf8652f01

この記事を読んでいただきたい方

  • dependabotを使っている方
  • パッケージ管理の自動化に興味がある方
  • CIに興味がある方

Renovateは?

  • 簡単に言うとパッケージのアップデートなどを自動管理をしてくれるツールになります
    • Dependabotと同じようなことをしてくれるツールと思っていただけるとわかりやすいと思います

https://github.com/renovatebot/renovate?tab=readme-ov-file

Dependabotと比べて何がいいのか?

  1. アップデート対象ライブラリのバージョンを上げるPRのグループ化ができる
  • GitHubのDependabotではgroupsキーが設定できます

  • しかし自分でReact系などまとめたいパッケージを指定しないといけないため、一緒にアップデートしないとバグるパッケージがあった場合漏れてしまう可能性があります

  • GitLabではgroupsキーが使えないので、パッケージ1つ1つのMRが作られることでコンフリクトの解消に追われます

  • Renovateはどちらの場合でもgroup化できるのがメリットです

    • 標準で様々な設定があり、それを指定するだけで設定が適用できるのがかなり楽です
      • 以下のドキュメントのようにmonorepo:astroを指定するだけでhttps://github.com/withastro/astro系のパッケージを1つのPRにまとめてくれます
    • 標準設定が不足していても、自分でこのモノレポ設定を上書きすることもできるので柔軟に調整できます

https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#groups

https://docs.renovatebot.com/presets-monorepo/#monorepoastro

  1. 設定が柔軟にできる
  • メジャーバージョンだったらPRを作らない、マイナーバージョン以下だったらグループ化して自動でMergeされるように設定することができます
    • packageRulesを使えば上記のことが簡単に適用できます
      • このパッケージのメジャーバージョンは上げないなども簡単にできるのがいい点です

https://docs.renovatebot.com/configuration-options/#packagerules

  1. biome.jsonなどpackage.jsonとは関係ないファイルも更新できる
  • dependabotではpackage.json、package-lock.jsonしか更新されなかったので、biomeのPRがあるたびに直接biome.jsonを最新バージョンにあげていました
  • RenovateではcustomManagers:biomeVersionsを指定するだけで、一緒にbiome.jsonも更新してくれるため一々操作する必要がなくなりました
  • customManagersを使うことでDockerfileのバージョンも調整したりできるので、かなり便利です

https://docs.renovatebot.com/presets-customManagers/#custommanagersbiomeversions

  1. Renovateの設定に問題があるとIssueを発行して教えてくれる
  • Renovateはrenovate.jsonなどを使って設定をするのですが、設定方法が間違っていればIssueを発行して原因を記載してくれるので修正がとても楽です
    • 英語で原因が書かれるのですが、普通に理解しやすく記述してくれるのもいい点です

微妙だと思った点

  1. 設定が豊富すぎる
  • 設定が豊富すぎて、標準設定で意図していない機能が働いたりする
    • 一度あったのが動かしたらPRを作成していないブランチが全て削除されてガチで焦りました
      • 全て動いていないブランチだったので助かりました...
    • 各々のGitの運用方法をちゃんと理解した上で導入しましょう
      • 調べたら出てきた記事をそのまま使うのではなく、動作させる前にしっかりと設定が間違っていないのかを調べましょう
  1. Dependabotと比べると導入に手間がかかる
  • これも1つ目の問題に関連することで、意図していない機能があったりするので調査に時間がかかりました
    • サッと導入したいのならDependabotの方がいいかもしれません
  1. 脆弱性アラートがない
  • Dependabotでは脆弱性が発見されるとsecurityのラベルを貼ってPRを作成してくれるので、即座に対応できました
  • Renovateは脆弱性データベースを持っていないため、検知された更新が脆弱性対応かわからないのが欠点です

導入までの流れ

環境

  • GitLab
  • Renovate: 39.0.4
  1. GitHubでパーソナルアクセストークンをpublic_repoで作成(必須ではない)

  2. GitLabでパーソナルアクセストークンをread_user, api and,write_repositoryで作成

  3. GitLabの任意のリポジトリを選択してSettings>CI/CD>Variablesに、GITHUB_COM_TOKEN(1で作成したトークン)とRENOVATE_TOKEN(2で作成したトークン)をExpand Variable referenceを指定して登録

  4. renovate.jsonを作成(例)

{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": [
    // モノレポ設定されていないメジャー以外のパッケージをまとめる
    "group:allNonMajor",
    "config:best-practice",
    // PRを作る際の制限をなくす
    ":disableRateLimiting",
    // DependencyDashboardは必要性あんまり感じなかったので無効
    ":disableDependencyDashboard",
    // Renovateはバージョンを固定した記述が推奨されているので有効に
    ":pinDependencies",
    // biome.jsonを更新するように
    "customManagers:biomeVersions"
  ],
  "enabledManagers": ["npm"],
  "timezone": "Asia/Tokyo",
  // ここは適宜変えてください
  "baseBranches": ["main"],
  // PRが作成されていないブランチを削除しないようにする
  "pruneStaleBranches": false,
  "packageRules": [
    {
      // Vitestに関するパッケージをまとめる
      "matchPackageNames": ["vitest", "@cloudflare/vitest-pool-workers"],
      "groupName": "vitest"
    }
  ]
}
  1. .gitlab-ci.ymlを設定(例)
stages:
    - renovate

variables:
    # RENOVATEが実行されるブランチにあるrenovate.jsonを読むようにするため
    RENOVATE_CONFIG_FILE: renovate.json

renovate:
    stage: renovate
    image:
        renovate/renovate:latest
        entrypoint:[""]
    script:
        # gitlabを指定してTOKENを読ませる
        # --require-config=ignoredを入れないとデフォルトブランチのrenovate設定ファイルを読みにいってしまう
        - renovate --platform gitlab --token $RENOVATE_TOKEN --endpoint $CI_SERVER_URL/api/v4 $CI_PROJECT_PATH --require-config=ignored
    # スケジュールorWeb上から動かした場合のみに動くようにする
    rules:
        if: $CI_PIPELINE_SOURCE == "schedule"
        if: $CI_PIPELINE_SOURCE == "web"
    # dockerのランナーで動かす
    tags:
        docker

6.パイプラインスケジュールを設定

  • GitLabのリポジトリからBuild>Pipeline schedulesでスケジュールを設定して定期実行するようにすれば完了

補足

  • 今回はGitLabで動かす例ですが、renovate.jsonの内容はGitHubでも使えるので参考にしてみてください!
  • renovate.jsonの内容は基本的に上から順に上書きされるようになっているので、設定順序は気にする必要があります
  • 準備中にMRが作られて欲しくないならdry-runを使いましょう

https://docs.renovatebot.com/self-hosted-configuration/#dryrun

まとめ

  • Renovateとてもいいツールですが、ちょっと導入コストがかかるので早く導入したいと言う話ならDependabotでも十分だと思いました
  • Dependabotでも足りない!と言う話があるならRenovateの導入を視野に入れてもいいと思います!
  • GitLabの人は問答無用でRenovateでいいと思います
  • 脆弱性検知が物足りない場合はDependabotのアラート機能のみと併用してもいいかもしれませんね!

Discussion