summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2019-12-30 14:17:06 +0100
committerGitHub <noreply@github.com>2019-12-30 14:17:06 +0100
commitf1b7112ac3cbe090e96f2c82c525b6db69b82034 (patch)
tree28d3132d3628d9e53fefec2d94a98cc564e2d94f
parentfce5826802ca36d451978baa83a97bfbc1d2475f (diff)
parentea7e0c3a35e94eec5242d9344db9bc4d54056497 (diff)
Merge pull request #11 from Mic92/build-host
Support for build hosts
-rw-r--r--README.md43
-rw-r--r--pkgs/krops/default.nix21
2 files changed, 57 insertions, 7 deletions
diff --git a/README.md b/README.md
index 323d08b..58156b1 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# krops (krebs ops)
-krops is a lightweigt toolkit to deploy NixOS systems, remotely or locally.
+krops is a lightweight toolkit to deploy NixOS systems, remotely or locally.
## Some Features
@@ -56,7 +56,9 @@ and run `$(nix-build --no-out-link krops.nix)` to deploy the target machine.
Under the hood, this will make the sources available on the target machine
below `/var/src`, and execute `nixos-rebuild switch -I /var/src`.
-## Deployment Target Attribute
+## Deployment Attributes
+
+### `target`
The `target` attribute to `writeDeploy` can either be a string or an attribute
set, specifying where to make the sources available, as well as where to run
@@ -84,9 +86,42 @@ pkgs.krops.writeDeploy "deploy" {
};
}
```
-
For more details about the `target` attribute, please check the `mkTarget`
-function in lib/default.nix.
+function in [lib/default.nix](lib/defaults.nix).
+
+### `backup` (optional, defaults to false)
+
+Backup all paths specified in source before syncing new sources.
+
+### `buildTarget` (optional)
+
+If set the evaluation and build of the system will be executed on this host.
+`buildTarget` takes the same arguments as target.
+Sources will be synced to both `buildTarget` and `target`.
+Built packages will be uploaded from the `buildTarget` to `target` directly
+This requires the building machine to have ssh access to the target.
+To build the system on the same machine, that runs the krops command,
+set up a local ssh service and set the build host to localhost.
+
+### `crossDeploy` (optional, defaults to false)
+
+Use this option if target host architecture is not the same as the build host
+architecture as set by `buildHost` i.e. deploying to aarch64 from a x86_64
+machine. Setting this option will disable building & running nix in the wrong
+architecture when running `nixos-rebuild` on the deploying machine. It is
+required to set `nixpkgs.localSystem.system` in the NixOS configuration to the
+architecture of the target host. This option is only useful if the build host
+also has remote builders that are capable of producing artifacts for the deploy
+architecture.
+
+### `fast` (optional, defaults to false)
+
+Run `nixos-rebuild switch` immediately without building the system
+in a dedicated `nix build` step.
+
+### `force` (optional, defaults to false)
+
+Create the sentinel file (`/var/src/.populate`) before syncing the new source.
## Source Types
diff --git a/pkgs/krops/default.nix b/pkgs/krops/default.nix
index a3e7745..16ef936 100644
--- a/pkgs/krops/default.nix
+++ b/pkgs/krops/default.nix
@@ -47,21 +47,36 @@ in
writeDeploy = name: {
backup ? false,
+ buildTarget ? null,
+ crossDeploy ? false,
fast ? false,
force ? false,
source,
target
}: let
+ buildTarget' =
+ if buildTarget == null
+ then target'
+ else lib.mkTarget buildTarget;
target' = lib.mkTarget target;
in
writeDash name ''
set -efu
+ ${lib.optionalString (buildTarget' != target')
+ (populate { inherit backup force source; target = buildTarget'; })}
${populate { inherit backup force source; target = target'; }}
${lib.optionalString (! fast) ''
- ${rebuild ["dry-build"] target'}
- ${build target'}
+ ${rebuild ["dry-build"] buildTarget'}
+ ${build buildTarget'}
''}
- ${rebuild ["switch"] target'}
+ ${rebuild ([
+ "switch"
+ ] ++ lib.optionals crossDeploy [
+ "--no-build-nix"
+ ] ++ lib.optionals (buildTarget' != target') [
+ "--build-host" "${buildTarget'.user}@${buildTarget'.host}"
+ "--target-host" "${target'.user}@${target'.host}"
+ ]) buildTarget'}
'';
writeTest = name: {