#!/bin/bash set -ef -o pipefail scripts=$(dirname $0) . $scripts/jenkins-helpers.sh convert_args_to_variables "$@" # Execution mode: baseline, bisect, continue, jenkins-full mode="${mode-baseline}" obligatory_variables toolchain \ rr[linux_version] rr[linux_url] rr[linux_branch] # Toolchain to use: gnu or llvm case "$toolchain" in "gnu") obligatory_variables rr[gnu_version] \ rr[binutils_url] rr[binutils_branch] \ rr[gcc_url] rr[gcc_branch] ;; "llvm") obligatory_variables rr[llvm_version] \ rr[llvm_url] rr[llvm_branch] ;; esac case "$mode" in "jenkins-full") obligatory_variables current_project current_branch ;; esac # Set custom revision for one of the projects, and use baseline revisions # for all other projects. current_project="${current_project-none}" current_branch="${current_branch-default}" linux_config="${linux_config-defconfig}" reset_baseline="${reset_baseline-false}" start_at="${start_at-default}" finish_at="${finish_at-default}" target="${target-native}" top_artifacts="${top_artifacts-$(pwd)/artifacts}" verbose="${verbose-true}" verbose2="${verbose2-false}" set -u if $verbose2; then set -x; fi trap "eval \"echo ERROR at \${FUNCNAME[0]}:\${BASH_LINENO[0]}\" > $top_artifacts/failures" EXIT if [ x"$target" = x"native" ]; then target=$(uname -m) fi # Set start and finish steps for different modes. default_start_at="" default_finish_at="" case "$mode" in "baseline") default_finish_at="update_baseline" ;; "bisect") case "$toolchain:$current_project" in gnu:binutils) default_start_at="build_abe-binutils" ;; gnu:gcc) default_start_at="build_abe-stage1" ;; gnu:linux) default_start_at="count_linux_objs" ;; llvm:llvm) default_start_at="build_llvm" ;; llvm:linux) default_start_at="count_linux_objs" ;; esac default_finish_at="check_regression" ;; "continue") # Developer mode. case "$toolchain" in "gnu") default_start_at="prepare_abe" ;; "llvm") default_start_at="build_llvm" ;; esac ;; "jenkins-full") ;; esac if [ x"$start_at" = x"default" ]; then start_at="$default_start_at" fi if [ x"$finish_at" = x"default" ]; then finish_at="$default_finish_at" fi if [ x"$mode" != x"continue" ]; then base_artifacts_opt="base-artifacts" else base_artifacts_opt="" fi run_step_init "$start_at" "$finish_at" "$top_artifacts" "$base_artifacts_opt" "$verbose" rr[baseline_branch]="linaro-local/ci/tcwg_kernel/$toolchain-${rr[${toolchain}_version]}-$target-${rr[linux_version]}-$linux_config" rr[current_project]="$current_project" rr[current_branch]="$current_branch" rr[mode]="$mode" rr[reset_baseline]="$reset_baseline" rr[target]="$target" rr[top_artifacts]="$top_artifacts" # Linux config to build in build_linux. rr[linux_config]="$linux_config" # Toolchain to use: gnu or llvm. rr[toolchain]="$toolchain" . $scripts/round-robin.sh # Build Linux kernel build_linux () { ( set -euf -o pipefail clone_repo linux rm -rf $(pwd)/bin mkdir $(pwd)/bin local bin cc case "${rr[toolchain]}" in llvm) bin="$(pwd)/llvm-install/bin" cc="$bin/clang" ;; gnu) bin="$(pwd)/abe/builds/destdir/x86_64-unknown-linux-gnu/bin" cc="$bin/$(print_gnu_target ${rr[target]})-gcc" ;; esac # Use binutils, etc from $bin export PATH="$bin:$PATH" # Use ccache only when bisecting linux (or preparing to). # Otherwise the compiler is new in every build and we would # only clobber ccache volume. local ccache="" if [ x"${rr[mode]}" != x"jenkins-full" -a x"${rr[current_project]}" = x"linux" ]; then ccache="ccache" fi cat > $(pwd)/bin/${rr[target]}-cc <> ${rr[top_artifacts]}/results if [ $res != 0 ]; then local linux_n_obj linux_n_obj=$(find linux -name "*.o" | wc -l) echo "$linux_n_obj" >> ${rr[top_artifacts]}/results else echo "all" >> ${rr[top_artifacts]}/results fi fi ) } # Exit with code 0 if no regression compared to base-artifacts/results. no_regression_p () { ( set -euf -o pipefail local linux_n_obj linux_n_obj=$(tail -n1 ${rr[top_artifacts]}/results) if [ x"$linux_n_obj" = x"all" ]; then # Ideal result, no need to compare to baseline. return 0 fi if ! [ "$linux_n_obj" -ge "-10" ]; then # Something is very wrong with result (e.g., it's not a number). return 1 fi # Assume worst for non-existent baseline. local base_linux_n_obj="-10" if [ -f base-artifacts/results ]; then base_linux_n_obj=$(tail -n1 base-artifacts/results) if [ x"$base_linux_n_obj" = x"all" ]; then # Current build is not ideal, so make sure baseline "all" is # better than the current result. base_linux_n_obj=$(($linux_n_obj+1)) elif ! [ "$base_linux_n_obj" -ge "-10" ]; then # Something is very wrong with baseline result # (e.g., it's not a number). return 0 fi fi if [ $linux_n_obj -ge $base_linux_n_obj ]; then return 0 else return 1 fi ) } run_step stop_on_fail -10 reset_artifacts case "${rr[toolchain]}" in gnu) run_step stop_on_fail x prepare_abe run_step skip_on_fail -9 build_abe binutils run_step skip_on_fail -8 build_abe stage1 ;; llvm) run_step skip_on_fail -1 build_llvm ;; esac run_step skip_on_fail x count_linux_objs run_step reset_on_fail x check_regression run_step stop_on_fail x update_baseline run_step stop_on_fail x push_baseline trap "" EXIT