#! /usr/bin/env bash set -xeuo pipefail declare username host system module args deployment_name deployment_type args #key_file root_path # DEPLOY sshOpts=( -o BatchMode=yes -o StrictHostKeyChecking=no # TODO set key for production # ${if key-file == null then "" else "-i ${key-file}"} # NOTE the below options are for tests -o ConnectTimeout=1 -o ServerAliveInterval=1 ) destination="$username@$host" # echo "$cwd/deployment" # ls "$cwd/deployment" # echo "$args" root=$(echo "$args" | jq -r '.config.pathToRoot') # echo "$root/deployment/nixos.nix" # ls "$root/deployment/nixos.nix" # FIXME: ensure [[ $root_path == $root ]] so i could just rely on stuff from /deployment/data-model.nix # cwd=$root_path cwd=$root command=(nix-instantiate --show-trace --expr " import $cwd/deployment/nixos.nix { system = \"$system\"; configuration = (import \"$cwd/$module\" (builtins.fromJSON ''$args'')).$deployment_name.$deployment_type.nixos-configuration; } ") # INSTANTIATE # instantiate the config in /nix/store "${command[@]}" -A out_path # get the realized derivation to deploy # "${command[@]}" --show-trace --eval --strict --json | jq -r '.command')" outPath=$(nix-store --realize "$("${command[@]}" --show-trace --eval --strict --json | jq -r '.drv_path')") # deploy the config by nix-copy-closure NIX_SSHOPTS="${sshOpts[*]}" nix-copy-closure --to "$destination" "$outPath" --gzip --use-substitutes # switch the remote host to the config # NOTE checks here are for tests - in production time-outs could be a real thing, rather than indicator of success! # shellcheck disable=SC2029 ssh "${sshOpts[@]}" "$destination" "nix-env --profile /nix/var/nix/profiles/system --set $outPath" # shellcheck disable=SC2029 output=$(ssh "${sshOpts[@]}" "$destination" "nohup $outPath/bin/switch-to-configuration switch &" 2>&1) || echo "status code: $?" echo "output: $output" if [[ $output != *"Timeout, server $host not responding"* ]]; then echo "non-timeout error: $output" exit 1 else exit 0 fi