writeDeploy: add support for build hosts

This allows to evaluate & build the system on the dedicated build host,
from which the build artifacts are uploaded onto the target machine.
This commit is contained in:
Jörg Thalheim 2019-12-29 21:43:58 +00:00 committed by tv
parent fce5826802
commit 402c9cac25
2 changed files with 43 additions and 7 deletions

View File

@ -1,6 +1,6 @@
# krops (krebs ops) # 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 ## 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 Under the hood, this will make the sources available on the target machine
below `/var/src`, and execute `nixos-rebuild switch -I /var/src`. 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 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 set, specifying where to make the sources available, as well as where to run
@ -84,9 +86,31 @@ pkgs.krops.writeDeploy "deploy" {
}; };
} }
``` ```
For more details about the `target` attribute, please check the `mkTarget` 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.
### `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 ## Source Types

View File

@ -47,21 +47,33 @@ in
writeDeploy = name: { writeDeploy = name: {
backup ? false, backup ? false,
buildTarget ? null,
fast ? false, fast ? false,
force ? false, force ? false,
source, source,
target target
}: let }: let
buildTarget' =
if buildTarget == null
then target'
else lib.mkTarget buildTarget;
target' = lib.mkTarget target; target' = lib.mkTarget target;
in in
writeDash name '' writeDash name ''
set -efu set -efu
${lib.optionalString (buildTarget' != target')
(populate { inherit backup force source; target = buildTarget'; })}
${populate { inherit backup force source; target = target'; }} ${populate { inherit backup force source; target = target'; }}
${lib.optionalString (! fast) '' ${lib.optionalString (! fast) ''
${rebuild ["dry-build"] target'} ${rebuild ["dry-build"] buildTarget'}
${build target'} ${build buildTarget'}
''} ''}
${rebuild ["switch"] target'} ${rebuild ([
"switch"
] ++ lib.optionals (buildTarget' != target') [
"--build-host" "${buildTarget'.user}@${buildTarget'.host}"
"--target-host" "${target'.user}@${target'.host}"
]) buildTarget'}
''; '';
writeTest = name: { writeTest = name: {