haskell.nixでテストが無いパッケージもnix flake checkでチェックする
背景
前回、
haskell.nixでのプロジェクト環境でnix flake checkでPostgreSQLへのアクセスを含むテストを実行する方法 - ncaq
でテストの実行環境をnix flake check
に統一しました。そうしたら20分ぐらいかかることもあるCIの実行時間をキャッシュが存分に効いているときは4分ぐらいに短縮される嬉しい結果を得ました。
しかしその後問題が起きて、
cabal build
ではエラーになるのに、
nix flake check
ではエラーにならないという現象が発生しました。その結果CIが通るからマージしたのにmasterブランチでビルドが通らないという事態が発生しました。
原因
原因を調べてみました。絶対にエラーが発生するように、該当するパッケージの必要な関数を削除してみたりしました。そうしてもnix flake check
ではエラーにならないことを確認しました。
しかし移行するときに、
cabalでビルドエラーが起きたらnix flake check
でもエラーになることは確認したのですが。
その前に確認したときにエラーを起こしたパッケージでビルドエラーを起こしてみたら、
nix flake check
でちゃんとエラーになることが確認できました。
パッケージの違いで何が起きているのか、もう少し詳しく原因を調査してみたところ、テストが定義されていないパッケージはnix flake check
でビルドされないことを知りました。
nix flake show
でリストに載っていないことが分かりやすく確認できます。
nix flake check
の哲学的にはそれで良いんだろうか。ビルドできるかどうかはnix build
で確認するべきとか?
でもそれは二度手間な気がします。
解決
とりあえず以下のようにchecks
にpackages
を全部追加してやるだけで解決しました。雑に追加するだけで重複とかはしないようです。
checks =
flake.checks
// flake.packages # テストがないパッケージもビルドしてエラーを検出する。
// {
formatting = treefmtEval.config.build.check self;
};
これでついでにlibだけではなくexeもチェックされるようになります。
疑問
このようなことをするのは普通なのでしょうか? 最初から含まれても良い気がします。
hydraJobs
のセクションなら最初から含まれているから、それを使うべきなのかも?
しかしhydra用の機能をGitHub Actionsに使うのは乱用な気がします。それにローカルでもnix flake check
でまとめてチェックできるようにしておいた方が色々と便利だと思います。