hydra/src/root/reproduce.tt
Eelco Dolstra 9f027b22b1 Allow users to reproduce builds on their own systems
You can now do:

  bash <(curl http://hydra-server/build/1238757/reproduce)

to download and execute a script that reproduces a Hydra build
locally.  This script fetches all inputs (e.g. Git repositories) and
then invokes nix-build.

The downloaded sources are stored in /tmp/build-<buildid> and reused
between invocations of the script.

Any additional command line options are passed to nix-build.  So

  bash <(curl http://hydra-server/build/1238757/reproduce) --run-env

will drop you in a shell where you can interactively hack on the
build, e.g.

  $ source $stdenv/setup
  $ set +e
  $ unpackPhase
  $ cd $sourceRoot
  $ configurePhase
  $ emacs foo.c &
  $ make

and so on.
2013-04-04 17:30:07 +02:00

108 lines
3.1 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#! /bin/sh
# This script has been generated automatically by Hydra from the build
# at [% c.uri_for('/build' build.id) %].
set -e
export NIX_PATH=
srcDir=${TMPDIR:-/tmp}/build-[% build.id +%]
mkdir -p "$srcDir"/build
cd "$srcDir"/build
echo "storing sources in $srcDir" >&2
declare -a args
# Fetch the inputs.
[%+ FOREACH input IN build.inputs %]
inputDir=
[%+ IF input.type == "git" %]
inputDir="$srcDir/[% input.name %]/git-export"
if ! [ -d "$inputDir" ]; then
echo "fetching Git input [% input.name %] from [% input.uri %] (commit [% input.revision %])..." >&2
inputDirTmp="$inputDir.tmp"
rm -rf "$inputDirTmp"
mkdir -p "$inputDirTmp"
git clone '[% input.uri %]' "$inputDirTmp"
(cd "$inputDirTmp" && git checkout '[% input.revision %]')
revCount="$(cd "$inputDirTmp" && (git rev-list '[% input.revision %]' | wc -l))"
rm -rf "$inputDirTmp/.git"
mv "$inputDirTmp" "$inputDir"
fi
args+=(--arg '[% input.name %]' "{ outPath = $inputDir; rev = \"[% input.revision %]\"; shortRev = \"[% input.revision.substr(0, 7) %]\"; revCount = \"$revCount\"; }")
[%+ ELSIF input.type == "hg" %]
inputDir="$srcDir/[% input.name %]/hg-archive"
if ! [ -d "$inputDir" ]; then
echo "fetching Mercurial input [% input.name %] from [% input.uri %] (commit [% input.revision %])..." >&2
inputDirTmp="$inputDir.tmp"
rm -rf "$inputDirTmp"
hg clone '[% input.uri %]' "$inputDirTmp" -r '[% input.revision %]'
rm -rf "$inputDirTmp/.hg"
mv "$inputDirTmp" "$inputDir"
fi
args+=(--arg '[% input.name %]' "{ outPath = $inputDir; rev = \"[% input.revision %]\"; revCount = \"$revCount\"; }")
[%+ ELSIF input.type == "svn" %]
inputDir="$srcDir/[% input.name %]/svn-export"
if ! [ -d "$inputDir" ]; then
echo "fetching Subversion input [% input.name %] from [% input.uri %] (commit [% input.revision %])..." >&2
rm -rf "$inputDir.tmp"
svn export '[% input.uri %]@[% input.revision %]' "$inputDir.tmp"
mv "$inputDir.tmp" "$inputDir"
fi
args+=(--arg '[% input.name %]' "{ outPath = $inputDir; rev = \"[% input.revision %]\"; }")
[% ELSIF input.type == "string" %]
args+=(--arg '[% input.name %]' '"[% input.value %]"')
[% ELSIF input.type == "boolean" %]
args+=(--arg '[% input.name %]' '[% input.value %]')
[% ELSE %]
echo "$0: input [% input.name %] has unsupported type [% input.type %]" >&2
exit 1
[% END %]
[% IF input.name == build.nixexprinput +%]
nixExprInputDir="$inputDir"
[%+ END %]
if [ -n "$inputDir" ]; then
NIX_PATH="$NIX_PATH${NIX_PATH:+:}[% input.name %]=$inputDir"
fi
[%+ END %]
# Run nix-build.
if [ -z "$nixExprInputDir" ]; then
echo "$0: don't know the path to the Nix expression!" >&2
exit 1
fi
#args+=(--option binary-caches '[% c.uri_for('/') %]')
# Since Hydra runs on x86_64-linux, pretend we're one. This matters
# when evaluating jobs that rely on builtins.currentSystem.
args+=(--option system x86_64-linux)
echo "Nix path is $NIX_PATH" >&2
echo "Nix args are ${args[@]}" >&2
nix-build "$nixExprInputDir/[% build.nixexprpath %]" -A '[% build.job.name %]' "${args[@]}" "$@"