123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- #!/usr/bin/env bash
- # Copyright 2016 The Kubernetes Authors.
- #
- # 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.
- # Make bucket and a folder for e2e-node test logs.
- # Populate the folder from the logs stored in /tmp/_artifacts/ in the same way as a
- # jenkins build would, and then print the URL to view the test results on Gubernator
- set -o errexit
- set -o nounset
- set -o pipefail
- KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/../..
- source "${KUBE_ROOT}/hack/lib/logging.sh"
- if [[ $# -eq 0 || ! $1 =~ ^[Yy]$ ]]; then
- read -r -p "Do you want to run gubernator.sh and upload logs publicly to GCS? [y/n]" yn
- echo
- if [[ ! $yn =~ ^[Yy]$ ]]; then
- exit 1
- fi
- fi
- # Check that user has gsutil
- if [[ $(which gsutil) == "" ]]; then
- echo "Could not find gsutil when running \`which gsutil\`"
- exit 1
- fi
- # Check that user has gcloud
- if [[ $(which gcloud) == "" ]]; then
- echo "Could not find gcloud when running: \`which gcloud\`"
- exit 1
- fi
- # Check that user has Credentialed Active account
- if ! gcloud auth list | grep -q "ACTIVE"; then
- echo "Could not find active account when running: \`gcloud auth list\`"
- exit 1
- fi
- readonly gcs_acl="public-read"
- bucket_name="${USER}-g8r-logs"
- echo ""
- V=2 kube::log::status "Using bucket ${bucket_name}"
- # Check if the bucket exists
- if ! gsutil ls gs:// | grep -q "gs://${bucket_name}/"; then
- V=2 kube::log::status "Creating public bucket ${bucket_name}"
- gsutil mb "gs://${bucket_name}/"
- # Make all files in the bucket publicly readable
- gsutil acl ch -u AllUsers:R "gs://${bucket_name}"
- else
- V=2 kube::log::status "Bucket already exists"
- fi
- # Path for e2e-node test results
- GCS_JOBS_PATH="gs://${bucket_name}/logs/e2e-node"
- ARTIFACTS=${ARTIFACTS:-"/tmp/_artifacts"}
- BUILD_LOG_PATH="${ARTIFACTS}/build-log.txt"
- if [[ ! -e $BUILD_LOG_PATH ]]; then
- echo "Could not find build-log.txt at ${BUILD_LOG_PATH}"
- exit 1
- fi
- # Get start and end timestamps based on build-log.txt file contents
- # Line where the actual tests start
- start_line=$(grep -n -m 1 "^=" "${BUILD_LOG_PATH}" | sed 's/\([0-9]*\).*/\1/')
- # Create text file starting where the tests start
- after_start=$(tail -n "+${start_line}" "${BUILD_LOG_PATH}")
- echo "${after_start}" >> build-log-cut.txt
- # Match the first timestamp
- start_time_raw=$(grep -m 1 -o '[0-9][0-9][0-9][0-9][[:blank:]][0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9]*' build-log-cut.txt)
- rm build-log-cut.txt
- # Make the date readable by date command (ex: 0101 00:00:00.000 -> 01/01 00:00:00.000)
- start_time=$(echo "${start_time_raw}" | sed 's/^.\{2\}/&\//')
- V=2 kube::log::status "Started at ${start_time}"
- # Match the last timestamp in the build-log file
- end_time=$(grep -o '[0-9][0-9][0-9][0-9][[:blank:]][0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9]*' "${BUILD_LOG_PATH}" | tail -1 | sed 's/^.\{2\}/&\//')
- # Convert to epoch time for Gubernator
- start_time_epoch=$(date -d "${start_time}" +%s)
- end_time_epoch=$(date -d "${end_time}" +%s)
- # Make folder name for build from timestamp
- BUILD_STAMP=$(echo "${start_time}" | sed 's/\///' | sed 's/ /_/')
- GCS_LOGS_PATH="${GCS_JOBS_PATH}/${BUILD_STAMP}"
- # Check if folder for same logs already exists
- if gsutil ls "${GCS_JOBS_PATH}" | grep -q "${BUILD_STAMP}"; then
- V=2 kube::log::status "Log files already uploaded"
- echo "Gubernator linked below:"
- echo "k8s-gubernator.appspot.com/build/${GCS_LOGS_PATH}?local=on"
- exit
- fi
- while IFS= read -r result; do
- if [[ $result != "" && $result != "${ARTIFACTS}/results" && $result != "${ARTIFACTS}" ]]; then
- mv "${result}/"* "${ARTIFACTS}"
- fi
- done < <(find "${ARTIFACTS}" -type d -name "results")
- # Upload log files
- for upload_attempt in $(seq 3); do
- if [[ -d "${ARTIFACTS}" && -n $(ls -A "${ARTIFACTS}") ]]; then
- V=2 kube::log::status "Uploading artifacts"
- gsutil -m -q -o "GSUtil:use_magicfile=True" cp -a "${gcs_acl}" -r -c \
- -z log,xml,json "${ARTIFACTS}" "${GCS_LOGS_PATH}/artifacts" || continue
- fi
- break
- done
- for upload_attempt in $(seq 3); do
- if [[ -e "${BUILD_LOG_PATH}" ]]; then
- V=2 kube::log::status "Uploading build log"
- gsutil -q cp -Z -a "${gcs_acl}" "${BUILD_LOG_PATH}" "${GCS_LOGS_PATH}" || continue
- fi
- break
- done
- # Find the k8s version for started.json
- version=""
- if [[ -e "version" ]]; then
- version=$(cat "version")
- elif [[ -e "hack/lib/version.sh" ]]; then
- source "hack/lib/version.sh"
- kube::version::get_version_vars
- version="${KUBE_GIT_VERSION-}"
- fi
- if [[ -n "${version}" ]]; then
- V=2 kube::log::status "Found Kubernetes version: ${version}"
- else
- V=2 kube::log::status "Could not find Kubernetes version"
- fi
- #Find build result from build-log.txt
- if grep -Fxq "Test Suite Passed" "${BUILD_LOG_PATH}"
- then
- build_result="SUCCESS"
- else
- build_result="FAILURE"
- fi
- V=4 kube::log::status "Build result is ${build_result}"
- if [[ -e "${ARTIFACTS}/started.json" ]]; then
- rm "${ARTIFACTS}/started.json"
- fi
- if [[ -e "${ARTIFACTS}/finished.json" ]]; then
- rm "${ARTIFACTS}/finished.json"
- fi
- V=2 kube::log::status "Constructing started.json and finished.json files"
- cat <<EOF >"${ARTIFACTS}/started.json"
- {
- "version": "${version}",
- "timestamp": ${start_time_epoch},
- "jenkins-node": "${NODE_NAME:-}"
- }
- EOF
- cat <<EOF >"${ARTIFACTS}/finished.json"
- {
- "result": "${build_result}",
- "timestamp": ${end_time_epoch}
- }
- EOF
- # Upload started.json
- V=2 kube::log::status "Uploading started.json and finished.json"
- V=2 kube::log::status "Run started at ${start_time}"
- json_file="${GCS_LOGS_PATH}/started.json"
- for upload_attempt in $(seq 3); do
- V=2 kube::log::status "Uploading started.json to ${json_file} (attempt ${upload_attempt})"
- gsutil -q -h "Content-Type:application/json" cp -a "${gcs_acl}" "${ARTIFACTS}/started.json" \
- "${json_file}" || continue
- break
- done
- # Upload finished.json
- for upload_attempt in $(seq 3); do
- V=2 kube::log::status "Uploading finished.json to ${GCS_LOGS_PATH} (attempt ${upload_attempt})"
- gsutil -q -h "Content-Type:application/json" cp -a "${gcs_acl}" "${ARTIFACTS}/finished.json" \
- "${GCS_LOGS_PATH}/finished.json" || continue
- break
- done
- echo "Gubernator linked below:"
- echo "k8s-gubernator.appspot.com/build/${bucket_name}/logs/e2e-node/${BUILD_STAMP}"
|