depot/hosts/deploy.nix

66 lines
2.7 KiB
Nix
Raw Normal View History

2023-11-07 18:15:25 +02:00
{ config, lib, self, withSystem, ... }:
2023-02-24 16:16:15 +02:00
let
2023-11-07 18:15:25 +02:00
inherit (lib) const elem flip genAttrs mapAttrs';
inherit (config) gods defaultEffectSystem systems;
2023-02-24 16:16:15 +02:00
inherit (self) nixosConfigurations;
chosenHours = gods.fromLight;
withEffectSystem = withSystem defaultEffectSystem;
2023-11-07 18:15:25 +02:00
callUpon = hour: { ${hour} = nixosConfigurations.${hour}.config.system.build.toplevel; };
2023-02-24 16:16:15 +02:00
in
{
herculesCI = { config, ... }: {
2023-11-07 18:15:25 +02:00
onPush.default.outputs.effects = mapAttrs' (hour: const {
name = "deploy-${hour}";
value = withEffectSystem ({ hci-effects, ... }: let
inherit (hci-effects) runIf runCachixDeploy;
in runIf (elem config.repo.branch [ "master" "staging" ]) (
runCachixDeploy {
async = true;
deploy = {
agents = callUpon hour;
rollbackScript = genAttrs systems (flip withSystem ({ config, pkgs, ... }:
2023-11-07 18:15:25 +02:00
let
scheduleReboot = pkgs.writeShellScript "schedule-reboot.sh" ''
export PATH="${config.packages.consul}/bin:${pkgs.systemd}/bin:${pkgs.coreutils}/bin"
2023-11-07 18:15:25 +02:00
currentTime=$(date +%s)
lastScheduledTime=$(consul kv get system/coordinated-reboot/last)
if [[ $? -ne 0 ]]; then
lastScheduledTime=$((currentTime - 300))
fi
nextScheduledTime=$((lastScheduledTime + 3600))
if [[ $nextScheduledTime -lt $((currentTime + 300)) ]]; then
nextScheduledTime=$((currentTime + 300))
fi
consul kv put system/coordinated-reboot/last $nextScheduledTime
echo "Scheduling reboot for $nextScheduledTime"
systemd-analyze timestamp @$nextScheduledTime
busctl call \
org.freedesktop.login1 \
/org/freedesktop/login1 \
org.freedesktop.login1.Manager \
ScheduleShutdown st reboot ''${nextScheduledTime}000000
'';
in pkgs.writeShellScript "post-effect.sh" ''
export PATH="${config.packages.consul}/bin:${pkgs.coreutils}/bin"
if [[ "$(realpath /run/booted-system/kernel)" != "$(realpath /nix/var/nix/profiles/system/kernel)" ]]; then
2023-11-07 18:15:25 +02:00
echo "Scheduling reboot for kernel upgrade"
if ! consul members >/dev/null; then
echo "Consul not active, skipping reboot"
exit 0
fi
consul lock --timeout=3m system/coordinated-reboot ${scheduleReboot}
fi
2023-11-07 18:15:25 +02:00
''
));
};
}
));
}) chosenHours;
2023-03-21 18:10:27 +02:00
};
2023-02-24 16:16:15 +02:00
}