🌵

Renovate で GitHub Releases を管理対象にする方法

2024/02/16に公開

依存関係の更新を自動でやってくれる Renovate ですが、大体の依存関係は自動で認識してくれるもののやはり中には認識してくれない依存関係もありますよね。

自分の場合はとあるツールの GitHub Releases がそれにあたったのですが、Renovate が認識できるようにするのに少し骨が折れました。。そのため記事を残しておこうと思います。

解決したい課題・ゴール

Renovate に GitHub Releases で公開されているツールを認識させて管理対象にしたい

Renovate は大体にパッケージを自動で認識してくれますが、中には認識してくれないものもあります。

例えば GitHub Actions などのCIの中で、GitHub Releases で公開されているツールを curlwgetを使って取得する場合などがありますが、これは Renovate は自動では認識してくれません。(以下のコードではtfcmtというツールを wget しています。)

- name: setup tfcmt
    env:
      TFCMT_VERSION: v3.4.1
    run: |
      wget "https://github.com/suzuki-shunsuke/tfcmt/releases/download/${TFCMT_VERSION}/tfcmt_linux_amd64.tar.gz" -O /tmp/tfcmt.tar.gz
      tar xzf /tmp/tfcmt.tar.gz -C /tmp
      mv /tmp/tfcmt /usr/local/bin
      tfcmt --version

引用元:https://zenn.dev/kou_pg_0131/articles/tfcmt-on-gh-actions

今回はこの tfcmt ツールを Renovate の管理対象にしていきます。

結論

今回の場合は以下の書き方で Renovate が tfcmt を認識してくれます。

{
    "customManagers": [
        {
          "customType": "regex",
          "fileMatch" : ["*.yml"],
          "matchStrings" : [
            "TFCMT_VERSION: (?<currentValue>.*?)\\n"
          ],
          "datasourceTemplate": "github-releases",
          "depNameTemplate": "suzuki-shunsuke/tfcmt",
        }
    ]
}

解説編

書き方に関しては、以下の公式記事が非常に参考になります。
https://docs.renovatebot.com/modules/manager/regex/

このZenn記事では、Renovate の動作と用語を再確認しながらカスタムパッケージ(今回は GitHub Releases )の更新方法について説明していきます。

1. Renovate の動作と用語について

まず、Renovate は以下の流れで動作します。

  1. リポジトリ内をスキャンし、package fileを探す
  2. package file内のdependencyを認識する
  3. dependencydatasourceを見に行き、新しいバージョンの有無を確認する

package file とはパッケージマネージャー(npmとか)によって管理されているファイルで、中に依存関係が記されているファイルです。package.jsongo.modなどは package file です。

We use the term "package file" to describe files which reference dependencies. Package files are managed by a "package manager".
https://docs.renovatebot.com/getting-started/use-cases/#updating-of-package-files

dependencypackage file内に書かれているパッケージのことで、Renovate にバージョン管理して欲しい対象そのものです。それぞれのdependencydatasourceを持っています。datasourceはパッケージの配布場所と考えて良さそうで、Renovate はdatasourceを見ることでdependencyの新しいバージョンを確認します。

After Renovate's manager scanned the files and extracted the dependencies, it assigns a datasource to each extracted package file or dependency. The datasource tells Renovate how to search for new versions.
https://docs.renovatebot.com/modules/datasource/

ここまでが Renovate の動作と用語です。

customManagers の利用

Renovate は上記の流れでパッケージの更新管理を行うのですが、最初のpackage fileをうまく発見してくれなかったり、発見するも中のdependencyをうまく発見してくれなかったりして、完全に期待通りにパッケージの更新管理をしてくれないこともあります。

今回の GitHub Actions の .yml ファイルの中に書かれている tfcmt がまさにその例です。

この問題は customManagers を設定ファイルに書くことで解決できます。
以下の2つのリンクがその説明ページになります。

https://docs.renovatebot.com/configuration-options/#custommanagers
https://docs.renovatebot.com/modules/manager/regex/

ドキュメントにもありますが、customManagers の中では fileMatch, matchStrings, dependency name, datasource, の4つを少なくとも定義する必要があります。この指示により Renovate が dependency を見つけられるようになります。

例えば今回の tfcmt の場合を考えます。

fileMatch

tfcmt は GitHub Actions の ワークフローに書かれているので Renovate には *.ymlの中を見るように指示します。

matchStrings

tfcmt のバージョンは 以下のように書かれてあります。

env:
    TFCMT_VERSION: v3.4.1

これに合わせた正規表現を考えます。ここの正規表現は ECMAScript (JavaScript) flavor of regex というものを使っているようです。そのあたりの注意点も先ほどのドキュメントに書かれてあります。

行かのように書きました。

"matchStrings" : [
            "TFCMT_VERSION: (?<currentValue>.*?)\\n"
          ],

dependency name

tfcmt は suzuki-shunsuke/tfcmt という名前で公開されています。

"depNameTemplate": "suzuki-shunsuke/tfcmt",

datasource

tfcmt は GitHub Releases で公開されています。
Renovate の datasource 一覧を見たところ github-releases という名前でサポートされているようなので、これが使えそうです。

https://docs.renovatebot.com/modules/datasource/

"datasourceTemplate": "github-releases",

以上の 4 つの情報を統合して、記事の冒頭で紹介した以下の customManagers を書けば良さそうだと分かりました。

{
    "customManagers": [
        {
          "customType": "regex",
          "fileMatch" : ["*.yml"],
          "matchStrings" : [
            "TFCMT_VERSION: (?<currentValue>.*?)\\n"
          ],
          "datasourceTemplate": "github-releases",
          "depNameTemplate": "suzuki-shunsuke/tfcmt",
        }
    ]
}

おわりに

Renovate で GitHub Releases を管理対象にする方法を書きました。
GitHub Releases 以外にも、Renovate がデフォルトで管理してくれないパッケージに対して使える方法なので、少しでも参考になれば嬉しいです。

Discussion