gitlab-ce/scripts/run-fast-specs.sh

98 lines
3.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# shellcheck disable=SC2059
BCyan='\033[1;36m'
BRed='\033[1;31m'
BGreen='\033[1;32m'
BBlue='\033[1;34m'
Color_Off='\033[0m'
set -o errexit
set -o pipefail
trap onexit_err ERR
# Exit handling
function onexit_err() {
local exit_status=${1:-$?}
printf "\n❌❌❌ ${BRed}Run of fast_spec_helper specs failed!${Color_Off} ❌❌❌\n"
exit "${exit_status}"
}
function print_start_message {
trap onexit_err ERR
printf "${BCyan}\nStarting run of fast_spec_helper specs...${Color_Off}\n"
}
function run_fast_spec_helper_specs {
trap onexit_err ERR
printf "\n\n${BBlue}Running specs which use fast_spec_helper and also run fast...${Color_Off}\n\n"
# TIP: Add '--format=documentation --order=stable' when debugging flaky interaction between specs
bin/rspec --tag=~uses_fast_spec_helper_but_runs_slow "${fast_spec_helper_specs[@]}"
}
function run_fast_spec_helper_specs_which_are_slow {
trap onexit_err ERR
printf "\n\n${BBlue}Running specs which use fast_spec_helper but actually run slow...${Color_Off}\n\n"
# NOTE: fails_if_sidekiq_not_configured tag is used to skip specs which require special local config for sidekiq
bin/rspec --tag=uses_fast_spec_helper_but_runs_slow --tag=~fails_if_sidekiq_not_configured "${fast_spec_helper_specs[@]}"
}
function run_all_fast_spec_helper_specs_individually {
trap onexit_err ERR
printf "\n\n${BBlue}INDIVIDUALLY running all specs which use fast_spec_helper to ensure they run in isolation (this will be SLOW! Set SPEC_FILE_TO_START_AT to skip known-good spec files)...${Color_Off}\n\n"
# NOTE: Override `SPEC_FILE_TO_START_AT` to the relative path of a specific file in order to skip specs which are already known to be passing
SPEC_FILE_TO_START_AT="${SPEC_FILE_TO_START_AT:-${fast_spec_helper_specs[0]}}"
for spec_file in "${fast_spec_helper_specs[@]}"; do
if [ "${spec_file}" = "${SPEC_FILE_TO_START_AT}" ]; then
printf "${BBlue}Starting individual spec runs at SPEC_FILE_TO_START_AT: '${SPEC_FILE_TO_START_AT}'${Color_Off}\n\n"
START_RUNNING=true
fi
if [ -n "${START_RUNNING}" ]; then
printf "${BBlue}Running spec '${spec_file}' individually:${Color_Off}\n"
bin/rspec --tag=~fails_if_sidekiq_not_configured "$spec_file"
fi
done
}
function print_success_message {
trap onexit_err ERR
printf "\n✅✅✅ ${BGreen}All executed fast_spec_helper specs passed successfully!${Color_Off} ✅✅✅\n"
}
function main {
trap onexit_err ERR
# cd to gitlab root directory
cd "$(dirname "${BASH_SOURCE[0]}")"/..
# See https://github.com/koalaman/shellcheck/wiki/SC2207 for more context on this approach of creating an array
fast_spec_helper_specs=()
while IFS='' read -r line; do
fast_spec_helper_specs+=("$line")
done < <(git grep -l -E '^require .fast_spec_helper' -- '**/*_spec.rb')
print_start_message
if [ -n "${RUN_ALL_FAST_SPECS_INDIVIDUALLY}" ]; then
run_all_fast_spec_helper_specs_individually
else
run_fast_spec_helper_specs
run_fast_spec_helper_specs_which_are_slow
fi
print_success_message
}
main "$@"