From 257c9ec9b0f0de50c43eecb19fc49498845010d2 Mon Sep 17 00:00:00 2001 From: Wada Yusuke Date: Sat, 20 Jun 2026 08:30:56 +0900 Subject: [PATCH 1/2] =?UTF-8?q?chore(ci):=20Renovate=20=E3=82=92=E5=B0=8E?= =?UTF-8?q?=E5=85=A5=E3=81=97=E4=BE=9D=E5=AD=98=E6=9B=B4=E6=96=B0=E3=82=92?= =?UTF-8?q?=E8=87=AA=E5=8B=95=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit actions/pip/npm/terraform/docker/nix の 6 エコシステムを対象に Renovate(Mend hosted app)の設定を追加。固定運用(SHA pin / == 固定 / digest pin)は維持し、更新提案の PR 起票のみ自動化する。 自動マージは行わず全 PR を人間レビューとする。採用判断は ADR-0014 に記録。 Co-Authored-By: Claude Opus 4.8 --- .github/renovate.json5 | 82 +++++++++++++++++++ .../0014-renovate-dependency-automation.md | 69 ++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 .github/renovate.json5 create mode 100644 docs/adr/0014-renovate-dependency-automation.md diff --git a/.github/renovate.json5 b/.github/renovate.json5 new file mode 100644 index 00000000..bcd86d33 --- /dev/null +++ b/.github/renovate.json5 @@ -0,0 +1,82 @@ +{ + // Renovate 設定の正本。詳細: ADR-0014 / docs/development.md + // コメントを日本語で残すため JSON5 を採用している。 + $schema: "https://docs.renovatebot.com/renovate-schema.json", + + extends: [ + "config:recommended", + // すべての更新提案を Dependency Dashboard(Issue)に集約して一覧管理する + ":dependencyDashboard", + // docker イメージは tag だけでなく digest で固定する(再現性・サプライチェーン対策) + "docker:pinDigests", + // GitHub Actions を SHA(digest) ピン留めで維持する(既存運用に合わせる) + "helpers:pinGitHubActionDigests", + ], + + timezone: "Asia/Tokyo", + // 起票ノイズを抑えるため、毎週月曜の朝に更新 PR をまとめて作る + schedule: ["before 9am on monday"], + labels: ["dependencies"], + + // このリポジトリは == / SHA 固定でサプライチェーンに慎重な方針のため、 + // 自動マージは行わない。全 PR を人間がレビューしてマージする。 + automerge: false, + + // 一度に出す PR 数を制限してレビュー負荷を抑える + prConcurrentLimit: 8, + prHourlyLimit: 4, + + // lockfile / locked input を定期的にリフレッシュする + // (package-lock.json / flake.lock / .terraform.lock.hcl) + lockFileMaintenance: { + enabled: true, + schedule: ["before 9am on monday"], + }, + + // 脆弱性アラートは優先度を上げて即時起票(pip-audit の後追いを先回りで補強) + vulnerabilityAlerts: { + labels: ["dependencies", "security"], + // schedule を空にしてスケジュール制限を外し、検知次第すぐ PR を作る + schedule: [], + }, + + packageRules: [ + { + // GitHub Actions: 既存の digest + "# v4" コメント形式を維持する + matchManagers: ["github-actions"], + pinDigests: true, + groupName: "github-actions", + }, + { + // Python (backend/requirements.txt): == 完全固定を維持して版上げ PR を出す。 + // CVE コメント付き行(anthropic / google-genai / starlette 等)も対象。 + matchManagers: ["pip_requirements"], + rangeStrategy: "pin", + }, + { + // OpenTofu/Terraform: versions.tf の ~> 制約と各 env の .terraform.lock.hcl を更新 + matchManagers: ["terraform"], + groupName: "terraform providers", + }, + { + // docker-compose の libsql-server は :latest 固定のため tag では追従できない。 + // docker:pinDigests により digest 固定で運用する(version 概念が無い点に留意)。 + matchManagers: ["docker-compose"], + matchPackageNames: ["ghcr.io/tursodatabase/libsql-server"], + pinDigests: true, + }, + { + // Nix: flake.lock の locked input(nixpkgs unstable / flake-utils)を追従。 + // Mend hosted app では nix manager が動作する。 + matchManagers: ["nix"], + groupName: "nix flake.lock", + }, + { + // web の devDependencies は minor/patch を 1 PR にまとめてレビュー負荷を下げる + matchManagers: ["npm"], + matchDepTypes: ["devDependencies"], + matchUpdateTypes: ["minor", "patch"], + groupName: "web devDependencies (non-major)", + }, + ], +} diff --git a/docs/adr/0014-renovate-dependency-automation.md b/docs/adr/0014-renovate-dependency-automation.md new file mode 100644 index 00000000..a22b8298 --- /dev/null +++ b/docs/adr/0014-renovate-dependency-automation.md @@ -0,0 +1,69 @@ +# ADR-0014: Renovate による依存更新の自動化 + +## ステータス + +Accepted + +## コンテキスト + +DevForge は依存をすべて「固定」運用している。GitHub Actions は SHA(digest) ピン留め +(`uses: actions/checkout@34e1148... # v4`)、Python は `backend/requirements.txt` で +`==` 完全固定、infra プロバイダは `~>` 制約 + `.terraform.lock.hcl`、Nix は `flake.lock` +で固定している。これはサプライチェーン攻撃(レンジ内 yank / 侵害バージョンの混入)に +対して安全な一方で、**固定したバージョンを追従する仕組みが無い**という弱点があった。 + +- 古いバージョンに固定され続け、機能改善・バグ修正・非互換のないセキュリティ修正を取り + こぼす。 +- CVE 対応が CI の pip-audit による検知頼みで、後追いになる。 +- 追従が手作業のため、更新が後回しになりがちで、いざ上げる時の差分が大きくなる。 + +Dependabot / Renovate のいずれも未導入だったため、依存更新を自動で提案する仕組みを +入れることにした。 + +## 決定内容 + +**Renovate(Mend hosted GitHub App)を導入する。** 固定運用は維持したまま、更新の +「提案(PR 起票)」だけを自動化する。 + +- 設定の正本は `.github/renovate.json5`(コメントを日本語で残すため JSON5)。 +- 対象エコシステム: github-actions / pip(requirements) / npm / terraform / + docker・docker-compose / nix の 6 種。 +- 固定方式は維持する: + - github-actions は `pinDigests: true` で digest 固定 + `# v4` コメントを継続。 + - pip は `rangeStrategy: "pin"` で `==` 固定を維持。 + - docker は `docker:pinDigests` で digest 固定。 + - nix は `flake.lock` の locked input を追従。 +- `vulnerabilityAlerts` を優先起票し、pip-audit の後追いを Renovate の先回りで補強する。 +- すべての更新は Dependency Dashboard(Issue)で一覧管理する。 +- **自動マージは行わない。** 全 PR を人間がレビューし、CI green を確認して手動マージする。 + +## 代替案 + +- **Dependabot**: GitHub 純正で導入は容易だが、(1) Nix manager が無い、(2) monorepo の + グルーピングや digest pin 維持の柔軟性が Renovate に劣る。本リポジトリは Nix を含む + 多エコシステム構成のため Renovate を採用した。 +- **セルフホスト Renovate(GitHub Action で cron 実行)**: トークン・権限・ランナーを + 自前管理する必要があり、特に Nix manager 用に nix 入りランナーの用意が要る。hosted + app なら nix がサポート済みで運用負荷が小さいため採用しなかった。 +- **導入しない(現状維持)**: 追従の取りこぼしと CVE 後追いの課題が解消しないため却下。 + +## トレードオフ・既知のリスク + +- 定期的に更新 PR が起票され、レビュー工数が発生する(`schedule` / `prConcurrentLimit` + / devDependencies のグルーピングで負荷を抑制)。 +- 自動マージしないため、PR を放置すると追従が滞る運用リスクは残る。 +- `ghcr.io/tursodatabase/libsql-server:latest` は tag 固定不可のため digest 運用となり、 + tag ベースの版差分は追えない。 +- Renovate App のインストール(リポジトリへの権限付与)は GitHub 上の手動操作が必要。 + +## 将来の移行条件 + +- レビュー負荷が高い場合、`lockfile` / `digest` など低リスク更新に限定した自動マージの + 導入を検討する(最初から有効化はしない)。 +- Nix manager の hosted サポートに問題が出た場合は、セルフホスト Action 方式へ切り替える。 + +## 関連リンク + +- 設定: `.github/renovate.json5` +- 関連方針: `.claude/rules/common/duplication.md`(環境変数・バージョン固定の SSoT) +- Renovate ドキュメント: https://docs.renovatebot.com/ From db2157757b2b5da1e475922d7a1eb43e51b26f8e Mon Sep 17 00:00:00 2001 From: Wada Yusuke Date: Sat, 20 Jun 2026 08:44:09 +0900 Subject: [PATCH 2/2] =?UTF-8?q?chore(ci):=20Renovate=20=E3=83=87=E3=83=95?= =?UTF-8?q?=E3=82=A9=E3=83=AB=E3=83=88=E8=A8=AD=E5=AE=9A=E3=82=92=E4=BD=9C?= =?UTF-8?q?=E3=82=8A=E8=BE=BC=E3=81=BF=E7=89=88=E3=81=B8=E7=B5=B1=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit onboarding で main に追加されたデフォルト renovate.json を削除し、 6 エコシステム対応の .github/renovate.json5 に一本化する。設定ファイル 重複(Renovate の multiple config エラー)を防ぐ。 Co-Authored-By: Claude Opus 4.8 --- renovate.json | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 renovate.json diff --git a/renovate.json b/renovate.json deleted file mode 100644 index 5db72dd6..00000000 --- a/renovate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "config:recommended" - ] -}