From eedac010caa92d13fb7020736bb1c3f9b1c26f71 Mon Sep 17 00:00:00 2001 From: m3tam3re
Date: Sat, 4 Jul 2026 09:30:16 +0200 Subject: [PATCH] refactor: split n8n overlay override --- docs/packages/README.md | 2 +- flake.nix | 12 +------- overlays/default.nix | 16 +++++++++++ overlays/mods/default.nix | 57 -------------------------------------- overlays/mods/n8n.nix | 24 ++++++++++++++++ tests/n8n-overlay-test.nix | 22 ++++++++++++--- 6 files changed, 60 insertions(+), 73 deletions(-) create mode 100644 overlays/default.nix delete mode 100644 overlays/mods/default.nix create mode 100644 overlays/mods/n8n.nix diff --git a/docs/packages/README.md b/docs/packages/README.md index 9d65654..d911c7f 100644 --- a/docs/packages/README.md +++ b/docs/packages/README.md @@ -36,7 +36,7 @@ These entries override upstream nixpkgs packages via `overlays.modifications`. T | Package | Source | Modification | Location | |---------|--------|--------------|----------| -| `n8n` | `nixpkgs#n8n` | Pins a newer release and fetch hashes | `overlays/mods/default.nix` | +| `n8n` | `nixpkgs#n8n` | Pins a newer release and fetch hashes | `overlays/mods/n8n.nix` | ### Pass-Through Packages diff --git a/flake.nix b/flake.nix index b2bb4d0..f626b22 100644 --- a/flake.nix +++ b/flake.nix @@ -48,17 +48,7 @@ import ./pkgs {inherit pkgs inputs;}); # Overlays - can be imported in your system configuration - overlays = { - # Default overlay: adds all custom packages and applies package modifications. - default = final: prev: - import ./pkgs { - pkgs = final; - inputs = inputs; - } - // import ./overlays/mods {inherit prev;}; - - modifications = final: prev: import ./overlays/mods {inherit prev;}; - }; + overlays = import ./overlays {inherit inputs;}; # NixOS modules - for system-level configuration nixosModules = { diff --git a/overlays/default.nix b/overlays/default.nix new file mode 100644 index 0000000..c0d0695 --- /dev/null +++ b/overlays/default.nix @@ -0,0 +1,16 @@ +{inputs, ...}: let + # Package modifications for upstream nixpkgs packages. + modifications = final: prev: { + n8n = import ./mods/n8n.nix {inherit prev;}; + }; +in { + # Default overlay: adds all custom packages and applies package modifications. + default = final: prev: + import ../pkgs { + pkgs = final; + inherit inputs; + } + // (modifications final prev); + + inherit modifications; +} diff --git a/overlays/mods/default.nix b/overlays/mods/default.nix deleted file mode 100644 index c1532ce..0000000 --- a/overlays/mods/default.nix +++ /dev/null @@ -1,57 +0,0 @@ -{prev}: { - # n8n advances quickly. Keep using nixpkgs' package expression and only override - # the release-specific fetch hashes when we need a newer stable than upstream. - n8n = prev.n8n.overrideAttrs (finalAttrs: previousAttrs: { - version = "2.29.4"; - - src = prev.fetchFromGitHub { - owner = "n8n-io"; - repo = "n8n"; - tag = "n8n@${finalAttrs.version}"; - hash = "sha256-Vc10fXKn21PSlv6Sk+5zyi2efkKup1Vi+9+vyJd2I1k="; - }; - - pnpmDeps = prev.fetchPnpmDeps { - inherit (finalAttrs) pname version src; - pnpm = prev.pnpm_10; - fetcherVersion = 3; - hash = "sha256-2UFKP5bo06afaMPD+dIYQ7O0NiyZai4i8vkidi7HfxE="; - }; - - preBuild = '' - # Force sass-embedded to use our dart-sass instead of bundled binaries. - # The bundled Dart binary can't run in the Nix sandbox (no /lib64/ld-linux-x86-64.so.2). - for dep in node_modules/.pnpm/sass-embedded@*; do - substituteInPlace "$dep/node_modules/sass-embedded/dist/lib/src/compiler-path.js" \ - --replace-fail \ - 'compilerCommand = (() => {' \ - 'compilerCommand = (() => { return ["${prev.lib.getExe prev.dart-sass}"];' - done - ''; - - buildPhase = '' - runHook preBuild - - pushd node_modules/sqlite3 - node-gyp rebuild - popd - - # isolated-vm is a native addon required by n8n-nodes-base (Merge node SQL sandbox) - # since n8n 2.11.x; must be compiled before pnpm build runs generate-metadata - pushd node_modules/isolated-vm - node-gyp rebuild - popd - - # TODO: use deploy after resolved https://github.com/pnpm/pnpm/issues/5315 - pnpm build --filter=n8n - - runHook postBuild - ''; - - meta = - previousAttrs.meta - // { - changelog = "https://github.com/n8n-io/n8n/releases/tag/n8n@${finalAttrs.version}"; - }; - }); -} diff --git a/overlays/mods/n8n.nix b/overlays/mods/n8n.nix new file mode 100644 index 0000000..dc8a5b3 --- /dev/null +++ b/overlays/mods/n8n.nix @@ -0,0 +1,24 @@ +{prev}: +prev.n8n.overrideAttrs (finalAttrs: previousAttrs: { + version = "2.29.4"; + + src = prev.fetchFromGitHub { + owner = "n8n-io"; + repo = "n8n"; + tag = "n8n@${finalAttrs.version}"; + hash = "sha256-Vc10fXKn21PSlv6Sk+5zyi2efkKup1Vi+9+vyJd2I1k="; + }; + + pnpmDeps = prev.fetchPnpmDeps { + inherit (finalAttrs) pname version src; + pnpm = prev.pnpm_10; + fetcherVersion = 3; + hash = "sha256-2UFKP5bo06afaMPD+dIYQ7O0NiyZai4i8vkidi7HfxE="; + }; + + meta = + previousAttrs.meta + // { + changelog = "https://github.com/n8n-io/n8n/releases/tag/n8n@${finalAttrs.version}"; + }; +}) diff --git a/tests/n8n-overlay-test.nix b/tests/n8n-overlay-test.nix index c5e3c22..6873eaf 100644 --- a/tests/n8n-overlay-test.nix +++ b/tests/n8n-overlay-test.nix @@ -4,15 +4,16 @@ self, }: let localPackages = import ../pkgs {inherit pkgs inputs;}; - mkPkgsWithOverlay = overlay: + mkPkgs = overlays: import inputs.nixpkgs { system = pkgs.stdenv.hostPlatform.system; config.allowUnfree = true; - overlays = [overlay]; + inherit overlays; }; - modifiedPkgs = mkPkgsWithOverlay self.overlays.modifications; - defaultPkgs = mkPkgsWithOverlay self.overlays.default; + upstreamPkgs = mkPkgs []; + modifiedPkgs = mkPkgs [self.overlays.modifications]; + defaultPkgs = mkPkgs [self.overlays.default]; expectedVersion = "2.29.4"; expectedSrcHash = "sha256-Vc10fXKn21PSlv6Sk+5zyi2efkKup1Vi+9+vyJd2I1k="; @@ -29,14 +30,27 @@ else if package.meta.changelog != expectedChangelog then throw "${overlayName} n8n changelog is ${package.meta.changelog}, expected ${expectedChangelog}" else "ok"; + + checkPhasesInherited = overlayName: package: + if (package.preBuild or null) != (upstreamPkgs.n8n.preBuild or null) + then throw "${overlayName} n8n preBuild should be inherited from upstream nixpkgs" + else if package.buildPhase != upstreamPkgs.n8n.buildPhase + then throw "${overlayName} n8n buildPhase should be inherited from upstream nixpkgs" + else "ok"; in pkgs.runCommand "n8n-overlay-test" { + n8nOverlayFile = + if builtins.pathExists ../overlays/mods/n8n.nix + then "ok" + else throw "n8n overlay override must live in overlays/mods/n8n.nix"; localN8nAbsent = if localPackages ? n8n then throw "pkgs/default.nix must not export a local n8n package" else "ok"; modificationsOverlayN8n = checkN8nOverride "overlays.modifications" modifiedPkgs.n8n; defaultOverlayN8n = checkN8nOverride "overlays.default" defaultPkgs.n8n; + modificationsOverlayPhases = checkPhasesInherited "overlays.modifications" modifiedPkgs.n8n; + defaultOverlayPhases = checkPhasesInherited "overlays.default" defaultPkgs.n8n; } '' touch $out ''