| 1 | #!/usr/bin/env bash |
| 2 | set -euo pipefail |
| 3 | |
| 4 | remote_host="${LINUX_HOST:?set LINUX_HOST to the SSH name of the Linux Docker host}" |
| 5 | name="${LINUX_NAME:-tinyrelay-bench-${USER:-user}-$$}" |
| 6 | safe_name="$(printf '%s' " $name" | tr -cs 'A-Za-z0-9_.-' '-' | sed 's/^-*//;s/-*$//')" |
| 7 | remote_root="tinyrelay-tests/${safe_name}" |
| 8 | image="tinyrelay-bench-${safe_name}" |
| 9 | packages="${BENCH_PACKAGES:-./internal/storage ./internal/relay}" |
| 10 | benchtime="${BENCHTIME:-5s}" |
| 11 | stamp="$(date -u +%Y%m%dT%H%M%SZ)" |
| 12 | local_artifacts="${BENCH_ARTIFACTS:-artifacts/bench/${safe_name}/${stamp}}" |
| 13 | mkdir -p "$local_artifacts" |
| 14 | packages_b64="$(printf '%s' " $packages" | base64 | tr -d '\n')" |
| 15 | |
| 16 | COPYFILE_DISABLE=1 tar --no-xattrs \ |
| 17 | --exclude=.git --exclude=.DS_Store --exclude=.playwright-cli \ |
| 18 | --exclude=output --exclude=artifacts --exclude=node_modules \ |
| 19 | -cf - . | ssh "$remote_host" "mkdir -p '$remote_root' && tar -xf - -C '$remote_root'" |
| 20 | |
| 21 | set +e |
| 22 | ssh "$remote_host" "LINUX_PACKAGES_B64='$packages_b64' sh -s -- '$remote_root' '$image' '$stamp' '$benchtime'" <<'REMOTE' |
| 23 | set -eu |
| 24 | remote_root=$1 |
| 25 | image=$2 |
| 26 | stamp=$3 |
| 27 | benchtime=$4 |
| 28 | packages=$(printf '%s' "$LINUX_PACKAGES_B64" | base64 -d) |
| 29 | artifact_dir="$remote_root/artifacts/$stamp" |
| 30 | mkdir -p "$artifact_dir" |
| 31 | { |
| 32 | date -u +%Y-%m-%dT%H:%M:%SZ |
| 33 | printf 'host=' ; hostname |
| 34 | printf 'kernel=' ; uname -a |
| 35 | printf 'cpu=' ; nproc |
| 36 | printf 'docker=' ; docker version --format '{{.Server.Version}}' |
| 37 | } > "$artifact_dir/metadata.txt" |
| 38 | set +e |
| 39 | docker build --target bench --build-arg BENCH_PACKAGES="$packages" --build-arg BENCHTIME="$benchtime" -t "$image" "$remote_root" > "$artifact_dir/bench.log" 2>&1 |
| 40 | status=$? |
| 41 | cat "$artifact_dir/bench.log" |
| 42 | printf '%s\n' "$status" > "$artifact_dir/status" |
| 43 | exit "$status" |
| 44 | REMOTE |
| 45 | status=$? |
| 46 | set -e |
| 47 | |
| 48 | scp -q "$remote_host:$remote_root/artifacts/$stamp/metadata.txt" "$local_artifacts/metadata.txt" || true |
| 49 | scp -q "$remote_host:$remote_root/artifacts/$stamp/status" "$local_artifacts/status" || true |
| 50 | scp -q "$remote_host:$remote_root/artifacts/$stamp/bench.log" "$local_artifacts/bench.log" || true |
| 51 | printf 'artifacts: %s\n' "$local_artifacts" |
| 52 | exit "$status" |