Skip to content
Snippets Groups Projects
nix-build-and-cache 2.62 KiB
Newer Older
  • Learn to ignore specific revisions
  • toplevel="$(git rev-parse --show-toplevel)"
    
    # Build just the single installable and forward any other arguments too
    just() {
        # uses nix-output-monitor (nom) if available
        if command -v nom &> /dev/null; then
            nom build "$@"
        else
            nix build -L "$@"
        fi
    
    
    Charles Hall's avatar
    Charles Hall committed
        if [ -z "$ATTIC_TOKEN" ]; then
    
            echo "\$ATTIC_TOKEN is unset, skipping uploading to the binary cache"
    
    Charles Hall's avatar
    Charles Hall committed
            return
    
    Charles Hall's avatar
    Charles Hall committed
        # historical "conduit" store for compatibility purposes, same as conduwuit
        nix run --inputs-from "$toplevel" attic -- \
            login \
            conduit \
            "${ATTIC_ENDPOINT:-https://attic.kennel.juneis.dog/conduit}" \
            "$ATTIC_TOKEN"
    
        # Find all output paths of the installables and their build dependencies
        readarray -t derivations < <(nix path-info --derivation "$@")
        cache=()
        for derivation in "${derivations[@]}"; do
            cache+=(
                "$(nix-store --query --requisites --include-outputs "$derivation")"
            )
        done
    
        # Upload them to Attic (conduit store)
        #
        # Use `xargs` and a here-string because something would probably explode if
        # several thousand arguments got passed to a command at once. Hopefully no
        # store paths include a newline in them.
        (
            IFS=$'\n'
            nix shell --inputs-from "$toplevel" attic -c xargs \
                attic push conduit <<< "${cache[*]}"
        )
    
        # main "conduwuit" store
        nix run --inputs-from "$toplevel" attic -- \
            login \
            conduwuit \
            "${ATTIC_ENDPOINT:-https://attic.kennel.juneis.dog/conduwuit}" \
            "$ATTIC_TOKEN"
    
        # Upload them to Attic (conduwuit store)
        #
        # Use `xargs` and a here-string because something would probably explode if
        # several thousand arguments got passed to a command at once. Hopefully no
        # store paths include a newline in them.
        (
            IFS=$'\n'
            nix shell --inputs-from "$toplevel" attic -c xargs \
                attic push conduwuit <<< "${cache[*]}"
        )
    
    }
    
    # Build and cache things needed for CI
    ci() {
        cache=(
            --inputs-from "$toplevel"
    
            # Keep sorted
    
            "$toplevel#devShells.x86_64-linux.all-features"
    
            attic#default
            nixpkgs#direnv
            nixpkgs#jq
            nixpkgs#nix-direnv
        )
    
        just "${cache[@]}"
    }
    
    # Build and cache *all* the package outputs from the flake.nix
    packages() {
        declare -a cache="($(
            nix flake show --json 2> /dev/null |
                nix run --inputs-from "$toplevel" nixpkgs#jq -- \
                -r \
                '.packages."x86_64-linux" | keys | map("'"$toplevel"'#" + .) | @sh'
        ))"
    
        just "${cache[@]}"
    }
    
    
    eval "$@"