From 26addee75b6035c67d6b6bb3917ed9fe75dcb76f Mon Sep 17 00:00:00 2001 From: Jeff Grafton Date: Wed, 18 Feb 2015 17:28:52 -0800 Subject: [PATCH 1/3] Produce a combined coverage report when running Go unit tests. The Go coverage tool does not currently support recording a coverage data profile across packages, so we must manually combine these coverage profiles and use it to produce an HTML report when KUBE_COVER is nonempty. The exact value of KUBE_COVER is now ignored; KUBE_COVERMODE can be used to set the coverage mode from the default of "atomic". Additionally, if KUBE_GOVERALLS_BIN is set, hack/test-go.sh will attempt to report coverage results to Coveralls.io. This is intended to be used with the Travis build. --- hack/benchmark-go.sh | 2 +- hack/test-go.sh | 90 ++++++++++++++++++++++++++++---------------- 2 files changed, 58 insertions(+), 34 deletions(-) diff --git a/hack/benchmark-go.sh b/hack/benchmark-go.sh index 3753f6b6bc5..842cfeb6c61 100755 --- a/hack/benchmark-go.sh +++ b/hack/benchmark-go.sh @@ -20,4 +20,4 @@ set -o pipefail KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. -KUBE_COVER=" " KUBE_RACE=" " "${KUBE_ROOT}/hack/test-go.sh" "" -test.run="^X" -benchtime=1s -bench=. -benchmem +KUBE_COVER="" KUBE_RACE=" " "${KUBE_ROOT}/hack/test-go.sh" "" -test.run="^X" -benchtime=1s -bench=. -benchmem diff --git a/hack/test-go.sh b/hack/test-go.sh index de5c5693714..dfc0f62d3bf 100755 --- a/hack/test-go.sh +++ b/hack/test-go.sh @@ -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 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 +# Set to the goveralls binary path to report coverage results to Coveralls.io. +KUBE_GOVERALLS_BIN=${KUBE_GOVERALLS_BIN:-} kube::test::usage() { kube::log::usage_from_stdin <${combined_cover_profile} fi -kube::test::find_pkgs | xargs go test "${goflags[@]:+${goflags[@]}}" \ - ${KUBE_RACE} \ - ${KUBE_TIMEOUT} \ - ${KUBE_COVER} +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 + pkg=${KUBE_GO_PACKAGE}/${arg} + + cover_params=() + cover_profile="" + if [[ -n "${KUBE_COVER}" ]]; then + cover_profile=${cover_report_dir}/${arg}/coverage.out + mkdir -p "${cover_report_dir}/${arg}" + cover_params=(-cover -covermode="${KUBE_COVERMODE}" -coverprofile="${cover_profile}") + fi + + go test "${goflags[@]:+${goflags[@]}}" \ + ${KUBE_RACE} \ + ${KUBE_TIMEOUT} \ + "${cover_params[@]+${cover_params[@]}}" \ + "${pkg}" + if [[ -f "${cover_profile}" ]]; then + # 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 +done + +if [[ -f ${combined_cover_profile} ]]; then + coverage_html_file="${cover_report_dir}/combined-coverage.html" + go tool cover -html="${combined_cover_profile}" -o="${coverage_html_file}" + 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 From c669c63ff39fefb37325d965c3e4a3e9bfe74e1c Mon Sep 17 00:00:00 2001 From: Jeff Grafton Date: Wed, 18 Feb 2015 17:34:05 -0800 Subject: [PATCH 2/3] Use goveralls to report coverage results from Travis. --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b1c42b58fc0..dc07b259076 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ go: install: - 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/verify-gofmt.sh - ./hack/verify-boilerplate.sh @@ -14,7 +15,7 @@ install: - ./hack/build-go.sh 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/verify-gendocs.sh - PATH=$HOME/gopath/bin:./third_party/etcd:$PATH ./hack/test-integration.sh From c444c172bc21540094250067e796ba876b536c06 Mon Sep 17 00:00:00 2001 From: Jeff Grafton Date: Wed, 18 Feb 2015 18:04:55 -0800 Subject: [PATCH 3/3] Add Coveralls coverage badge to README.md. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 31ac112e383..8e90a01b8cf 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 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, providing basic mechanisms for deployment, maintenance, and scaling of applications.