stefafafan の fa は3つです

"すてにゃん" こと id:stefafafan のブログです

GitHub Actions の actions/setup-go などで go-version: 1.20 を指定すると Go 1.2 が入ってしまう件

先日リリースされた Go 1.20GitHub Actionsで使いたい場合、以下のような記述をすると Go 1.2 が入ってしまいます。

- uses: actions/setup-go@v3
   with:
    go-version: 1.20

この件は golangci-lint の Go 1.20 対応 Pull Request でもはまっていたのをみかけました。
github.com

対処法としては以下のように文字列として指定するとちゃんと 1.20 が入ります。

 - uses: actions/setup-go@v3
    with:
-     go-version: 1.20
+     go-version: '1.20'

もしくは、 go-version-file を指定してファイルからバージョンをパースする形にした場合もちゃんと 1.20 が入るっぽいです。

 - uses: actions/setup-go@v3
    with:
-     go-version: 1.20
+     go-version-file: 'go.mod'
// go.mod ファイルの例
module example.com/hello

go 1.20

go-version-file については以前もブログで紹介しました、他の言語の setup 系でも対応していることが多いです。なおバージョンをパースする実装はそれぞれのActionで書かれていそうなのでもしかしたら挙動にばらつきがあるかもしれません。
blog.stenyan.jp

そもそもこの挙動の原因はどこにあるのか

例えば actions/setup-go にPull Requestを出してこの現象を回避できればみんな助かりそうと思いましたが、どうやら他の言語でも同じことは起きていそうで、Actionsのyamlはこういう挙動になっているということがわかりました。

issue が actions/runner に立っていますが、2023/2現在まだOpenな状態です。
github.com

コメントのやり取りを見る限り、runnerのYAMLをパースする処理で integer も float もまとめて numberToken としてパースしてしまっているためか最終的に区別がつかなくなっているのではないかとのこと。
github.com

同じ人がそろそろ治せると良さそうだねと先週コメントしていたのでもしかしたらそのうち治るかもしれませんね。
github.com

治るまでの間はこういうfloatっぽい数値は文字列として指定する、みたいに意識して書く必要がありそうです。