diff options
| author | tv <tv@krebsco.de> | 2026-11-12 01:20:02 +0000 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-11-12 01:20:02 +0000 |
| commit | 9fbc2ee11f47810a58ce2c96ae51c2969f974fa1 (patch) | |
| tree | 899d6143905c9ee185d8371767de66a1c2289532 | |
| parent | ea6d6b16fa422d3fb0a7fea671d3637b89751721 (diff) | |
krops writeDeploy: pass --no-flake if /etc/nixos/flake.nix exists
nixos-rebuild deploys /etc/nixos/flake.nix instead of NIX_PATH if that
file exists, so deploying anything but a flake fails on such targets.
Without writeDeploy's flake parameter, nixos-rebuild gets --no-flake if
/etc/nixos/flake.nix exists on the build target. nixos-rebuild versions
predating flakes neither know --no-flake nor look for that file, so they
don't get it.
The deploy VM test covers targets with and without that file.
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | pkgs/krops/default.nix | 5 | ||||
| -rw-r--r-- | tests/scenarios.nix | 11 |
3 files changed, 17 insertions, 3 deletions
@@ -137,7 +137,9 @@ draws inputs from other sources, its generated flake gets deployed, see [Flake inputs from sources](#flake-inputs-from-sources). This makes `nixos-rebuild` use `--flake`, and requires Nix with flake support (Nix 2.4 or later) on the build target. Without the name of the NixOS configuration, -`nixos-rebuild` uses the host name of the build target. +`nixos-rebuild` uses the host name of the build target. Without `flake`, +`nixos-rebuild` gets `--no-flake` if `/etc/nixos/flake.nix` exists on the +build target, so it deploys `NIX_PATH` instead of that flake. ### `force` (optional, defaults to false) diff --git a/pkgs/krops/default.nix b/pkgs/krops/default.nix index 429fc61..e4f72cd 100644 --- a/pkgs/krops/default.nix +++ b/pkgs/krops/default.nix @@ -16,7 +16,10 @@ in NIX_PATH=${lib.escapeShellArg target.path} \ nixos-rebuild ${lib.escapeShellArgs (args ++ lib.optionals (flake != null) [ "--flake" "${target.path}/${flake}" - ])} + ])} ${lib.optionalString (flake == null) + # nixos-rebuild deploys /etc/nixos/flake.nix if it exists. Any + # nixos-rebuild doing so supports --no-flake. + "$(test -e /etc/nixos/flake.nix && echo --no-flake)"} ''); runShell = target: { diff --git a/tests/scenarios.nix b/tests/scenarios.nix index 429cff8..ce356b0 100644 --- a/tests/scenarios.nix +++ b/tests/scenarios.nix @@ -418,6 +418,7 @@ in { # writeDeploy's arguments to nixos-rebuild, which a stand-in records. deploy = matrix "deploy" { flake = [ false true ]; + etcFlake = [ false true ]; buildTarget = [ false true ]; } (flags: ctx: let target = targets.${ctx.targetKind} ctx.path; @@ -429,13 +430,21 @@ in { "--target-host" "${target.user}@${target.host}" ] ++ optional (flags.buildTarget && target.sudo) "--use-remote-sudo" - ++ optionals flags.flake [ "--flake" "${build.path}/x" ]; + ++ optionals flags.flake [ "--flake" "${build.path}/x" ] + ++ optional (flags.etcFlake && !flags.flake) "--no-flake"; in # The local target can't have another build target. if flags.buildTarget && ctx.targetKind == "local" then null else { node = if flags.buildTarget then "deployer" else null; + # Each scenario creates or removes /etc/nixos/flake.nix. prepare = '' rm -f /tmp/nixos-rebuild.log + ${if flags.etcFlake then '' + mkdir -p /etc/nixos + touch /etc/nixos/flake.nix + '' else '' + rm -f /etc/nixos/flake.nix + ''} ''; phases = twice { sources.x = |
