#!/bin/bash set -ex mkdir -p artifacts/ . ./jenkins-scripts/jenkins-helpers.sh convert_args_to_variables "$@" # Make shellcheck happy and workaround Jenkins not defining variables # for empty arguments. label="${label-tcwg-x86_64-build}" target="${target-aarch64-linux-gnu}" NODE_NAME="${NODE_NAME-$(hostname)}" TCWG_SES_USER="${TCWG_SES_USER-}" TCWG_SES_PASSWORD="${TCWG_SES_PASSWORD-}" WORKSPACE="${WORKSPACE-$(pwd)}" override="${override-}" host_x86_64_languages="${host_x86_64_languages-default}" host_aarchXX_languages="${host_aarchXX_languages-c,c++}" runtests="${runtests-aarch64-linux-gnu}" send_results_to="${send_results_to-}" try_bootstrap="${try_bootstrap-true}" host_x86_64_excludecheck="${host_x86_64_excludecheck-gdb}" host_aarchXX_excludecheck="${host_aarchXX_excludecheck-gcc}" extraconfig="${extraconfig-}" rebuild="${rebuild-true}" log_name="${log_name-$target}" dont_fail="${dont_fail-false}" log_server="${log_server-dev-01.tcwglab:$HOME/logs}" abe_branch="${abe_branch-refs/heads/tested}" build_container_tag="${build_container_tag-bionic}" test_container_tag="${test_container_tag-bionic}" binaries="${binaries-false}" dryrun="${dryrun-false}" # Jenkins doesn't define variables when parameter value is empty, # so enable "set -u" only after above binding of variables. set -u # Compute host (builder type) because it is/can be used when computing # log_name. It would be better to define host before defining log_name # in convert_args_to_variables, but label is also defined by # convert_args_to_variables, so we have to patch host in log_name via # a sed trick later. # shellcheck disable=SC2034 host=$(print_type_for_label $label) if [ x"$target" = x"$label" ]; then target_opt=(--target native) elif [ x"$target" = x"aarch64-linux-gnu_ilp32" ]; then target_opt=(--target "$target" --override "--extraconfigdir ../config/ilp32-dev") else target_opt=(--target "$target") fi runtests_opt="" qemu_cpu="" if echo $runtests | grep -q $target; then runtests_opt="--runtests" tester_label=$(print_tester_label_for_target $target) if [ x"$tester_label" != x"" ]; then session_name=$(print_docker_name "$$-$BUILD_NUMBER-$JOB_NAME") if [ x"$target" != x"aarch64-linux-gnu_ilp32" ]; then bash -x ./jenkins-scripts/start-container-docker.sh --label $tester_label --distro ${test_container_tag} --session-name "$session_name" --task test --prefix test_ > test-container.sh else # Set weight to "2" to give VM decent amount of RAM. bash -x ./jenkins-scripts/start-container-qemu.sh --weight 2 --label $tester_label --distro ${test_container_tag} --session-name "$session_name" --task test --prefix test_ --kernel_url https://dev-01.tcwglab/~tcwg-buildslave/images/ilp32/norov-Image --initrd_url https://cloud-images.ubuntu.com/releases/16.04/release/unpacked/ubuntu-16.04-server-cloudimg-arm64-initrd-generic > test-container.sh fi . ./test-container.sh # Vars come from test-container.sh # shellcheck disable=SC2154 runtests_opt="$runtests_opt --testcontainer ${test_container_host}:${test_container_port}" fi # Define qemu_cpu even if testing will not use it (it's # ignored in such cases) # Choose values matching what we have in testing boards case ${target} in armv8*) qemu_cpu=cortex-a57 ;; arm*) qemu_cpu=cortex-a15 ;; aarch64*) qemu_cpu=cortex-a57 ;; esac [ "x${qemu_cpu}" != "x" ] && qemu_cpu="--qemu-cpu ${qemu_cpu}" fi if [ "x${send_results_to}" != x ]; then send_results_to="--send-results-to ${send_results_to}" fi echo "Build session is up; ulimit config:" ulimit -a case $label in tcwg-x86_*-build) languages="$host_x86_64_languages" ;; *) languages="$host_aarchXX_languages" ;; esac if $try_bootstrap; then bootstrap="--bootstrap" else bootstrap="" fi if [ x"$log_name" != x"" ]; then # As explained above, host is defined too late and cannot be # expanded when we define log_name, so use a sed trick. log_name=$(echo $log_name | sed 's/@@host@@/$host/g') declare logname_opt eval "logname_opt=\"--logname $log_name\"" fi if $rebuild; then norebuild="" else norebuild="--norebuild" fi # --tarbin needs to be passed to jenkins.sh as a user option if $binaries; then options="-o --tarbin" else options="" fi case $label in tcwg-x86_*-build) excludecheck="$host_x86_64_excludecheck" ;; *) excludecheck="$host_aarchXX_excludecheck" ;; esac excludecheck_opt="" for testsuite in $excludecheck; do excludecheck_opt="$excludecheck_opt --excludecheck $testsuite" done # If there were extraconfig options, extract the # corresponding repo if test -n "$extraconfig" ; then git clone http://git.linaro.org/toolchain/abe-extraconfigs.git fi extraconfig_opt="" for config in $extraconfig; do case ${extraconfig} in *=*) tool=${config%=*} value=${config#*=} ;; *) echo ERROR: wrong extraconfig: $config exit 1 ;; esac extraconfig_opt="${extraconfig_opt} --extraconfig $tool=$PWD/abe-extraconfigs/$value" done result="0" # Configure postfix sudo sed -e s/@@MYHOSTNAME@@/${NODE_NAME}/g -e s/@@MAILHOST@@/email-smtp.us-east-1.amazonaws.com/ -e s/@@MAILPORT@@/587/ -i /etc/postfix/main.cf sudo sed -e s/@@MAILHOST@@/email-smtp.us-east-1.amazonaws.com/ -e s/@@MAILPORT@@/587/ -e s/@@MAILUSER@@/${TCWG_SES_USER}/ -e s/@@MAILPASSWORD@@/${TCWG_SES_PASSWORD}/ -i /etc/postfix/sasl_password echo linaro.org | sudo tee /etc/mailname sudo postmap hash:/etc/postfix/sasl_password sudo /etc/init.d/postfix start cd ${WORKSPACE} && bash -x ${WORKSPACE}/jenkins-scripts/jenkins.sh --workspace ${WORKSPACE} --abedir ${WORKSPACE} --override "$override ${qemu_cpu}" "${target_opt[@]}" --languages ${languages} $bootstrap $runtests_opt $excludecheck_opt ${extraconfig_opt} ${send_results_to} --logserver $log_server $logname_opt $norebuild $options || result=$? if $dryrun; then # Keep Jenkins happy touch artifacts/dryrun.txt exit 0 fi # If we actually built a toolchain, save its manifest. # If the build was a no-op (results already present on log_server), # copy the existing ones. if [ -d _build/builds ]; then manifest="`grep "^manifest=" ${WORKSPACE}/build-artifacts.txt | cut -d = -f 2-`" else manifest="" fi if [ x"${manifest}" != x ]; then cp ${manifest} artifacts/ else # We need to do the same name expansion as jenkins.sh declare dir eval dir="$log_name" scp "$log_server/$dir/*manifest.txt" artifacts/ fi # Provide requested binaries as artifacts if $binaries; then cp "$(grep "^toolchain=" ${WORKSPACE}/build-artifacts.txt | cut -d = -f 2-)" artifacts/ cp "$(grep "^toolchain_asc=" ${WORKSPACE}/build-artifacts.txt | cut -d = -f 2-)" artifacts/ cp "$(grep "^runtime=" ${WORKSPACE}/build-artifacts.txt | cut -d = -f 2-)" artifacts/ cp "$(grep "^runtime_asc=" ${WORKSPACE}/build-artifacts.txt | cut -d = -f 2-)" artifacts/ cp "$(grep "^sysroot=" ${WORKSPACE}/build-artifacts.txt | cut -d = -f 2-)" artifacts/ cp "$(grep "^sysroot_asc=" ${WORKSPACE}/build-artifacts.txt | cut -d = -f 2-)" artifacts/ fi # Save logs and their directory structure rsync -a --exclude="/logs/" --include="*/" --include="*.log" --include="*.err" --include="*.out" --include="*.txt" --exclude="*" --prune-empty-dirs ./ ./logs/ if ! tar -I pxz -cf ./artifacts/logs.tar.xz ./logs/ >/dev/null 2>&1; then # PXZ can [rarely] fail due to high RAM usage, so fallback to normal XZ. rm -f ./artifacts/logs.tar.xz tar -cJf ./artifacts/logs.tar.xz ./logs/ fi echo "Result of jenkins.sh: $result" if $dont_fail; then result="0" fi exit $result