Added nix-reduce-build. You point it to some path you want to build and it fetches whatever it can from specified computers via nix-copy-closure. NOTE: You do want to set up RSA keys or ssh-agent or something... You really do want it. It will run separate ssh instances insane number of times.
This commit is contained in:
		
							parent
							
								
									0a84137c45
								
							
						
					
					
						commit
						11d512e7a8
					
				
					 2 changed files with 71 additions and 2 deletions
				
			
		| 
						 | 
					@ -2,7 +2,7 @@ bin_SCRIPTS = nix-collect-garbage \
 | 
				
			||||||
  nix-pull nix-push nix-prefetch-url \
 | 
					  nix-pull nix-push nix-prefetch-url \
 | 
				
			||||||
  nix-install-package nix-channel nix-build \
 | 
					  nix-install-package nix-channel nix-build \
 | 
				
			||||||
  nix-pack-closure nix-unpack-closure \
 | 
					  nix-pack-closure nix-unpack-closure \
 | 
				
			||||||
  nix-copy-closure
 | 
					  nix-copy-closure nix-reduce-build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
noinst_SCRIPTS = nix-profile.sh generate-patches.pl \
 | 
					noinst_SCRIPTS = nix-profile.sh generate-patches.pl \
 | 
				
			||||||
  find-runtime-roots.pl build-remote.pl
 | 
					  find-runtime-roots.pl build-remote.pl
 | 
				
			||||||
| 
						 | 
					@ -35,4 +35,5 @@ EXTRA_DIST = nix-collect-garbage.in \
 | 
				
			||||||
  nix-pack-closure.in nix-unpack-closure.in \
 | 
					  nix-pack-closure.in nix-unpack-closure.in \
 | 
				
			||||||
  nix-copy-closure.in \
 | 
					  nix-copy-closure.in \
 | 
				
			||||||
  find-runtime-roots.pl.in \
 | 
					  find-runtime-roots.pl.in \
 | 
				
			||||||
  build-remote.pl.in
 | 
					  build-remote.pl.in \
 | 
				
			||||||
 | 
					  nix-reduce-build.in
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										68
									
								
								scripts/nix-reduce-build.in
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								scripts/nix-reduce-build.in
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,68 @@
 | 
				
			||||||
 | 
					#! @shell@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WORKING_DIRECTORY=$(mktemp -d "${TMPDIR:-/tmp}"/nix-reduce-build-XXXXXX);
 | 
				
			||||||
 | 
					cd "$WORKING_DIRECTORY";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if test -z "$1" ; then
 | 
				
			||||||
 | 
						echo 'nix-reduce-build (paths or Nix expressions) -- (logins at remote computers)' >&2
 | 
				
			||||||
 | 
						echo As in: >&2
 | 
				
			||||||
 | 
						echo nix-reduce-build /etc/nixos/nixos -- user@somewhere.nowhere.example.org >&2
 | 
				
			||||||
 | 
						exit;
 | 
				
			||||||
 | 
					fi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while ! test "$1" = "--" || test "$1" = "" ; do 
 | 
				
			||||||
 | 
						echo "$1" >> initial; >&2
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					shift;
 | 
				
			||||||
 | 
					echo Will work on $(cat initial | wc -l) targets. >&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while read ; do
 | 
				
			||||||
 | 
						case "$REPLY" in 
 | 
				
			||||||
 | 
							${NIX_STORE_PATH:-/nix/store}/*)
 | 
				
			||||||
 | 
								echo "$REPLY" >> paths; >&2
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
							*)
 | 
				
			||||||
 | 
								nix-instantiate "$REPLY" >> paths;
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
						esac;
 | 
				
			||||||
 | 
					done < initial;
 | 
				
			||||||
 | 
					echo Proceeding $(cat paths | wc -l) paths. >&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while read; do
 | 
				
			||||||
 | 
						case "$REPLY" in
 | 
				
			||||||
 | 
							*.drv)
 | 
				
			||||||
 | 
								echo "$REPLY" >> derivers; >&2
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
							*)
 | 
				
			||||||
 | 
								nix-store --query --deriver "$REPLY" >>derivers;
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
						esac;
 | 
				
			||||||
 | 
					done < paths;
 | 
				
			||||||
 | 
					echo Found $(cat derivers | wc -l) derivers. >&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cat derivers | xargs nix-store --query -R > derivers-closure;
 | 
				
			||||||
 | 
					echo Proceeding at most $(cat derivers-closure | wc -l) derivers. >&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cat derivers-closure | egrep '[.]drv$' | xargs nix-store --query --outputs > wanted-paths;
 | 
				
			||||||
 | 
					cat derivers-closure | egrep -v '[.]drv$' >> wanted-paths;
 | 
				
			||||||
 | 
					echo Prepared $(cat wanted-paths | wc -l) paths to get. >&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cat wanted-paths | xargs nix-store --check-validity --print-invalid > needed-paths;
 | 
				
			||||||
 | 
					echo We need $(cat needed-paths | wc -l) paths. >&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if test -z "$1" ; then
 | 
				
			||||||
 | 
						cat needed-paths;	
 | 
				
			||||||
 | 
					fi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for i in "$@"; do 
 | 
				
			||||||
 | 
						cat needed-paths | while read; do 
 | 
				
			||||||
 | 
							nix-copy-closure --from "$i" --gzip "$REPLY" </dev/null || true; 
 | 
				
			||||||
 | 
						done;
 | 
				
			||||||
 | 
						mv needed-paths wanted-paths;
 | 
				
			||||||
 | 
						cat wanted-paths | xargs nix-store --check-validity --print-invalid > needed-paths;
 | 
				
			||||||
 | 
						echo We still need $(cat needed-paths | wc -l) paths. >&2
 | 
				
			||||||
 | 
					done;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cd /
 | 
				
			||||||
 | 
					rm -r "$WORKING_DIRECTORY"
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue