minikube/hack/jenkins/test-flake-chart/sync_tests.sh

93 lines
3.4 KiB
Bash
Executable File

#!/bin/bash
# Copyright 2021 The Kubernetes Authors All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This script is called once per integration test. If all integration tests that
# have registered themselves in the started environment list have also
# registered themselves in the finished environment list, this script reports
# flakes or uploads flakes to flake data.
#
# This script expects the following env variables:
# MINIKUBE_LOCATION: The GitHub location being run on (e.g. master, 11000).
# COMMIT: Commit hash the tests ran on.
# ROOT_JOB_ID: Job ID to use for synchronization.
set -o pipefail
BUCKET_PATH="gs://minikube-builds/logs/${MINIKUBE_LOCATION}/${ROOT_JOB_ID}"
STARTED_LIST=$(gsutil cat "${BUCKET_PATH}/started_environments.txt" | sort | uniq)
if [ $? -ne 0 ]; then
echo "Unable to read environment list. Likely being run before all tests are ready or after tests have already been uploaded." 1>&2
exit 0
fi
set -eu -o pipefail
FINISHED_LIST_REMOTE="${BUCKET_PATH}/finished_environments.txt"
# Ensure FINISHED_LIST_REMOTE exists so we can append (but don't erase any existing entries in FINISHED_LIST_REMOTE)
< /dev/null gsutil cp -n - "${FINISHED_LIST_REMOTE}"
# Copy the job name to APPEND_TMP. If the job name ends in "_integration" remove it.
APPEND_TMP="${BUCKET_PATH}/$(basename $(mktemp))"
echo "${UPSTREAM_JOB}"\
| sed -r 's/_integration$//'\
| gsutil cp - "${APPEND_TMP}"
# Append job name to remote finished list.
gsutil compose "${FINISHED_LIST_REMOTE}" "${APPEND_TMP}" "${FINISHED_LIST_REMOTE}"
gsutil rm "${APPEND_TMP}"
FINISHED_LIST=$(mktemp)
gsutil cat "${FINISHED_LIST_REMOTE}"\
| sort\
| uniq > "${FINISHED_LIST}"
STARTED_COUNT=$(echo "${STARTED_LIST}" | wc -l)
FINISHED_LIST_JOINED=$(\
echo "${STARTED_LIST}"\
| join - "${FINISHED_LIST}")
FINISHED_COUNT=$(\
echo "${FINISHED_LIST_JOINED}"\
| wc -l)
if [ ${STARTED_COUNT} -ne ${FINISHED_COUNT} ]; then
echo "Started environments are not all finished! Started: ${STARTED_LIST}, Finished: $(cat ${FINISHED_LIST}))"
exit 0
fi
# Prevent other invocations of this script from uploading the same thing multiple times.
gsutil rm "${BUCKET_PATH}/started_environments.txt"
# At this point, we know all integration tests are done and we can process all summaries safely.
echo "${FINISHED_LIST_JOINED}" > ${FINISHED_LIST}
# Get directory of this script.
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
# Ensure jq is installed on this machine.
sudo apt-get install jq -y
if [[ "${MINIKUBE_LOCATION}" == "master" ]]; then
for ENVIRONMENT in ${STARTED_LIST}; do
SUMMARY="${BUCKET_PATH}/${ENVIRONMENT}_summary.json"
"${DIR}/upload_tests.sh" "${SUMMARY}" || true
done
"${DIR}/process_last_90/process_last_90.sh"
else
"${DIR}/report_flakes.sh" "${MINIKUBE_LOCATION}" "${ROOT_JOB_ID}" "${FINISHED_LIST}"
fi
gsutil rm "${BUCKET_PATH}/finished_environments.txt"
rm "${FINISHED_LIST}"