diff options
Diffstat (limited to '')
| -rwxr-xr-x | scripts/build.sh | 100 | ||||
| -rw-r--r-- | scripts/npins_to_unflake.jq | 34 | ||||
| -rwxr-xr-x | scripts/unflake.sh | 9 | ||||
| -rwxr-xr-x | scripts/why-depends | 56 |
4 files changed, 199 insertions, 0 deletions
diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 00000000..6c3d2461 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,100 @@ +#! /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" + elif ! [ -e "$link" ]; then + : "Not existing file is also okay" + 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 diff --git a/scripts/npins_to_unflake.jq b/scripts/npins_to_unflake.jq new file mode 100644 index 00000000..80e6b5a3 --- /dev/null +++ b/scripts/npins_to_unflake.jq @@ -0,0 +1,34 @@ +def make_url(value): + value.repository as $repo | + if value.type == "Git" then + if $repo.type == "Git" then + "git+\($repo.url)?ref=\(value.branch)" + elif $repo.type == "GitHub" then + "github:\($repo.owner)/\($repo.repo)/\(value.branch)" + elif $repo.type == "Forgejo" then + "git+\($repo.server)/\($repo.owner)/\($repo.repo)?ref=\(value.branch)" + else + error("Invalid repository type: '\($repo.type)'") + end + elif value.type == "GitRelease" then + if $repo.type == "GitHub" then + "github:\($repo.owner)/\($repo.repo)/\(value.version)" + else + error("Invalid repository type: '\($repo.type)'") + end + elif value.type == "Channel" then + empty + else + error("Invalid value type: '\(value.type)'") + end + ; + +"{ +\( + .pins | to_entries | map( + " \"\(.key)\" = { + url = \"\(make_url(.value))\"; + };" + ) | join("\n") + ) +}" diff --git a/scripts/unflake.sh b/scripts/unflake.sh new file mode 100755 index 00000000..faaa5336 --- /dev/null +++ b/scripts/unflake.sh @@ -0,0 +1,9 @@ +#! /usr/bin/env sh + +set -e + +NIX_CONFIG="${NIX_CONFIG-pure-eval = false}" +export NIX_CONFIG +nix run -f https://codeberg.org/goldstein/unflake/archive/main.tar.gz unflake -- "$@" + +# vim: ft=sh diff --git a/scripts/why-depends b/scripts/why-depends new file mode 100755 index 00000000..ae1ac6f7 --- /dev/null +++ b/scripts/why-depends @@ -0,0 +1,56 @@ +#! /usr/bin/env sh + +main() { + use_running="$1" + host="$2" + package="$3" + + if [ "$use_running" = "true" ]; then + base="/run/current-system" + else + base=".#nixosConfigurations.$host.config.system.build.toplevel" + fi + + fd "[a-zA-Z0-9]{32}-$package" /nix/store --type directory --threads 1 --exec nix --option warn-dirty false why-depends "$base" +} + +running=false +host="$(hostname)" +packages="" +direct_packages="" + +while [ "$#" -ne 0 ]; do + case "$1" in + "--running") + running=true + ;; + "--host") + shift 1 + host="$1" + ;; + "--direct") + shift 1 + direct_packages="$direct_packages $1" + ;; + *) + # Treat everything else as a package to check + packages="$packages $1" + ;; + esac + + shift 1 +done + +if [ -n "$packages" ]; then + for package in $packages; do + main "$running" "$host" "$package-" + done +fi + +if [ -n "$direct_packages" ]; then + for package in $direct_packages; do + main "$running" "$host" "$package-[0-9]" + done +fi + +# vim: ft=sh |
