Merge pull request #4574 from ixdy/travis-coveralls

Produce a combined coverage report when running Go unit tests, and use goveralls to report coverage results from Travis to Coveralls.io.
This commit is contained in:
Zach Loafman 2015-02-19 18:04:52 -08:00
commit 2b5641deb8
4 changed files with 61 additions and 36 deletions

View File

@ -6,6 +6,7 @@ go:
install: install:
- if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi - if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi
- go get github.com/mattn/goveralls
- ./hack/travis/install-etcd.sh - ./hack/travis/install-etcd.sh
- ./hack/verify-gofmt.sh - ./hack/verify-gofmt.sh
- ./hack/verify-boilerplate.sh - ./hack/verify-boilerplate.sh
@ -14,7 +15,7 @@ install:
- ./hack/build-go.sh - ./hack/build-go.sh
script: script:
- KUBE_RACE="-race" KUBE_COVER="-cover -covermode=atomic" KUBE_TIMEOUT='-timeout 60s' ./hack/test-go.sh "" -p=4 - KUBE_RACE="-race" KUBE_COVER="y" KUBE_GOVERALLS_BIN="$HOME/gopath/bin/goveralls" KUBE_TIMEOUT='-timeout 60s' ./hack/test-go.sh "" -p=4
- PATH=$HOME/gopath/bin:./third_party/etcd:$PATH ./hack/test-cmd.sh - PATH=$HOME/gopath/bin:./third_party/etcd:$PATH ./hack/test-cmd.sh
- PATH=$HOME/gopath/bin:./third_party/etcd:$PATH ./hack/verify-gendocs.sh - PATH=$HOME/gopath/bin:./third_party/etcd:$PATH ./hack/verify-gendocs.sh
- PATH=$HOME/gopath/bin:./third_party/etcd:$PATH ./hack/test-integration.sh - PATH=$HOME/gopath/bin:./third_party/etcd:$PATH ./hack/test-integration.sh

View File

@ -1,6 +1,6 @@
# Kubernetes # Kubernetes
[![GoDoc](https://godoc.org/github.com/GoogleCloudPlatform/kubernetes?status.png)](https://godoc.org/github.com/GoogleCloudPlatform/kubernetes) [![Travis](https://travis-ci.org/GoogleCloudPlatform/kubernetes.svg?branch=master)](https://travis-ci.org/GoogleCloudPlatform/kubernetes) [![GoDoc](https://godoc.org/github.com/GoogleCloudPlatform/kubernetes?status.png)](https://godoc.org/github.com/GoogleCloudPlatform/kubernetes) [![Travis](https://travis-ci.org/GoogleCloudPlatform/kubernetes.svg?branch=master)](https://travis-ci.org/GoogleCloudPlatform/kubernetes) [![Coverage Status](https://coveralls.io/repos/GoogleCloudPlatform/kubernetes/badge.svg)](https://coveralls.io/r/GoogleCloudPlatform/kubernetes)
Kubernetes is an open source system for managing containerized applications across multiple hosts, Kubernetes is an open source system for managing containerized applications across multiple hosts,
providing basic mechanisms for deployment, maintenance, and scaling of applications. providing basic mechanisms for deployment, maintenance, and scaling of applications.

View File

@ -40,14 +40,13 @@ kube::test::find_dirs() {
) )
} }
kube::test::find_pkgs() {
kube::test::find_dirs | xargs -n1 printf "${KUBE_GO_PACKAGE}/%s\n"
}
# -covermode=atomic becomes default with -race in Go >=1.3 # -covermode=atomic becomes default with -race in Go >=1.3
KUBE_TIMEOUT=${KUBE_TIMEOUT:--timeout 120s} KUBE_TIMEOUT=${KUBE_TIMEOUT:--timeout 120s}
KUBE_COVER=${KUBE_COVER:-} # use KUBE_COVER="-cover -covermode=atomic" for full coverage KUBE_COVER=${KUBE_COVER:-} # set to nonempty string to enable coverage collection
KUBE_COVERMODE=${KUBE_COVERMODE:-atomic}
KUBE_RACE=${KUBE_RACE:-} # use KUBE_RACE="-race" to enable race testing KUBE_RACE=${KUBE_RACE:-} # use KUBE_RACE="-race" to enable race testing
# Set to the goveralls binary path to report coverage results to Coveralls.io.
KUBE_GOVERALLS_BIN=${KUBE_GOVERALLS_BIN:-}
kube::test::usage() { kube::test::usage() {
kube::log::usage_from_stdin <<EOF kube::log::usage_from_stdin <<EOF
@ -104,6 +103,8 @@ for arg; do
done done
set -- "${testcases[@]+${testcases[@]}}" set -- "${testcases[@]+${testcases[@]}}"
# TODO: this should probably be refactored to avoid code duplication with the
# coverage version.
if [[ $iterations -gt 1 ]]; then if [[ $iterations -gt 1 ]]; then
if [[ $# -eq 0 ]]; then if [[ $# -eq 0 ]]; then
set -- $(kube::test::find_dirs) set -- $(kube::test::find_dirs)
@ -135,21 +136,37 @@ if [[ $iterations -gt 1 ]]; then
fi fi
fi fi
if [[ -n "${1-}" ]]; then
cover_report_dir="" cover_report_dir=""
combined_cover_profile=""
if [[ -n "${KUBE_COVER}" ]]; then if [[ -n "${KUBE_COVER}" ]]; then
cover_report_dir="/tmp/k8s_coverage/$(kube::util::sortable_date)" cover_report_dir="/tmp/k8s_coverage/$(kube::util::sortable_date)"
combined_cover_profile="${cover_report_dir}/combined-coverage.out"
kube::log::status "Saving coverage output in '${cover_report_dir}'" kube::log::status "Saving coverage output in '${cover_report_dir}'"
mkdir -p ${cover_report_dir}
# The combined coverage profile needs to start with a line indicating which
# coverage mode was used (set, count, or atomic). This line is included in
# each of the coverage profiles generated when running 'go test -cover', but
# we strip these lines out when combining so that there's only one.
echo "mode: ${KUBE_COVERMODE}" >${combined_cover_profile}
fi fi
for arg; do if [[ -n "${1-}" ]]; then
test_dirs=$@
else
test_dirs=$(kube::test::find_dirs)
fi
# Run all specified tests, optionally collecting coverage if KUBE_COVER is set.
for arg in ${test_dirs}; do
trap 'exit 1' SIGINT trap 'exit 1' SIGINT
pkg=${KUBE_GO_PACKAGE}/${arg} pkg=${KUBE_GO_PACKAGE}/${arg}
cover_params=() cover_params=()
cover_profile=""
if [[ -n "${KUBE_COVER}" ]]; then if [[ -n "${KUBE_COVER}" ]]; then
cover_profile=${cover_report_dir}/${arg}/coverage.out
mkdir -p "${cover_report_dir}/${arg}" mkdir -p "${cover_report_dir}/${arg}"
cover_params=(${KUBE_COVER} -coverprofile="${cover_report_dir}/${arg}/coverage.out") cover_params=(-cover -covermode="${KUBE_COVERMODE}" -coverprofile="${cover_profile}")
fi fi
go test "${goflags[@]:+${goflags[@]}}" \ go test "${goflags[@]:+${goflags[@]}}" \
@ -157,11 +174,18 @@ if [[ -n "${1-}" ]]; then
${KUBE_TIMEOUT} \ ${KUBE_TIMEOUT} \
"${cover_params[@]+${cover_params[@]}}" \ "${cover_params[@]+${cover_params[@]}}" \
"${pkg}" "${pkg}"
done if [[ -f "${cover_profile}" ]]; then
exit 0 # Include all coverage reach data in the combined profile, but exclude the
# 'mode' lines, as there should be only one.
grep -h -v "^mode:" ${cover_profile} >>${combined_cover_profile} || true
fi fi
done
kube::test::find_pkgs | xargs go test "${goflags[@]:+${goflags[@]}}" \ if [[ -f ${combined_cover_profile} ]]; then
${KUBE_RACE} \ coverage_html_file="${cover_report_dir}/combined-coverage.html"
${KUBE_TIMEOUT} \ go tool cover -html="${combined_cover_profile}" -o="${coverage_html_file}"
${KUBE_COVER} kube::log::status "Combined coverage report: ${coverage_html_file}"
if [[ -x "${KUBE_GOVERALLS_BIN}" ]]; then
${KUBE_GOVERALLS_BIN} -coverprofile="${combined_cover_profile}" || true
fi
fi