VISASQ Dev Blog

ビザスク開発ブログ

Renovateを導入してterraform providerを自動更新する

インフラを管理する際にTerraform Providerのアップデートが面倒になって放置していませんか?
それ、Renovateで解決できます。

こんにちは!DPEチームの酒井です!

弊社ではインフラの管理にTerraformを利用していますが、Providerのバージョンアップデートは後回しにされていました。
そこで導入したものが、依存関係を自動更新してくれるRenovateになります。

Renovateとは?

docs.renovatebot.com

Renovateはリポジトリの依存関係を自動的に検出し、更新を効率的に管理するツールです。

機能としては、最新の依存関係に関するPRの自動作成や、条件を満たした場合の自動マージがあります。また、様々なオプション設定により、柔軟なカスタマイズをすることが可能です。

Renovateの使い方

導入

GitHubを使っている場合には、GitHub Appとしてインストールが可能です。
https://github.com/apps/renovate

追加をすると自動的にonboardingが始まりますが、organizationの場合には以下のRenovate console画面から設定が必要です。 設定後onboardingが始まり、configファイルを追加するPRが作成されます。
https://developer.mend.io/

現在の設定ファイル

renovate.json5

{
  $schema: "https://docs.renovatebot.com/renovate-schema.json",
  extends: [
    "github>aquaproj/aqua-renovate-config#2.3.0",
    "github>aquaproj/aqua-renovate-config:installer-script#2.3.0(Dockerfile)",
    "config:recommended",
    "group:allNonMajor",
  ],
  timezone: "Asia/Tokyo",
  schedule: ["* 8-23 1-3 * *"],
  reviewers: ["team:dpe"],
  labels: ["renovate"],
  // terraformのciが同時実行して失敗しないように、1時間に1回しかPRを作成しない
  prHourlyLimit: 1,
  prConcurrentLimit: 40,
  branchConcurrentLimit: 40,
  // 下の方がルールの優先度が高い
  packageRules: [
    {
      matchFileNames: ["aqua.yaml"],
      groupName: "aqua packages",
    },
    {
      matchPackagePatterns: ["^aquaproj"],
      groupName: "aqua",
    },
    {
      matchFileNames: ["**/*.tf"],
      groupName: "terraform provider",
    },
    {
      matchPackageNames: ["hashicorp/terraform"],
      groupName: "terraform provider",
    },
    // マイナーとパッチバージョンの0.*以外を自動マージする
    {
      "matchUpdateTypes": ["minor", "patch"],
      "matchCurrentVersion": "!/^(v)?0/",
      "automerge": true,
      "groupName": "non-0.x packages"
    }
  ],
}

設定ファイル詳細

上記の設定ファイルで設定しているものをピックアップして紹介します。

  1. extends

    既に作成されているプリセットを記述する部分になります。

     "github>aquaproj/aqua-renovate-config#2.3.0",
     "github>aquaproj/aqua-renovate-config:installer-script#2.3.0(Dockerfile)",
    

    弊社ではCLIのパッケージ管理ツールとしてaquaを使用しています。 aquaで管理しているパッケージをRenovateの対象とするプリセットです。

     "group:allNonMajor"
    

    メジャーバージョンとそれ以外のバージョンのPRを分けるようにするプリセットです。

  2. schedule

    RenovateがPRを作成する時間を指定できます。
    cronかlaterで記述することができます。

      ["* 8-23 1-3 * *"]
    

    後々説明しますが、月初の1~3日の8~23時の間にPRを作成するようにしています。

  3. reviewers

    PRが作成された時のreviewersを設定できます。

     ["team:dpe"]
    

    チームを設定することによって、チームの中からランダムで一人が割り当てられます。

  4. prHourlyLimit・prConcurrentLimit・branchConcurrentLimit

    それぞれ以下の通りです。

    prHourlyLimit:1時間の間に作成されるPRの数 prConcurrentLimit:現在作成されているPRの上限数 branchConcurrentLimit:現在作成されているbranchの上限数

    scheduleの話に戻りますが、prHourlyLimitが1に設定されている場合にはscheduleを範囲で設定しないとPRが1つだけ作成されて終わってしまうため注意が必要です。

  5. packageRules

    各パッケージごとのルールを細かく設定することができます。
    基本的にはgroupNameと、matchFileNameなどを組み合わせて記述します。
    一番下のルールが優先されますので注意が必要です。

     {
       matchFileNames: ["aqua.yaml"],
       groupName: "aqua packages",
     },
     {
       matchPackagePatterns: ["^aquaproj"],
       groupName: "aqua",
     },
    

    aqua関係のパッケージをそれぞれのPRにまとめるようにしています。

     {
       matchFileNames: ["**/*.tf"],
       groupName: "terraform provider",
     },
     {
       matchPackageNames: ["hashicorp/terraform"],
       groupName: "terraform provider",
     },
    

    groupNameをどちらもterraform providerとすることで、同じPRにまとまるようにしています。
    分けて書いている理由としては、matchFileNamesとmatchPackageNamesを同じところに書いてしまうとAND条件となってしまう為です。

    また、中にはOR条件で指定されるものもありますので注意が必要です。 https://github.com/renovatebot/renovate/discussions/13644

自動マージについて

packageRulesのautomergeをtrueにすることによって、そのPRは自動マージの対象となります。

{
    "matchUpdateTypes": ["minor", "patch"],
    "matchCurrentVersion": "!/^(v)?0/",
    "automerge": true,
    "groupName": "non-0.x packages"
}

GitHub ActionsなどのCIが失敗している場合には、自動マージされず、失敗を検知した時点でreviewerに設定している人がアサインされます。

approveを必須にしている場合には、以下のrenovate-approveを導入することで自動的にapproveしてくれてマージされるようになります。 https://github.com/apps/renovate-approve

弊社では現在以下が達成されるような設定にしています。

  • 0.x系以外のminor、patchバージョンのアップデートを自動マージにする
  • 自動マージの場合でもPRは作成する
  • 自動マージの場合にはterraformのplanが同時に走るとテストがエラーになるため、1時間に1つまでPRを作成する

Tips

Renovate Configファイルのバリデーションはどうしたらいい?

Renovateにはdry-runやvalidatorが存在していますので、こちらを実行します。

validator
https://docs.renovatebot.com/config-validation/

$ npm install --global renovate
added 750 packages, and audited 751 packages in 51s
$ renovate-config-validator
 INFO: Validating renovate.json
 INFO: Config validated successfully

dry-run

export GH_TOKEN="$(gh auth status -t 2>&1 | grep -o 'gho_.*')" && \
LOG_LEVEL=debug RENOVATE_CONFIG_FILE=renovate.json5 \
renovate \
   --token=$GH_TOKEN \
   --schedule="" \
   --require-config=ignored \
   --dry-run=full \
   sample/sample-repository

おわりに

今回は弊社のRenovateの設定を紹介しました。

自動マージに関しては、Renovateを導入してから数ヶ月後に導入しましたので、まずは簡単なリポジトリにRenovateを導入して手動で運用していくのが良いかと思います。

パッケージのバージョンアップデートは後回しにされがちですが、自動化することで自然と最新が維持できるようになりますのでオススメです!

ビザスクではエンジニアの仲間を募集しています! 少しでもビザスク開発組織にご興味を持たれた方は、ぜひ一度カジュアルにお話ししましょう! developer-recruit.visasq.works