GitHub ActionsとHugoを使用して静的サイト生成を行う場合、peaceiris/actions-hugo を使用するか、自分で適当にHugoをインストールするかのいずれかが一般的だと思います。このブログでは、セットアップ当初はpeaceiris/actions-hugoを使っていたのですが、最近debパッケージを自分でインストールする方式に切り替えました。 gohugoio/hugoのreleases から直接debパッケージを持ってきているので、peaceiris/actions-hugoとは違いlatest指定をする事ができず、Hugoの更新を手動で行う必要があり、ちょっと面倒だな〜と感じていました(しかもHugoは結構開発が活発で、更新もはやいんですよね)。

仕事のリポジトリでは最近renovateがどんどん導入されているので、これを機にrenovateを導入することにしました。

HugoのバージョンはGitHub ActionsのWorkflowファイル内にenvで指定されていて 、もちろん標準状態のrenovateはこれを検知・更新してくれません。これに対応するには、regexManagers を使用します。

regexManagersは正規表現でバージョン番号を引っかけて更新してくれるmanager で、fileMatchmatchStringsという二つの正規表現を書くことで使う事ができます。

fileMatchはその名の通り、どのファイルを監視するかを指定する正規表現で、今回はGitHub Actionsの設定ファイルを監視して欲しいので、デフォルトのgithub-actions managerが監視する正規表現をそのままコピーしてきて使用しました。

1
2
3
4
"fileMatch": [
   "^(workflow-templates|\.github\/workflows)\/[^/]+\.ya?ml$",
   "(^|\/)action\.ya?ml$"
]

matchStringsはバージョンを引っかけるための正規表現で、datasourcedepNamecurrentValueの三つの値をキャプチャするか、datasourceTemplatedepNameTemplatecurrentValueTemplateで値を指定する必要があります。datasource(datasourceTemplate)とdepName(depNameTemplate)はバージョンを比較するためのデータソースと依存の名称で、今回はGitHub上にあるgohugoio/hugoリポジトリのリリースと比較をしたいため、datasourceTemplategithub-releasesを、depNameTemplategohugoio/hugoを指定しました。currentValue(currentValueTemplate)は現在のバージョン番号を表す値で、これはGitHub Actionsの設定ファイルに書かれている値なので、matchStringsで引っかけてキャプチャします。

1
2
3
4
5
"matchStrings": [
  "HUGO_VERSION: (?<currentValue>.*)"
],
"datasourceTemplate": "github-releases",
"depNameTemplate": "gohugoio/hugo"

設定ファイル全体としては次の様になります:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": [
    "config:base"
  ],
  "regexManagers": [
    {
      "fileMatch": [
         "^(workflow-templates|\.github\/workflows)\/[^/]+\.ya?ml$",
         "(^|\/)action\.ya?ml$"
      ],
      "matchStrings": [
        "HUGO_VERSION: (?<currentValue>.*)"
      ],
      "datasourceTemplate": "github-releases",
      "depNameTemplate": "gohugoio/hugo"
    }
  ]
}

これで無事renovateがHugoのバージョンをチェックしてくれる 様になりました。めでたしめでたし。