#!/usr/bin/env bash # Build a single-output derivation and store it in 'cachixCache'. # Skip the build if it is already cached. # Accepts the same arguments as nix-instantiate. set -euo pipefail CACHIX_SIGNING_KEY="${CACHIX_SIGNING_KEY:-}" cachixCache=nix-bitcoin trap 'echo Error at line $LINENO' ERR tmpDir=$(mktemp -d -p /tmp) trap 'rm -rf $tmpDir' EXIT ## Instantiate time nix-instantiate "$@" --add-root "$tmpDir/drv" --indirect > /dev/null printf "instantiated "; realpath "$tmpDir/drv" outPath=$(nix-store --query "$tmpDir/drv") if nix path-info --store "https://${cachixCache}.cachix.org" "$outPath" &>/dev/null; then echo "$outPath has already been built successfully." exit 0 fi ## Build if [[ -v CIRRUS_CI ]]; then cachix use "$cachixCache" fi if [[ $CACHIX_SIGNING_KEY ]]; then # Speed up task by uploading store paths as soon as they are created buildCmd="cachix watch-exec $cachixCache nix-build --" else buildCmd=nix-build fi $buildCmd --out-link "$tmpDir/result" "$tmpDir/drv" >/dev/null if [[ $CACHIX_SIGNING_KEY ]]; then cachix push "$cachixCache" "$outPath" fi echo "$outPath"