【検証】Renovateをオプションでカスタマイズして少し動かしてみる

# はじめに
こんにちは。
[前回の記事](https://qiita.com/kyappamu/items/cbf358f49bdb0cdc946b) の`Renovate`導入の続きになります。
今回はオプションをいくつか設定して`Renovate`の挙動をカスタマイズして試してみます。

# Renovateの各種オプション
`Renovate`はオプションを設定することでより便利に利用することができます。
設定オプションには大きく、以下があります。
* [セルフホスト用](https://docs.renovatebot.com/self-hosted-configuration/) -> 独自で環境用意している場合
* [リポジトリ用](https://docs.renovatebot.com/configuration-options/) -> 基本はこちら
* [プリセット](https://docs.renovatebot.com/config-presets/) -> いくつかの設定をまとめたもの。独自のプリセットを作成してリポジトリ間で共有することも可。

例えば、GitHubアプリとして公開されている`Renovate`を最初にリポジトリに紐づけた際に`Renovate`が自動で作成するプルリクエストに含まれる以下JSONファイル。
```json:renovate.json
{
  "extends": [
    "config:base"
  ]
}
```
`config:base`という、プリセットが使用されています。こう書くことで、下記設定したことと同義です。

```json
{
  "extends": [
    ":dependencyDashboard",
    ":semanticPrefixFixDepsChoreOthers",
    ":ignoreModulesAndTests",
    ":autodetectPinVersions",
    ":prHourlyLimit2",
    ":prConcurrentLimit10",
    "group:monorepos",
    "group:recommended",
    "workarounds:all"
  ]
}
```
それぞれの設定は[ここ](https://docs.renovatebot.com/configuration-options/) に詳しく載っています。
個々に設定を追加していくのもありですが、入れたい設定がまとまっているプリセットがあれば
それを使った方が簡潔に記述できます。

セルフホスト環境は特に持っていないので、
以降ではリポジトリ、プリセットの設定をいくつか試してみたいと思います。

（今回試す設定）
* リポジトリ
    * assignees -> `Renovate`が作成したプルリクエストを自動でアサインする設定
    * reviewers -> `Renovate`が作成したプルリクエストにレビュワーを自動でアサインする設定
    * automerge -> `Renovate`が作成したプルリクエストを自動マージする設定
    * packageRules -> パッケージ単位に`Renovate`を設定（特定のパッケージは監視対象外とするなど）
    * schedule -> 日次、週次など、`Renovate`の実行タイミングを制御する設定
* プリセット
    * group:allNonMajor -> マイナー・パッチバージョンアップデートを一つのプルリクエストにまとめる設定

# 【検証】assignees・reviewers
assigneesを設定することで、`Renovate`がプルリクエストを作成した際のアサイン先を設定できます。

```json:renovate.json
{
  "extends": [
    "config:base"
  ],
  "assignees": ["@mytysoldier"]
}
```

```json:package.json抜粋
"devDependencies": {
    "request": "2.88.0"
  },
```

上記をリポジトリにプッシュします。

作成されたプルリクエストを見ると、assigneeが設定されていることがわかります。
![スクリーンショット 2022-04-11 8.37.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/c41f91bb-b3e1-3115-0c4b-86b5063ac7f3.png)

reviewersも試してみます。`Renovate`がプルリクエストを作成した際に自動でレビュワーを設定できます。

```json:renovate.json
{
  "extends": [
    "config:base"
  ],
  "reviewers": ["@mytysoldier"]
}
```

```json:package.json抜粋
"devDependencies": {
    "request": "2.88.0"
  },
```

上記をリポジトリにプッシュします。

![スクリーンショット 2022-04-11 8.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/71fb648d-2a57-bf06-f4cb-fc1f0bf6899f.png)

プルリクエスト作られない。。なんで？

![スクリーンショット 2022-04-11 8.44.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/c7ec246e-22d0-7f44-954a-faacd17a83e8.png)

「Dependency Dashboard」をみたら、明示的にチェックボックスをチェックしないといけないみたいなので、チェック入れてみます。（assigneesの検証で試したのと同内容の修正だったからかな）

![スクリーンショット 2022-04-11 8.46.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/16474880-64ce-239e-4b5e-c14f6fbd8cdf.png)


今度はプルリクエストが作成され、レビュワーも設定されています。

# 【検証】automerge
automergeを検証してみます。こちらは、`Renovate`がプルリクエストを作成した際、指定条件に該当するものはそのまま自動的にマージするような設定です。
注意点として、automergeはプライベートリポジトリだとうまく動作しないようです。
なので、今回はパブリックリポジトリで検証します。

```json:renovate.json
{
  "extends": [
    "config:base",
    ":skipStatusChecks"
  ],
  "packageRules": [
    {
      "matchDepTypes": ["devDependencies"],
      "automerge": true
    }
  ]
}
```

```json:package.json抜粋
"devDependencies": {
    "request": "2.88.0"
  },
```

上記では、devDependenciesの変更をautomergeの対象として設定しています。
これでautomergeが動くかといえば実はそうではなく、何らかのテストが通ったことが確認できたら(テスト成功したら)、`Renovate`によるautomergeが動く、ということのようです。
今回はautomergeの検証用に、[skipStatusChecks](https://docs.renovatebot.com/presets-default/#skipstatuschecks)というオプションを使用しています。
このオプションを設定することで、テストの実行結果の確認はスキップされ、automergeが行われます。

上記をリポジトリにプッシュします。

![スクリーンショット 2022-04-15 9.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/bac71429-74ff-5fd7-141e-f6b36609b5c8.png)

`Renovate`による変更が自動マージされ、requestライブラリが最新版(2.88.2)に更新されています。

# 【検証】packageRules
パッケージ名を指定して、指定パッケージの更新ルールなどを設定することができます。
例）
```json:renovate.json
{
  "extends": [
    "config:base"
  ],
  "packageRules": [
    {
      "matchPackagePatterns": ["org.junit.jupiter"]
    }
  ]
}
```

```gradle:build.gradle抜粋
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1"
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.9'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.9'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.6.9'
    testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.1'
}
```

上記のように設定することで、`org.junit.jupiter`パッケージの更新は1つのプルリクエストにまとめる、といったことができます。
上記をリポジトリにプッシュします。

![スクリーンショット 2022-04-12 21.59.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/98cbe5a6-d6f2-f868-c21c-d85030ea3452.png)

上記の感じに、複数のライブラリのバージョンアップデートをまとめて、1つのプルリクエストで作成されます。


# 【検証】schedule
scheduleを設定することで、`Renovate`による監視の実行タイミングを制御できます。
`before 3am on Monday`や、`before 2am`といった形に指定できます。
なお、[Schedule Presets](https://docs.renovatebot.com/presets-schedule/) を使用することもできます。
Schedule Presetsを使った場合、`schedule:earlyMondays`や`schedule:daily` といった形で設定できます。
意味はそれぞれ、さきほどの`before 3am on Monday`、`before 2am`と同義です。

ちなみに、いままではscheduleは特に設定せずに動かしていました。
その場合は、リポジトリに変更がプッシュされる都度、`Renovate`のチェックが走ります。

```json:renovate.json
{
  "extends": [
    "config:base"
  ],
  "schedule": "before 10pm"
}
```

```json:package.json抜粋
"devDependencies": {
    "request": "2.88.0"
  }
```

上記をリポジトリにプッシュします。

![スクリーンショット 2022-04-13 21.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/d6cce367-eeb1-d1d0-3a58-73317ba7ec7f.png)

プルリクエストが作成されます。


# 【検証】group:allNonMajor
group:allNonMajorは、[セマンティックバージョンニング](https://semver.org/lang/ja/)でいう、x.y.zのxにあたるメジャー以外のバージョン更新は、一つのプルリクエストにまとめる設定になります。

```json:renovate.json
{
  "extends": [
    "config:base",
    "group:allNonMajor"
  ]
}
```

```gradle:build.gradle抜粋
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0"
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.0'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'
    testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:0.6.1'
}
```

```json:package.json抜粋
"devDependencies": {
    "request": "2.88.0"
  }
```

上記をリポジトリにプッシュします。

![スクリーンショット 2022-04-13 21.55.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/95d198b4-c66e-b532-d28a-9c08f4bc4a0b.png)

プルリクエストが2つ作られ、

![スクリーンショット 2022-04-13 21.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/e812f1ba-e22e-9d11-3d22-569b9d2711b4.png)


all non-majorの方は1つのプルリクエストに変更がまとめられ、

![スクリーンショット 2022-04-13 21.58.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/ab33ba6a-0510-cde6-cf28-f8d5b2384bb5.png)

メジャーバージョン更新は別プルリクエストで作成されます。


# 終わりに
ここまで、簡単にですが`Renovate`のいくつかのオプションを試してみました。
ここで試したのはほんの一部で、さらにもっと多くのオプションがあるので、
興味ある方は、[公式サイト](https://docs.renovatebot.com/) を見てみてください。
読んでいただきありがとうございました！


# 参考情報
* [公式サイト](https://docs.renovatebot.com/)
* [Renovate でパッケージの依存関係を最新に保つ](https://goodpatch-tech.hatenablog.com/entry/how_to_use_renovate)
* [renovateはテストが一つもないと動かないので、そういうときは extends に skipStatusChecks を入れよう（ただし場合による）](https://qiita.com/U1F419/items/16b409092936020306be)