Renovate で GitHub Releases を管理対象にする方法
依存関係の更新を自動でやってくれる Renovate ですが、大体の依存関係は自動で認識してくれるもののやはり中には認識してくれない依存関係もありますよね。
自分の場合はとあるツールの GitHub Releases がそれにあたったのですが、Renovate が認識できるようにするのに少し骨が折れました。。そのため記事を残しておこうと思います。
解決したい課題・ゴール
Renovate に GitHub Releases で公開されているツールを認識させて管理対象にしたい
Renovate は大体にパッケージを自動で認識してくれますが、中には認識してくれないものもあります。
例えば GitHub Actions などのCIの中で、GitHub Releases で公開されているツールを curl
やwget
を使って取得する場合などがありますが、これは 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",
}
]
}
解説編
書き方に関しては、以下の公式記事が非常に参考になります。
このZenn記事では、Renovate の動作と用語を再確認しながらカスタムパッケージ(今回は GitHub Releases )の更新方法について説明していきます。
1. Renovate の動作と用語について
まず、Renovate は以下の流れで動作します。
- リポジトリ内をスキャンし、
package file
を探す -
package file
内のdependency
を認識する -
dependency
のdatasource
を見に行き、新しいバージョンの有無を確認する
package file
とはパッケージマネージャー(npmとか)によって管理されているファイルで、中に依存関係が記されているファイルです。package.json
やgo.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
dependency
はpackage file
内に書かれているパッケージのことで、Renovate にバージョン管理して欲しい対象そのものです。それぞれのdependency
はdatasource
を持っています。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つのリンクがその説明ページになります。
ドキュメントにもありますが、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
という名前でサポートされているようなので、これが使えそうです。
"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