Local part of magic rollbacks.

This commit is contained in:
Chloe Kever 2022-02-23 12:42:56 -08:00
parent 6244aa6deb
commit 45370615fe

View file

@ -26,6 +26,28 @@
where = n.buildOn or "remote"; where = n.buildOn or "remote";
remote = if where == "remote" then true else if where == "local" then false else abort "_module.args.nixinate.buildOn is not set to a valid value of 'local' or 'remote'"; remote = if where == "remote" then true else if where == "local" then false else abort "_module.args.nixinate.buildOn is not set to a valid value of 'local' or 'remote'";
switch = if dryRun then "dry-activate" else "switch"; switch = if dryRun then "dry-activate" else "switch";
rollbackScript = let
inherit (builtins) toString;
inherit (final.lib.strings) optionalString;
r = n.rollback or {};
enabled = r.enabled or true;
init = r.init or 500;
limit = r.limit or 8;
timeout = r.timeout or 10;
in optionalString enabled ''
rollbackAccumulator=${toString limit}
exponent=0
until ${final.openssh}/bin/ssh -o ConnectTimeout=${toString timeout} -t ${user}@${host} 'sudo rm /tmp/.nixinate-deploy-success'; do
rollbackWait=$((${toString init} * (2 ** exponent++)))
echo "Could not access ${machine}, trying again in $rollbackWait milliseconds." &>2
sleep $((rollbackWait / 1000))
if [[ $((--rollbackAccumulator)) == 0 ]]; # --rollbackAccumulator may appear as a flag, however it's inside of $(()), so it decrements the value and yields it.
echo "Cannot access ${machine}. Rollback will happen." &>2
exit 1
]];
done
'';
script = '' script = ''
set -e set -e
echo "🚀 Deploying nixosConfigurations.${machine} from ${flake}" echo "🚀 Deploying nixosConfigurations.${machine} from ${flake}"
@ -39,7 +61,9 @@
'' else '' '' else ''
echo "🔨 Building system closure locally, copying it to remote store and activating it:" echo "🔨 Building system closure locally, copying it to remote store and activating it:"
( set -x; NIX_SSHOPTS="-t" ${final.nixos-rebuild}/bin/nixos-rebuild ${switch} --flake ${flake}#${machine} --target-host ${user}@${host} --use-remote-sudo ) ( set -x; NIX_SSHOPTS="-t" ${final.nixos-rebuild}/bin/nixos-rebuild ${switch} --flake ${flake}#${machine} --target-host ${user}@${host} --use-remote-sudo )
''); '') + rollbackScript + ''
echo "${machine} has finished deploying."
'';
in final.writeScript "deploy-${machine}.sh" script; in final.writeScript "deploy-${machine}.sh" script;
in in
{ {