#! /usr/bin/env sh set -eu build_system() { host="$1" show_trace_arg="" if [ "$show_trace" = true ]; then show_trace_arg="--show-trace" fi _val="$(nix build ".#nixosConfigurations.$host.config.system.build.toplevel" --print-out-paths --no-link --option max-jobs 1 $show_trace_arg)" exit_val="$?" if [ "$exit_val" -ne 0 ]; then echo "ERROR: Failed to build you system config for host: '$host'" 1>&2 printf 1 else printf "%s" "$_val" fi } remove_symlink() { link="$1" if [ -L "$link" ]; then rm "$link" else echo "ERROR: '$link' is not a symlink. Not removing it." 1>&2 exit 1 fi } root="$(git rev-parse --show-toplevel)" use_dirty=true show_trace=false while [ "$#" -ne 0 ]; do case "$1" in --dirty) use_dirty=true ;; --clean) use_dirty=false ;; --show-trace) show_trace=true ;; --* | -*) echo "arg '$1' is not known." exit 2 ;; *) # We reached the hosts break ;; esac shift 1 done if [ "$#" -eq 0 ]; then # shellcheck disable=SC2046 set -- $(ls "$root/hosts/by-name") fi if [ "$use_dirty" = "false" ]; then tmp="$(mktemp -d -t "server_build_script_XXXXX")" trap 'rm -r "$tmp"' EXIT git archive --format=tar.gz HEAD | { cd "$tmp" tar -xz } cd "$tmp" fi for host in "$@"; do system="$(build_system "$host")" [ "$system" = "1" ] && exit 1 result_link="$root/result-$host" remove_symlink "$result_link" nix-store --add-root "$result_link" --realise "$(readlink -f "$system")" # Try to also provide an easy link for potential home manager outputs. fd "home-manager-\w*.service" "$result_link/etc/systemd/system" | while read -r hm; do home_generation_link="$(grep ExecStart= "$hm" | awk '{print $2}')" user_name="$(basename "$hm" | sed 's/home-manager-\(.*\)\.service/\1/')" home_link="$root/result-$host-hm-$user_name" remove_symlink "$home_link" ln --symbolic "$home_generation_link" "$home_link" done if [ "$host" = "$(hostname)" ]; then nvd diff /run/current-system "$result_link" fi done # vim: ft=sh