• 作成:

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で確認するべきとか? でもそれは二度手間な気がします。

解決

とりあえず以下のようにcheckspackagesを全部追加してやるだけで解決しました。雑に追加するだけで重複とかはしないようです。

checks =
  flake.checks
  // flake.packages # テストがないパッケージもビルドしてエラーを検出する。
  // {
    formatting = treefmtEval.config.build.check self;
  };

これでついでにlibだけではなくexeもチェックされるようになります。

疑問

このようなことをするのは普通なのでしょうか? 最初から含まれても良い気がします。

hydraJobsのセクションなら最初から含まれているから、それを使うべきなのかも? しかしhydra用の機能をGitHub Actionsに使うのは乱用な気がします。それにローカルでもnix flake checkでまとめてチェックできるようにしておいた方が色々と便利だと思います。