#!/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