パッケージのgo.modのgoディレクティブのバージョンを最新の1つ前のマイナーバージョン(oldstable)に強制するoldstableを作った

確かに、あまり気にせずgovluncheckに引っ掛かったら即、最新バージョンに上げていたので良くないなあと反省。

というわけで、再発防止ということで作りました*1

github.com

これは何?

指定したgo.modのgoディレクティブのバージョンが最新の1つ前のマイナーバージョンかどうかを確認するツール、もしくはGitHub Actionです。

例えば最新のGoのバージョンが1.22.4だった場合、普通に使用するとgoディレクティブがマイナーバージョン1.21の最新のパッチバージョン(2024年7月1日時点では1.21.11)でないとエラーになります。

$ oldstable
Error: version of go directive in go.mod is not latest oldstable (oldstable: 1.21.11, current: 1.22.4)

1.22.4という最新バージョンでもダメで、1.21.10という最新ではないパッチバージョンでもダメです。govulncheckとの併用を想定しているので、厳しめなルールです*2

ちなみにGitHub Actionとしても提供されていて、次のように書くことでチェックできます。

# .github/workflows/oldstable.yml
[...]
    steps:
      -
        name: Check if version of go directive in go.mod is oldstable
        uses: k1LoW/oldstable@v1
        # with:
        #   go-mod-file: go.mod
        #   lax: false

laxモード

「最新バージョンの1つ前のマイナーバージョンの最新のパッチバージョン」が厳しいという人のためにlaxモードも提供しています。

これは、マイナーバージョンだけチェックする形になっています。

チェックルールとしては次のような感じです。

oldstable go directive lax mode (--lax) check
1.21.11 1.21.11 false ok
1.21.11 1.21.6 false ng
1.21.11 1.22.4 false ng
1.21.11 1.21 false ng
1.21.11 1.21.6 true ok
1.21.11 1.22.4 true ng
1.21.11 1.21 true ok

oldstable って?

actions/setup-go で使われていたaliasです。stable が最新バージョンで、oldstable がその前のマイナーバージョンの最新です。良さげな命名だったので使わせてもらっています。

というわけで

私が管理していて「主にツールではなくライブラリとして使うことを想定しているパッケージ」には随時入れていこうと思います。

こんな感じですね。

github.com

すでにgoディレクティブを1.22に上げているものが多いので、1.23のリリースまでお待ちくださいませ。

*1:というのも気をつけないといけないパッケージが多すぎるので...

*2:どうせgovulncheckでパッチバージョンを上げることを求められる