#!/bin/bash # Clean: shellcheck -e 2001 ./tcwg-benchmark.sh set -ex # Make shellcheck happy and workaround Jenkins not defining variables # for empty arguments. build_container_tag="${build_container_tag-xenial-tcwg-tested}" toolchain_url="$toolchain_url" toolchain_type="${toolchain_type-auto}" bench_list="$bench_list" cflags="$cflags" extension="$extension" testmode="$testmode" iterations="$iterations" run_profile="$run_profile" sysroot="$sysroot" fileserver="$fileserver" forceinstall="$forceinstall" builder="$builder" results_id="$results_id" BUILD_NUMBER="$BUILD_NUMBER" NODE_NAME="$NODE_NAME" WORKSPACE="$WORKSPACE" reboot="$reboot" ignore_errors="$ignore_errors" # Jenkins doesn't define variables when parameter value is empty (like cflags), # so enable "set -u" only after above binding of variables. set -u if echo "$builder" | grep -q ".*-[0-9]\+"; then docker_host_opt="--arch amd64 --node $builder" else docker_host_opt="--label $builder" fi . jenkins-helpers.sh # If $toolchain_url is of ssh:// type, don't create a remote build # container, just use the ssh command as provided. build_container_host= build_container_port= case "$toolchain_url" in "ssh://"*) ccprefix="${toolchain_url##ssh://}" # Extract host:port: specification from ccprefix, we don't # need to care about :parallelize here, just pass it to run.sh # if present. case ${ccprefix} in *:*:*) build=${ccprefix%:*} build_container_host="$(echo $build | cut -d: -f 1)" build_container_port="$(echo $build | cut -s -d: -f 2)" ;; *:*) # If no port is specified, use 22 (ssh default port) build=${ccprefix%:*} build_container_host="$(echo $build | cut -d: -f 1)" build_container_port=22 ;; esac if [ "x$build_container_host" = "x" ]; then echo "ERROR: ssh:// toolchain_url lacks a host: $toolchain_url." exit 1 fi if [ "x$build_container_port" = "x" ]; then echo "ERROR: ssh:// toolchain_url lacks a port: $toolchain_url." exit 1 fi ;; *) # Make sure to cleanup build container if something goes # wrong when preparing the test environment trap "cleanup_all_containers" EXIT ./start-container-docker.sh $docker_host_opt --distro "$build_container_tag" --task build --prefix build_ > build-container.sh . ./build-container.sh ;; esac case "$toolchain_url" in "ssh://"*) if [ x"$sysroot" = x"tarball" ]; then echo "ERROR: Unsupported sysroot $sysroot for toolchain_url $toolchain_url" exit 1 fi # Last component of ccprefix is the path, keep it toolchaindir="$(dirname ${ccprefix##*:})" ;; "http://"*".tar.xz"|"https://"*".tar.xz") toolchaindir=$(untar_url "$toolchain_url" "$WORKSPACE" "--strip-components 1") ;; "rsync://"*) ccprefix="${toolchain_url##rsync://}" # We want to access the remote toolchain via a container, to # avoid problems with the hosts's ssh server restrictions on the # number of simulaneous connexions. # We copy it to the build container (assuming it uses the same # architecture as the machine pointed to by $toolchain_url). # Assume ccprefix looks like /path/bin/target-triplet-, and # compute 'path'. src_toolchaindir=$(dirname $(dirname ${ccprefix})) toolchaindir="${WORKSPACE}/toolchain-${BUILD_NUMBER}" rsync -az --delete "$src_toolchaindir/" "$toolchaindir/" ;; *) echo "ERROR: Cannot handle toolchain_url: $toolchain_url" exit 1 ;; esac case "$toolchain_url" in "http://"*|"https://"*|"rsync://"*|"ssh://"*) # In the ssh:// case, we have to perform the 'find' operations # remotely. case "$toolchain_url" in "ssh://"*) maybe_remote="ssh -p $build_container_port $build_container_host" ;; *) maybe_remote="" ;; esac case "$toolchain_type" in "gnu"|"llvm") ;; "auto") if [ x"$($maybe_remote find "$toolchaindir" -path "*bin/*gcc" | wc -l)" != x"0" ]; then toolchain_type="gnu" elif [ x"$($maybe_remote find "$toolchaindir" -path "*bin/*clang" | wc -l)" != x"0" ]; then toolchain_type="llvm" else echo "ERROR: Cannot autodetect toolchain type" exit 1 fi ;; *) echo "ERROR: wrong toolchain_type: $toolchain_type" exit 1 ;; esac case "$toolchain_type" in "gnu") ccname="gcc" ;; "llvm") ccname="clang" ;; esac ccpath=$($maybe_remote find "$toolchaindir" -path "*bin/*$ccname") if [ $(echo "$ccpath" | wc -w) -ne 1 ]; then echo "ERROR: found more than one compiler: $ccpath" exit 1 fi # Non-ssh:// cases have to copy the just-copied toolchain to # the remote build container. For ssh://, we'll access the # toolchain remotely. case "$toolchain_url" in "ssh://"*) ;; *) ccprefix=$(echo "$ccpath" | sed -e "s/$ccname\$//") # Copy toolchain to the build container. rsync -a --delete -e "ssh -p$build_container_port" "$toolchaindir/" "$build_container_host:$toolchaindir/" ccprefix="$build_container_host:$build_container_port:$ccprefix" ;; esac ;; esac # Sanity check that toolchain_type is supported case "$toolchain_type" in gnu|llvm) ;; *) echo "ERROR: Could not determine toolchain type: $toolchain_type" exit 1 ;; esac case "$sysroot" in "tarball") sysroot="$build_container_host:$build_container_port:$(find "$toolchaindir" -name "libc")" ;; "http://"*|"https://"*) sysrootdir=$(untar_url "$sysroot" "$WORKSPACE" "--strip-components 1") # Copy toolchain to the build container. rsync -a --delete -e "ssh -p$build_container_port" "$sysrootdir/" "$build_container_host:$sysrootdir/" sysroot="$build_container_host:$build_container_port:$sysrootdir" ;; "ssh://"*) sysroot="${sysroot##ssh://}" # Check host:port specification from sysroot. case ${sysroot} in *:*) ;; *) echo "ERROR: ssh:// sysroot lacks a host: $sysroot" exit 1 ;; esac ;; "") # Use system sysroot. ;; *) echo "ERROR: Cannot handle sysroot: $sysroot" exit 1 ;; esac # Slaves for this job are virtual slaves on dev-01, # convert the slave name into the target board name boardname=$(echo "${NODE_NAME}" | sed 's/-bmk//').tcwglab hw_type=$(print_hw_id_for_node "$NODE_NAME") results_id=$(echo "$results_id" \ | sed -e "s//$hw_type/g" \ -e "s//$BUILD_NUMBER/g") if echo "$results_id" | grep -q "\.\."; then echo "ERROR: results_id should not escape /home/tcwg-benchmark/results* hierarchy; do not use \"..\"" exit 1 fi rsync -az --delete bmk-scripts/ "$boardname:bmk-scripts/" if $reboot; then # Reboot the board ssh $boardname sudo /sbin/reboot || true # Wait until the ssh server is ready sleep 30 # Give time to the board to shutdown ret=0 wait_for_ssh_server $boardname 22 100 || ret=$? fi case "$testmode" in build|verify) input_size="test" ;; benchmark) input_size="ref" ;; esac ssh -t -Snone "$boardname" bmk-scripts/run.sh \ --bench "$(printf '%q' "$bench_list")" \ --config "${BUILD_NUMBER}-$run_profile" \ --cflags "$(printf '%q' "$cflags")" \ --ccprefix "$ccprefix" \ --extension "$extension" \ --ignore_errors "$ignore_errors" \ --input_size "$input_size" \ --iterations "$iterations" \ --run_profile "$run_profile" \ "${sysroot:+--sysroot "$sysroot"}" \ --toolchain "$toolchain_type" \ --resultsdest "dev-01.tcwglab:/home/tcwg-benchmark/results-${results_id}/${NODE_NAME}" \ --nodename "${NODE_NAME}" \ --forceinstall "${forceinstall}" \ --verbose true