Beachte: Zur Zeit des Posts nutze ich Renovate v39. Das Konzept könnte sich mit einer späteren Version verändern; aber solange ich diesen Blog betreibe, werde ich vermutlich auch ein Update schreiben.

Mein Problem

Ich baue meinen Blog mit Hugo, und das Deployment passiert via Forgejo Actions. Bisher hatte ich ein Skript das einfach die aktuellste Version von Hugo heruntergeladen hat und das für den Bau verwendet hat.

In letzter Zeit habe ich festgestellt, dass das Fixieren einer Version schlau ist. Zusätzlich habe ich kürzlich Renovate aufgesetzt, also wollte ich beides zusammenführen.

Das Setup im repo

Ich habe im Repo jetzt eine neue Datei hugo-version.txt liegen. Die enthält nur zwei Zeilen:

0.145.0

Beachte: Die zweite Zeile ist eine Leerzeile, die mein Code Renderer scheinbar entfernt. Das muss ich irgendwann einmal reparieren…

Ich habe zusätzlich ein Download Skript, das bisher einfach die aktuellste Hugo-Version heruntergeladen hat; neuerdings nutzt das Skript aber diese Datei zum Feststellen der Version. Die Referenz zu diesem Skript ist unter Download Skript zu finden, falls Interesse besteht.

Renovate Setup

Renovate versteht diese Datei natürlich nicht, da müssen wir nachhelfen. Das renovate.json File existiert bereits im Repo; ich habe es um den folgenden Eintrag erweitert:

1
2
3
4
5
6
7
8
9
"customManagers": [
    {
        "customType": "regex",
        "fileMatch": ["^hugo-version\\.txt$"],
        "matchStrings": ["(?<currentValue>.*)\\n"],
        "depNameTemplate": "gohugoio/hugo",
        "datasourceTemplate": "github-releases"
    }
]

Kurze Erklärung was hier passiert:

  • Suche die Datei hugo-version.txt, und matche exakt diese Datei und nichts anderes. Beachte dass der Punkt . maskiert werden muss, da er sonst für ein beliebiges Zeichen steht. Zusätzlich muss ich den Backslash auch maskieren, um JSON nicht zu verwirren…
  • Der matchStrings Teil stellt fest, was in der Datei vorhanden ist: Eine Versionsnummer, und eine Leerzeile. Wie oben schon erwähnt, ist die Leerzeile wichtig.
  • depNameTemplate ist denkbar einfach: gohugoio/hugo - der Name des Repos in dem Hugo gebaut und released wird. Vermutlich könnten wir die Dependency auch in die Datei einfügen, aber das ist hier wirklich nicht nötig und würde das Download-Skript wieder verkomplizieren.
  • Das datasourceTemplate ist github-releases - da ich nach einem Github Release suche.

Fertig!

Ich habe einige Zeit benötigt um das aufzusetzen und um zu verstehen was passiert, aber jetzt am Ende ist das nicht allzu kompliziert!

Download Skript

Das alte Skript

Nur als Referenz, falls Interesse besteht.

1
2
3
4
5
6
7
curl -s  https://api.github.com/repos/gohugoio/hugo/releases/latest \
    | grep browser_download_url  \
    | cut -d '"' -f 4  \
    | grep 'hugo_extended_' \
    | grep '_linux-amd64.tar.gz' \
    | grep -v 'withdeploy' \
    | wget -i -

Nutze das gerne wie immer benötigt. Was hier passiert ist nicht allzu kompliziert.

Das neue Skript

Das wird wesentlich simpler:

1
2
VERSION=$(cat hugo-version.txt)
wget https://github.com/gohugoio/hugo/releases/download/v${VERSION}/hugo_extended_${VERSION}_linux-amd64.tar.gz

Nach dem Download

Egal welche Version des Skripts verwendet wird, danach muss die entstandene Datei entpackt werden und Hugo mit chmod +x ausführbar gemacht werden.