forked from istio/istio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcodecov.sh
executable file
·124 lines (105 loc) · 2.94 KB
/
codecov.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/bin/bash
set -e
set -u
SCRIPTPATH="$(cd "$(dirname "$0")" ; pwd -P)"
ROOTDIR="$(dirname "${SCRIPTPATH}")"
DIR="./..."
CODECOV_SKIP="${ROOTDIR}/codecov.skip"
SKIPPED_TESTS_GREP_ARGS=
if [ "${1:-}" != "" ]; then
DIR="./$1/..."
fi
COVERAGEDIR="$(mktemp -d /tmp/XXXXX.coverage)"
mkdir -p "$COVERAGEDIR"
# coverage test needs to run one package per command.
# This script runs nproc/2 in parallel.
# Script fails if any one of the tests fail.
# half the number of cpus seem to saturate
if [[ -z ${MAXPROCS:-} ]];then
MAXPROCS=$(($(getconf _NPROCESSORS_ONLN)/2))
fi
PIDS=()
FAILED_TESTS=()
declare -a PKGS
function code_coverage() {
local filename
filename="$(echo "${1}" | tr '/' '-')"
( go test \
-coverprofile="${COVERAGEDIR}/${filename}.cov" \
-covermode=atomic "${1}" \
| tee "${COVERAGEDIR}/${filename}.report" ) &
local pid=$!
PKGS[${pid}]=${1}
PIDS+=("${pid}")
}
function wait_for_proc() {
local num
num=$(jobs -p | wc -l)
while [ "${num}" -gt ${MAXPROCS} ]; do
sleep 2
num=$(jobs -p|wc -l)
done
}
function join_procs() {
local p
for p in "${PIDS[@]}"; do
if ! wait "${p}"; then
FAILED_TESTS+=("${PKGS[${p}]}")
fi
done
}
function parse_skipped_tests() {
while read -r entry; do
if [[ "${SKIPPED_TESTS_GREP_ARGS}" != '' ]]; then
SKIPPED_TESTS_GREP_ARGS+='\|'
fi
SKIPPED_TESTS_GREP_ARGS+="\\(${entry}\\)"
done < "${CODECOV_SKIP}"
}
cd "${ROOTDIR}"
parse_skipped_tests
echo "Code coverage test (concurrency ${MAXPROCS})"
for P in $(go list "${DIR}" | grep -v vendor); do
if echo "${P}" | grep -q "${SKIPPED_TESTS_GREP_ARGS}"; then
echo "Skipped ${P}"
continue
fi
code_coverage "${P}"
wait_for_proc
done
join_procs
touch "${COVERAGEDIR}/empty"
FINAL_CODECOV_DIR="${GOPATH}/out/codecov"
mkdir -p "${FINAL_CODECOV_DIR}"
pushd "${FINAL_CODECOV_DIR}"
go get github.com/wadey/gocovmerge
gocovmerge "${COVERAGEDIR}"/*.cov > coverage.cov
cat "${COVERAGEDIR}"/*.report > codecov.report
popd
echo "Reports are stored in ${FINAL_CODECOV_DIR}"
if [[ -n ${FAILED_TESTS:-} ]]; then
echo "The following tests failed"
for T in "${FAILED_TESTS[@]}"; do
echo "FAIL: $T"
done
exit 1
fi
PKG_CHECK_ARGS=("--bucket=''")
if [[ -n "${CIRCLE_BUILD_NUM:-}" ]]; then
if [[ -z "${CIRCLE_PR_NUMBER:-}" ]]; then
TMP_SA_JSON=$(mktemp /tmp/XXXXX.json)
ENCRYPTED_SA_JSON="${ROOTDIR}/.circleci/accounts/istio-circle-ci.gcp.serviceaccount"
openssl aes-256-cbc -d -in "${ENCRYPTED_SA_JSON}" -out "${TMP_SA_JSON}" -k "${GCS_BUCKET_TOKEN}" -md sha256
# only pushing data on post submit
PKG_CHECK_ARGS=( "--build_id=${CIRCLE_BUILD_NUM}"
"--job_name=istio/${CIRCLE_JOB}_${CIRCLE_BRANCH}"
"--service_account=${TMP_SA_JSON}"
)
fi
fi
echo 'Checking package coverage'
go get -u istio.io/test-infra/toolbox/pkg_check
pkg_check \
--report_file="${FINAL_CODECOV_DIR}/codecov.report" \
--alsologtostderr \
--requirement_file=codecov.requirement "${PKG_CHECK_ARGS[@]}"