./test: CI (./test) should never edit go.mod nor go.sum files

Tested and received as expected:
```
...
go: updates to go.mod needed, disabled by -mod=readonly
```
release-3.5
Piotr Tabor 2020-09-11 19:47:24 +02:00
parent d19758b501
commit 0f195baca1
1 changed files with 32 additions and 27 deletions

59
test
View File

@ -33,6 +33,11 @@
# $ COVERDIR=coverage PASSES="build_cov cov" ./test # $ COVERDIR=coverage PASSES="build_cov cov" ./test
set -e set -e
# The test script is not supposed to make any changes to the files
# e.g. add/update missing dependencies. Such divergences should be
# detected and trigger a failure that needs explicit developer's action.
export GOFLAGS=-mod=readonly
source ./build source ./build
# build before setting up test GOPATH # build before setting up test GOPATH
@ -152,7 +157,7 @@ function unit_pass {
else else
USERTIMEOUT="${TIMEOUT}" USERTIMEOUT="${TIMEOUT}"
fi fi
go test -mod=mod ${GO_TEST_FLAG} -timeout "${USERTIMEOUT}" "${COVER}" ${RACE} -cpu "${TEST_CPUS}" ${RUN_ARG} "$@" "${TEST[@]}" go test ${GO_TEST_FLAG} -timeout "${USERTIMEOUT}" "${COVER}" ${RACE} -cpu "${TEST_CPUS}" ${RUN_ARG} "$@" "${TEST[@]}"
} }
function integration_pass { function integration_pass {
@ -172,7 +177,7 @@ function integration_pass {
# if TESTCASE not set, PKG set, run all test cases in specified package # if TESTCASE not set, PKG set, run all test cases in specified package
# if TESTCASE not set, PKG not set, run all tests in all integration and integration_extra packages # if TESTCASE not set, PKG not set, run all tests in all integration and integration_extra packages
if [ -z "${TESTCASE}" ] && [ -z "${USERPKG}" ]; then if [ -z "${TESTCASE}" ] && [ -z "${USERPKG}" ]; then
go test -mod=mod -timeout "${USERTIMEOUT}" -v -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/integration" go test -timeout "${USERTIMEOUT}" -v -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/integration"
integration_extra "$@" integration_extra "$@"
else else
if [ -z "${USERPKG}" ]; then if [ -z "${USERPKG}" ]; then
@ -183,16 +188,16 @@ function integration_pass {
else else
INTEGTESTPKG=("${TEST[@]}") INTEGTESTPKG=("${TEST[@]}")
fi fi
go test -mod=mod -timeout "${USERTIMEOUT}" -v -cpu "${TEST_CPUS}" "${RUN_ARG}" "$@" "${INTEGTESTPKG[@]}" go test -timeout "${USERTIMEOUT}" -v -cpu "${TEST_CPUS}" "${RUN_ARG}" "$@" "${INTEGTESTPKG[@]}"
fi fi
} }
function integration_extra { function integration_extra {
go test -mod=mod -timeout 1m -v ${RACE} -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/client/integration" go test -timeout 1m -v ${RACE} -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/client/integration"
go test -mod=mod -timeout 25m -v ${RACE} -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/clientv3/integration" go test -timeout 25m -v ${RACE} -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/clientv3/integration"
go test -mod=mod -timeout 1m -v -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/contrib/raftexample" go test -timeout 1m -v -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/contrib/raftexample"
go test -mod=mod -timeout 5m -v ${RACE} -tags v2v3 "$@" "${REPO_PATH}/etcdserver/api/v2store" go test -timeout 5m -v ${RACE} -tags v2v3 "$@" "${REPO_PATH}/etcdserver/api/v2store"
go test -mod=mod -timeout 1m -v ${RACE} -cpu "${TEST_CPUS}" -run=Example "$@" "${TEST[@]}" go test -timeout 1m -v ${RACE} -cpu "${TEST_CPUS}" -run=Example "$@" "${TEST[@]}"
} }
function functional_pass { function functional_pass {
@ -269,26 +274,26 @@ function cov_pass {
for t in $(echo "${TEST_PKGS}" | grep -vE "(tests/e2e|functional)"); do for t in $(echo "${TEST_PKGS}" | grep -vE "(tests/e2e|functional)"); do
tf=$(echo "$t" | tr / _) tf=$(echo "$t" | tr / _)
# cache package compilation data for faster repeated builds # cache package compilation data for faster repeated builds
go test -mod=mod "${GOCOVFLAGS[@]}" -i "${REPO_PATH}/$t" || true go test "${GOCOVFLAGS[@]}" -i "${REPO_PATH}/$t" || true
# uses -run=Test to skip examples because clientv3/ example tests will leak goroutines # uses -run=Test to skip examples because clientv3/ example tests will leak goroutines
go test -mod=mod "${GOCOVFLAGS[@]}" -run=Test -coverprofile "$COVERDIR/${tf}.coverprofile" "${REPO_PATH}/$t" || failed="$failed $t" go test "${GOCOVFLAGS[@]}" -run=Test -coverprofile "$COVERDIR/${tf}.coverprofile" "${REPO_PATH}/$t" || failed="$failed $t"
done done
# v2v3 tests # v2v3 tests
go test -mod=mod -tags v2v3 "${GOCOVFLAGS[@]}" -coverprofile "$COVERDIR/store-v2v3.coverprofile" "${REPO_PATH}/clientv3/integration" || failed="$failed store-v2v3" go test -tags v2v3 "${GOCOVFLAGS[@]}" -coverprofile "$COVERDIR/store-v2v3.coverprofile" "${REPO_PATH}/clientv3/integration" || failed="$failed store-v2v3"
# proxy tests # proxy tests
go test -mod=mod -tags cluster_proxy "${GOCOVFLAGS[@]}" -coverprofile "$COVERDIR/proxy_integration.coverprofile" "${REPO_PATH}/integration" || failed="$failed proxy-integration" go test -tags cluster_proxy "${GOCOVFLAGS[@]}" -coverprofile "$COVERDIR/proxy_integration.coverprofile" "${REPO_PATH}/integration" || failed="$failed proxy-integration"
go test -mod=mod -tags cluster_proxy "${GOCOVFLAGS[@]}" -coverprofile "$COVERDIR/proxy_clientv3.coverprofile" "${REPO_PATH}/clientv3/integration" || failed="$failed proxy-clientv3/integration" go test -tags cluster_proxy "${GOCOVFLAGS[@]}" -coverprofile "$COVERDIR/proxy_clientv3.coverprofile" "${REPO_PATH}/clientv3/integration" || failed="$failed proxy-clientv3/integration"
# run code coverage for e2e tests # run code coverage for e2e tests
# use 30m timeout because e2e coverage takes longer # use 30m timeout because e2e coverage takes longer
# due to many tests cause etcd process to wait # due to many tests cause etcd process to wait
# on leadership transfer timeout during gracefully shutdown # on leadership transfer timeout during gracefully shutdown
echo Testing tests/e2e without proxy... echo Testing tests/e2e without proxy...
go test -mod=mod -tags cov -timeout 30m -v "${REPO_PATH}/tests/e2e" || failed="$failed tests/e2e" go test -tags cov -timeout 30m -v "${REPO_PATH}/tests/e2e" || failed="$failed tests/e2e"
echo Testing tests/e2e with proxy... echo Testing tests/e2e with proxy...
go test -mod=mod -tags "cov cluster_proxy" -timeout 30m -v "${REPO_PATH}/tests/e2e" || failed="$failed tests/e2e-proxy" go test -tags "cov cluster_proxy" -timeout 30m -v "${REPO_PATH}/tests/e2e" || failed="$failed tests/e2e-proxy"
# incrementally merge to get coverage data even if some coverage files are corrupted # incrementally merge to get coverage data even if some coverage files are corrupted
# optimistically assume etcdserver package's coverage file is OK since gocovmerge # optimistically assume etcdserver package's coverage file is OK since gocovmerge
@ -328,15 +333,15 @@ function e2e_pass {
USERTIMEOUT="${TIMEOUT}" USERTIMEOUT="${TIMEOUT}"
fi fi
go test -mod=mod -timeout "${USERTIMEOUT}" -v -cpu "${TEST_CPUS}" "${RUN_ARG}" "$@" "${REPO_PATH}/tests/e2e" go test -timeout "${USERTIMEOUT}" -v -cpu "${TEST_CPUS}" "${RUN_ARG}" "$@" "${REPO_PATH}/tests/e2e"
} }
function integration_e2e_pass { function integration_e2e_pass {
echo "Running integration and e2e tests..." echo "Running integration and e2e tests..."
go test -mod=mod -timeout 30m -v -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/tests/e2e" & go test -timeout 30m -v -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/tests/e2e" &
e2epid="$!" e2epid="$!"
go test -mod=mod -timeout 30m -v -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/integration" & go test -timeout 30m -v -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/integration" &
intpid="$!" intpid="$!"
wait $e2epid wait $e2epid
wait $intpid wait $intpid
@ -344,9 +349,9 @@ function integration_e2e_pass {
} }
function grpcproxy_pass { function grpcproxy_pass {
go test -mod=mod -timeout 30m -v ${RACE} -tags cluster_proxy -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/integration" go test -timeout 30m -v ${RACE} -tags cluster_proxy -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/integration"
go test -mod=mod -timeout 30m -v ${RACE} -tags cluster_proxy -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/clientv3/integration" go test -timeout 30m -v ${RACE} -tags cluster_proxy -cpu "${TEST_CPUS}" "$@" "${REPO_PATH}/clientv3/integration"
go test -mod=mod -timeout 30m -v -tags cluster_proxy "$@" "${REPO_PATH}/tests/e2e" go test -timeout 30m -v -tags cluster_proxy "$@" "${REPO_PATH}/tests/e2e"
} }
function release_pass { function release_pass {
@ -450,7 +455,7 @@ function gofmt_pass {
} }
function govet_pass { function govet_pass {
vetRes=$(go vet -mod=mod "${TEST[@]}") vetRes=$(go vet "${TEST[@]}")
if [ -n "${vetRes}" ]; then if [ -n "${vetRes}" ]; then
echo -e "govet checking failed:\\n${vetRes}" echo -e "govet checking failed:\\n${vetRes}"
exit 255 exit 255
@ -641,7 +646,7 @@ function bom_pass {
fi fi
echo "Checking bill of materials..." echo "Checking bill of materials..."
# https://github.com/golang/go/commit/7c388cc89c76bc7167287fb488afcaf5a4aa12bf # https://github.com/golang/go/commit/7c388cc89c76bc7167287fb488afcaf5a4aa12bf
GOFLAGS="-mod=mod" license-bill-of-materials \ license-bill-of-materials \
--override-file bill-of-materials.override.json \ --override-file bill-of-materials.override.json \
go.etcd.io/etcd/v3 go.etcd.io/etcd/v3/etcdctl >bom-now.json || true go.etcd.io/etcd/v3 go.etcd.io/etcd/v3/etcdctl >bom-now.json || true
if ! diff bill-of-materials.json bom-now.json; then if ! diff bill-of-materials.json bom-now.json; then
@ -667,16 +672,16 @@ function dep_pass {
function build_cov_pass { function build_cov_pass {
out="bin" out="bin"
if [ -n "${BINDIR}" ]; then out="${BINDIR}"; fi if [ -n "${BINDIR}" ]; then out="${BINDIR}"; fi
go test -mod=mod -tags cov -c -covermode=set -coverpkg="$PKGS_COMMA" -o "${out}/etcd_test" go test -tags cov -c -covermode=set -coverpkg="$PKGS_COMMA" -o "${out}/etcd_test"
go test -mod=mod -tags cov -c -covermode=set -coverpkg="$PKGS_COMMA" -o "${out}/etcdctl_test" "${REPO_PATH}/etcdctl" go test -tags cov -c -covermode=set -coverpkg="$PKGS_COMMA" -o "${out}/etcdctl_test" "${REPO_PATH}/etcdctl"
} }
# fail fast on static tests # fail fast on static tests
function build_pass { function build_pass {
echo "Checking build..." echo "Checking build..."
GO_BUILD_FLAGS="-v -mod=mod" etcd_build GO_BUILD_FLAGS="-v" etcd_build
GO_BUILD_FLAGS="-v -mod=mod" tools_build GO_BUILD_FLAGS="-v" tools_build
} }
for pass in $PASSES; do for pass in $PASSES; do