2020-05-18 12:08:08 +00:00
#!/usr/bin/env bash
2019-09-27 15:06:16 +00:00
function retrieve_tests_metadata( ) {
2020-11-25 15:09:13 +00:00
mkdir -p crystalball/ knapsack/ rspec_flaky/ rspec_profiling/
local project_path = "gitlab-org/gitlab"
local test_metadata_job_id
# Ruby
test_metadata_job_id = $( scripts/api/get_job_id --project " ${ project_path } " -q "status=success" -q "ref=master" -q "username=gitlab-bot" -Q "scope=success" --job-name "update-tests-metadata" )
2019-09-27 15:06:16 +00:00
if [ [ ! -f " ${ KNAPSACK_RSPEC_SUITE_REPORT_PATH } " ] ] ; then
2020-11-25 15:09:13 +00:00
scripts/api/download_job_artifact --project " ${ project_path } " --job-id " ${ test_metadata_job_id } " --artifact-path " ${ KNAPSACK_RSPEC_SUITE_REPORT_PATH } " || echo "{}" > " ${ KNAPSACK_RSPEC_SUITE_REPORT_PATH } "
2019-09-27 15:06:16 +00:00
fi
if [ [ ! -f " ${ FLAKY_RSPEC_SUITE_REPORT_PATH } " ] ] ; then
2020-11-25 15:09:13 +00:00
scripts/api/download_job_artifact --project " ${ project_path } " --job-id " ${ test_metadata_job_id } " --artifact-path " ${ FLAKY_RSPEC_SUITE_REPORT_PATH } " || echo "{}" > " ${ FLAKY_RSPEC_SUITE_REPORT_PATH } "
2019-09-27 15:06:16 +00:00
fi
2020-11-25 15:09:13 +00:00
# FIXME: We will need to find a pipeline where the $RSPEC_PACKED_TESTS_MAPPING_PATH.gz actually exists (Crystalball only runs every two-hours, but the `update-tests-metadata` runs for all `master` pipelines...).
# if [[ ! -f "${RSPEC_PACKED_TESTS_MAPPING_PATH}" ]]; then
# (scripts/api/download_job_artifact --project "${project_path}" --job-id "${test_metadata_job_id}" --artifact-path "${RSPEC_PACKED_TESTS_MAPPING_PATH}.gz" && gzip -d "${RSPEC_PACKED_TESTS_MAPPING_PATH}.gz") || echo "{}" > "${RSPEC_PACKED_TESTS_MAPPING_PATH}"
# fi
#
# scripts/unpack-test-mapping "${RSPEC_PACKED_TESTS_MAPPING_PATH}" "${RSPEC_TESTS_MAPPING_PATH}"
2019-09-27 15:06:16 +00:00
}
function update_tests_metadata( ) {
echo "{}" > " ${ KNAPSACK_RSPEC_SUITE_REPORT_PATH } "
2020-04-21 21:09:38 +00:00
scripts/merge-reports " ${ KNAPSACK_RSPEC_SUITE_REPORT_PATH } " knapsack/rspec*.json
2019-10-01 12:05:59 +00:00
rm -f knapsack/rspec*.json
2019-09-27 15:06:16 +00:00
2020-11-24 09:09:32 +00:00
export FLAKY_RSPEC_GENERATE_REPORT = "true"
2020-11-25 15:09:13 +00:00
scripts/merge-reports " ${ FLAKY_RSPEC_SUITE_REPORT_PATH } " rspec_flaky/all_*.json
2020-01-21 21:08:54 +00:00
scripts/flaky_examples/prune-old-flaky-examples " ${ FLAKY_RSPEC_SUITE_REPORT_PATH } "
2019-10-01 12:05:59 +00:00
rm -f rspec_flaky/all_*.json rspec_flaky/new_*.json
2019-09-27 15:06:16 +00:00
2020-04-21 21:09:38 +00:00
if [ [ " $CI_PIPELINE_SOURCE " = = "schedule" ] ] ; then
scripts/insert-rspec-profiling-data
else
echo "Not inserting profiling data as the pipeline is not a scheduled one."
fi
2019-09-27 15:06:16 +00:00
}
2020-10-28 15:08:49 +00:00
function update_tests_mapping( ) {
if ! crystalball_rspec_data_exists; then
echo "No crystalball rspec data found."
return 0
fi
scripts/generate-test-mapping " ${ RSPEC_TESTS_MAPPING_PATH } " crystalball/rspec*.yml
scripts/pack-test-mapping " ${ RSPEC_TESTS_MAPPING_PATH } " " ${ RSPEC_PACKED_TESTS_MAPPING_PATH } "
gzip " ${ RSPEC_PACKED_TESTS_MAPPING_PATH } "
2020-11-25 15:09:13 +00:00
rm -f crystalball/rspec*.yml " ${ RSPEC_PACKED_TESTS_MAPPING_PATH } "
2020-10-28 15:08:49 +00:00
}
function crystalball_rspec_data_exists( ) {
compgen -G "crystalball/rspec*.yml" > /dev/null;
}
2019-09-27 15:06:16 +00:00
function rspec_simple_job( ) {
local rspec_opts = " ${ 1 } "
export NO_KNAPSACK = "1"
2020-11-02 15:08:52 +00:00
bin/rspec -Ispec -rspec_helper --color --format documentation --format RspecJunitFormatter --out junit_rspec.xml ${ rspec_opts }
2019-09-27 15:06:16 +00:00
}
function rspec_paralellized_job( ) {
2020-04-21 21:09:38 +00:00
read -ra job_name <<< " ${ CI_JOB_NAME } "
2019-09-27 15:06:16 +00:00
local test_tool = " ${ job_name [0] } "
local test_level = " ${ job_name [1] } "
2020-04-21 21:09:38 +00:00
local report_name = $( echo " ${ CI_JOB_NAME } " | sed -E 's|[/ ]|_|g' ) # e.g. 'rspec unit pg11 1/24' would become 'rspec_unit_pg11_1_24'
2019-09-27 15:06:16 +00:00
local rspec_opts = " ${ 1 } "
local spec_folder_prefix = ""
if [ [ " ${ test_tool } " = ~ "-ee" ] ] ; then
spec_folder_prefix = "ee/"
fi
export KNAPSACK_LOG_LEVEL = "debug"
2020-04-21 21:09:38 +00:00
export KNAPSACK_REPORT_PATH = " knapsack/ ${ report_name } _report.json "
2019-09-27 15:06:16 +00:00
2020-05-08 09:09:39 +00:00
# There's a bug where artifacts are sometimes not downloaded. Since specs can run without the Knapsack report, we can
# handle the missing artifact gracefully here. See https://gitlab.com/gitlab-org/gitlab/-/issues/212349.
if [ [ ! -f " ${ KNAPSACK_RSPEC_SUITE_REPORT_PATH } " ] ] ; then
echo "{}" > " ${ KNAPSACK_RSPEC_SUITE_REPORT_PATH } "
fi
2019-09-30 09:06:31 +00:00
cp " ${ KNAPSACK_RSPEC_SUITE_REPORT_PATH } " " ${ KNAPSACK_REPORT_PATH } "
2019-09-27 15:06:16 +00:00
if [ [ -z " ${ KNAPSACK_TEST_FILE_PATTERN } " ] ] ; then
pattern = $( ruby -r./lib/quality/test_level.rb -e " puts Quality::TestLevel.new(%( ${ spec_folder_prefix } )).pattern(: ${ test_level } ) " )
export KNAPSACK_TEST_FILE_PATTERN = " ${ pattern } "
fi
echo " KNAPSACK_TEST_FILE_PATTERN: ${ KNAPSACK_TEST_FILE_PATTERN } "
if [ [ -d "ee/" ] ] ; then
export KNAPSACK_GENERATE_REPORT = "true"
export FLAKY_RSPEC_GENERATE_REPORT = "true"
export SUITE_FLAKY_RSPEC_REPORT_PATH = " ${ FLAKY_RSPEC_SUITE_REPORT_PATH } "
2020-04-21 21:09:38 +00:00
export FLAKY_RSPEC_REPORT_PATH = " rspec_flaky/all_ ${ report_name } _report.json "
export NEW_FLAKY_RSPEC_REPORT_PATH = " rspec_flaky/new_ ${ report_name } _report.json "
2019-09-27 15:06:16 +00:00
if [ [ ! -f $FLAKY_RSPEC_REPORT_PATH ] ] ; then
echo "{}" > " ${ FLAKY_RSPEC_REPORT_PATH } "
fi
if [ [ ! -f $NEW_FLAKY_RSPEC_REPORT_PATH ] ] ; then
echo "{}" > " ${ NEW_FLAKY_RSPEC_REPORT_PATH } "
fi
fi
mkdir -p tmp/memory_test
2020-04-21 21:09:38 +00:00
export MEMORY_TEST_PATH = " tmp/memory_test/ ${ report_name } _memory.csv "
2019-09-27 15:06:16 +00:00
2020-11-02 15:08:52 +00:00
knapsack rspec " -Ispec -rspec_helper --color --format documentation --format RspecJunitFormatter --out junit_rspec.xml ${ rspec_opts } "
2019-09-27 15:06:16 +00:00
date
}
2020-06-16 12:09:00 +00:00
2020-09-14 15:09:28 +00:00
function rspec_fail_fast( ) {
local test_file_count_threshold = ${ RSPEC_FAIL_FAST_TEST_FILE_COUNT_THRESHOLD :- 10 }
local matching_tests_file = ${ 1 }
local rspec_opts = ${ 2 }
local test_files = " $( cat " ${ matching_tests_file } " ) "
local test_file_count = $( wc -w " ${ matching_tests_file } " | awk { 'print $1' } )
if [ [ " ${ test_file_count } " -gt " ${ test_file_count_threshold } " ] ] ; then
echo " This job is intentionally skipped because there are more than ${ test_file_count_threshold } test files matched, "
echo "which would take too long to run in this job."
echo "All the tests would be run in other rspec jobs."
exit 0
fi
if [ [ -n $test_files ] ] ; then
rspec_simple_job " ${ rspec_opts } ${ test_files } "
else
echo "No rspec fail-fast tests to run"
fi
}
2020-08-25 15:10:17 +00:00
function rspec_matched_foss_tests( ) {
2020-06-16 12:09:00 +00:00
local test_file_count_threshold = 20
local matching_tests_file = ${ 1 }
local rspec_opts = ${ 2 }
local test_files = " $( cat " ${ matching_tests_file } " ) "
local test_file_count = $( wc -w " ${ matching_tests_file } " | awk { 'print $1' } )
if [ [ " ${ test_file_count } " -gt " ${ test_file_count_threshold } " ] ] ; then
2020-06-17 09:08:38 +00:00
echo " This job is intentionally failed because there are more than ${ test_file_count_threshold } FOSS test files matched, "
2020-06-16 12:09:00 +00:00
echo "which would take too long to run in this job."
echo "To reduce the likelihood of breaking FOSS pipelines,"
echo "please add [RUN AS-IF-FOSS] to the MR title and restart the pipeline."
echo "This would run all as-if-foss jobs in this merge request"
2020-06-17 09:08:38 +00:00
echo "and remove this failing job from the pipeline."
2020-06-16 12:09:00 +00:00
exit 1
fi
if [ [ -n $test_files ] ] ; then
rspec_simple_job " ${ rspec_opts } ${ test_files } "
else
2020-09-14 15:09:28 +00:00
echo "No impacted FOSS rspec tests to run"
2020-06-16 12:09:00 +00:00
fi
}