···105105 wait_workers "$workers"
106106107107 local store="grpc://127.0.0.1:50051?insecure=1&system=x86_64-linux"
108108- declare -A builds
108108+ declare -A builds=() evals=()
109109+ local failed=()
110110+ build() {
111111+ echo "ci-farm: $1: $2"
112112+ "$NIX_WITH_PLUGIN" build --no-link --print-out-paths --store "$store" --eval-store auto "$2^*" 2>&1 |
113113+ sed -u "s|^|[$1] |" &
114114+ builds[$1]=$!
115115+ }
116116+ # Waits for one eval, then starts its build.
117117+ eval_done() {
118118+ local pid status=0 arg
119119+ wait -n -p pid "${!evals[@]}" || status=$?
120120+ arg=${evals[$pid]}
121121+ unset "evals[$pid]"
122122+ if [ "$status" -eq 0 ]; then
123123+ build "$arg" "$(<"$state/$arg.drv")"
124124+ else
125125+ failed+=("$arg")
126126+ fi
127127+ }
109128 for arg in "$@"; do
110129 if [[ $arg == /nix/store/*.drv ]]; then
111111- drv=$arg
112112- else
113113- # One eval process per machine: all hosts at once don't fit in 16 GB.
114114- drv=$(nix eval --raw ".#nixosConfigurations.$arg.config.system.build.toplevel.drvPath")
130130+ build "$arg" "$arg"
131131+ continue
115132 fi
116116- echo "ci-farm: $arg: $drv"
117117- "$NIX_WITH_PLUGIN" build --no-link --print-out-paths --store "$store" --eval-store auto "$drv^*" 2>&1 |
118118- sed -u "s|^|[$arg] |" &
119119- builds[$arg]=$!
133133+ # One eval process per machine, at most 3 at a time: all hosts at once
134134+ # don't fit in 16 GB.
135135+ while [ ${#evals[@]} -ge 3 ]; do eval_done; done
136136+ nix eval --raw ".#nixosConfigurations.$arg.config.system.build.toplevel.drvPath" >"$state/$arg.drv" &
137137+ evals[$!]=$arg
120138 done
139139+ while [ ${#evals[@]} -gt 0 ]; do eval_done; done
121140122122- local failed=()
123141 for arg in "${!builds[@]}"; do
124142 wait "${builds[$arg]}" || failed+=("$arg")
125143 done