---
title: "RenovateのOnboarding PRを毎回手作業で書き換えるのをやめた"
description: "Renovateが立てる初回Onboarding PRには、`<org>/renovate-config/default.json`を置けば組織プリセットへの`extends`が自動で差し込まれる仕組みがソースコード側にあります。コメントを残せる`default.json5`を選ぶとこの自動検出が空振りするため、Mend-hostedの`org-inherited-config.json`で`onboardingConfig`を明示的に上書きして、Onboarding PRをそのままマージできる状態に揃えました。"
category: "DevOps"
tags: ["Renovate","GitHub","Mend","DevOps"]
publishedAt: "2026-06-07"
lastmod: "2026-07-26"
---

新規リポジトリにRenovateを入れるたびにOnboarding PRを開いて、`extends`に組織共通プリセットへの参照を1行足す運用にうんざりして、Mend-hostedの[`org-inherited-config.json`](https://docs.renovatebot.com/mend-hosted/hosted-apps-config/)でOnboarding PRの中身そのものを組織側から差し替えるように切り替えました。

```jsonc
// LabeeHive/renovate-config/org-inherited-config.json
{
  "$schema": "https://docs.renovatebot.com/renovate-inherited-schema.json",
  "onboarding": true,
  "onboardingConfigFileName": ".github/renovate.json5",
  "onboardingConfig": {
    "$schema": "https://docs.renovatebot.com/renovate-schema.json",
    "extends": [
      "github>LabeeHive/renovate-config:default.json5"
    ]
  }
}
```

この記事では、Renovateの自動Onboarding PRに何が入っていないか、Renovate本体に組み込まれた`<org>/renovate-config/default.json`の自動検出、`default.json5`を選んだ瞬間にその自動検出が効かなくなる理由、そして`org-inherited-config.json`で書き換える方針までを順に書きます。

::card[https://github.com/LabeeHive/renovate-config]

## Onboarding PRはデフォルトで出る、中身が違うだけ

[Renovate](https://docs.renovatebot.com/)を新しいリポジトリで動かすと、初回に[Onboarding PR](https://docs.renovatebot.com/getting-started/installing-onboarding/)が自動で立ちます。Renovate本体の挙動で、組織継承の設定があってもなくても出てきます。

問題は中身です。デフォルトのOnboarding PRに入っているのはRenovate標準の雛形で、ラビー合同会社で使いたいプリセットへの参照ではありません。新規リポジトリができるたびに、`extends`に組織共通プリセットへの参照を1行足して、ファイルパスを`.github/renovate.json5`に直して、マージする。薄い作業ですが、触る回数だけはあるので、ファイル名のtypoや参照先の付け忘れが少しずつ積もっていきます。「Renovateが回っていない」と思って覗いたら、デフォルトのまま放置された`renovate.json`がリポジトリ直下にあった、というのを何度かやってからは、Onboarding PRの中身を組織側で固めたくなりました。

## Renovate本体には`<org>/renovate-config/default.json`を拾う仕組みがある

ソースコードを覗くと、Renovateの初回Onboarding処理が`<org>/renovate-config`を探しに行く分岐があります。`lib/workers/repository/onboarding/branch/config.ts`の`searchDefaultOnboardingPreset`が該当箇所で、新規リポジトリのパスを上から辿りながら`<group>/renovate-config`の存在を確認し、見つかればその参照をOnboarding PRの`extends`として埋め込みます。

```typescript
// lib/workers/repository/onboarding/branch/config.ts より抜粋
// Check for group/renovate-config
const repo = `${groupName}/renovate-config`;
const preset = `local>${repo}`;
if (await getPreset({ repo })) {
  foundPreset = preset;
}
```

`getPreset({ repo })`は`presetName`省略時に`'default'`を使う実装で、内部の`fetchPreset()`で`default.json`を直接読みに行きます。

```typescript
// lib/config/presets/util.ts より抜粋
if (fileName === 'default') {
  try {
    jsonContent = await fetch(
      repo, buildFilePath('default.json'), endpoint, tag,
    );
  } catch (err) {
    // ... fallback to deprecated renovate.json ...
  }
}
```

つまり`<org>/renovate-config`のリポジトリ直下に **`default.json`** が置いてあれば、新規Onboarding PRには`extends: ["local><org>/renovate-config"]`が自動で差し込まれます。`org-inherited-config.json`を書かなくても、Onboarding PRの`extends`を毎回手作業で足す必要がなくなります。

## `default.json5`を選ぶと自動検出は効かない

問題はここからです。組織共通プリセットには「なぜこの設定を入れているか」をコメントで残したい背景があります。JSON5ならコメントを書けるため、ファイルを`default.json5`にしたい。

ところが上の`searchDefaultOnboardingPreset`は`getPreset({ repo })`経由で`default.json`を直接探しに行く実装なので、`default.json5`しか置いていないリポジトリはマッチしません。`fetchPreset()`の`fileName === 'default'`の分岐は`buildFilePath('default.json')`に決め打ちで降りていきます。自動検出が空振りすると、Onboarding PRには組織プリセットへの参照が入らず、Renovate標準の雛形がそのまま書き込まれてしまいます。

回避するには、Onboarding PRの中身を上書きするための`org-inherited-config.json`を別途用意し、`onboardingConfig.extends`に**ファイル名つきの参照**（`github>LabeeHive/renovate-config:default.json5`）を明示的に書きます。`fetchPreset()`は拡張子に`.json5`が付いた`filePreset`が渡された場合はその名前で取りに行く分岐に入るため、こちらは問題なく解決します。

![自動検出から入るとgetPreset({ repo })経由でfetchPreset()のfileNameがdefaultの分岐に降り、buildFilePathがdefault.jsonに決め打ちするため、default.json5しか置いていないとマッチしない。org-inherited-config.jsonのextendsにファイル名つきの参照を書くと、filePresetとして渡るのでdefault.json5が解決する](/images/posts/renovate-config-org-preset/preset-lookup.svg)

ラビー合同会社では、`default.json5`でコメントを残すことを優先して、`org-inherited-config.json`を併設する方式を取りました。「Onboarding PRの中身を制御したい」「プリセットにコメントを書きたい」という2つの目的が、結果として同じファイル（`org-inherited-config.json`）で実現できる構造です。

```jsonc
// LabeeHive/renovate-config/org-inherited-config.json
{
  "$schema": "https://docs.renovatebot.com/renovate-inherited-schema.json",
  "onboarding": true,
  "onboardingConfigFileName": ".github/renovate.json5",
  "onboardingConfig": {
    "$schema": "https://docs.renovatebot.com/renovate-schema.json",
    "extends": [
      "github>LabeeHive/renovate-config:default.json5"
    ]
  }
}
```

## Mend-hostedはリポジトリ名とファイル名を固定で見る

`org-inherited-config.json`が読まれる側の仕組みは[Mend-hosted Renovate App](https://docs.renovatebot.com/mend-hosted/hosted-apps-config/)に書かれています。Mend-hostedのバックエンドは毎回のRenovate実行のたびに`<org>/renovate-config/org-inherited-config.json`を自動で読みに行き、対象リポジトリの設定にマージしてから動きます。

有効化に必要なのは3点です。

- リポジトリ名が`renovate-config`であること
- ファイル名が`org-inherited-config.json`であること
- Renovate Appがこのリポジトリにもインストールされていること

リポジトリ名もファイル名もハードコードされていて、`.github/org-inherited-config.json`のような別配置にしても見てもらえません。`renovate-config`を独立したリポジトリとして切ったのはこの規約に従うためで、Renovate関連だけを抱えるリポジトリにすると、`.github`リポジトリと役割を切り分けられます。

`org-inherited-config.json`の`onboardingConfig`に`extends`を書いておくと、Renovateが新規リポジトリのOnboarding PRを開くときに、その内容がそのまま`renovate.json5`として書き込まれます。`onboardingConfigFileName`を`.github/renovate.json5`に向けているのはリポジトリのルートを汚さないためで、Renovate関連の設定を`.github/`配下に集めておくと、ファイルツリーや`ls`の結果がすっきりします。

## 既存リポジトリの参照は手動で揃える

`org-inherited-config.json`を置いた後も、すでにOnboarding済みのリポジトリの`renovate.json5`は古い参照先を指したままです。`onboardingConfig.extends`を新しい参照に切り替えても、これは**新規リポジトリ向けの雛形**を上書きするだけで、既存ファイルには触れません。

既存リポジトリで`github>LabeeHive/.github:default.json5`のような古い参照を使っているものは、新しい`renovate-config`側に向け直すPRを別途出して回します。対象の洗い出しは`gh search code`で済みます。

```bash
gh search code --owner LabeeHive 'extends "github>LabeeHive/.github:default.json5"' --json repository,path
```

返ってきたパスごとに`extends`の参照先を書き換えるPRを出し、マージし切ってから古い`.github/default.json5`本体を削除します。切り替えが完了するまでは新旧両方の`default.json5`が並走するため、中身を一時的に同じ内容に揃えておけばRenovateの挙動は変わりません。

::card[https://labee.jp/posts/renovate-cloudflare-workers-grouping]