prow.sh: more efficient execution of individual tests

When running only some tests, sometimes extra, unnecessarily work was
done, like bringing up the cluster without alpha gates.
This commit is contained in:
Patrick Ohly
2019-04-08 08:51:11 +02:00
parent f3d1d2df5c
commit aa45a1cd9b

218
prow.sh
View File

@@ -202,18 +202,30 @@ configvar CSI_PROW_SANITY_CONTAINER "hostpath" "Kubernetes container with CSI dr
# is off by default. A CSI driver can change that default in its .prow.sh # is off by default. A CSI driver can change that default in its .prow.sh
# by setting CSI_PROW_TESTS_SANITY. # by setting CSI_PROW_TESTS_SANITY.
configvar CSI_PROW_TESTS "unit parallel serial parallel-alpha serial-alpha ${CSI_PROW_TESTS_SANITY}" "tests to run" configvar CSI_PROW_TESTS "unit parallel serial parallel-alpha serial-alpha ${CSI_PROW_TESTS_SANITY}" "tests to run"
test_enabled () { tests_enabled () {
local test="$1" local t1 t2
# We want word-splitting here, so ignore: Double quote to prevent globbing and word splitting. # We want word-splitting here, so ignore: Quote to prevent word splitting, or split robustly with mapfile or read -a.
# shellcheck disable=SC2086 # shellcheck disable=SC2206
set ${CSI_PROW_TESTS} local tests=(${CSI_PROW_TESTS})
for t in "$@"; do for t1 in "$@"; do
if [ "$t" = "$test" ]; then for t2 in "${tests[@]}"; do
return if [ "$t1" = "$t2" ]; then
fi return
fi
done
done done
return 1 return 1
} }
tests_need_kind () {
tests_enabled "sanity" "parallel" "serial" "serial-alpha" "parallel-alpha"
}
tests_need_non_alpha_cluster () {
tests_enabled "sanity" "parallel" "serial"
}
tests_need_alpha_cluster () {
tests_enabled "parallel-alpha" "serial-alpha"
}
# Serial vs. parallel is always determined by these regular expressions. # Serial vs. parallel is always determined by these regular expressions.
# Individual regular expressions are seperated by spaces for readability # Individual regular expressions are seperated by spaces for readability
@@ -521,6 +533,15 @@ install_hostpath () {
return 1 return 1
fi fi
if ${CSI_PROW_BUILD_JOB}; then
# Ignore: Double quote to prevent globbing and word splitting.
# Ignore: To read lines rather than words, pipe/redirect to a 'while read' loop.
# shellcheck disable=SC2086 disable=SC2013
for i in $(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//'); do
kind load docker-image --name csi-prow $i:csiprow || die "could not load the $i:latest image into the kind cluster"
done
fi
if deploy_hostpath="$(find_deployment "$(pwd)/deploy")"; then if deploy_hostpath="$(find_deployment "$(pwd)/deploy")"; then
: :
elif [ "${CSI_PROW_HOSTPATH_REPO}" = "none" ]; then elif [ "${CSI_PROW_HOSTPATH_REPO}" = "none" ]; then
@@ -836,7 +857,7 @@ main () {
# might have been minor or unavoidable, for example when experimenting with # might have been minor or unavoidable, for example when experimenting with
# changes in "release-tools" in a PR (that fails the "is release-tools unmodified" # changes in "release-tools" in a PR (that fails the "is release-tools unmodified"
# test). # test).
if test_enabled "unit"; then if tests_enabled "unit"; then
if ! run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make -k test 2>&1 | make_test_to_junit; then if ! run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make -k test 2>&1 | make_test_to_junit; then
warn "'make test' failed, proceeding anyway" warn "'make test' failed, proceeding anyway"
ret=1 ret=1
@@ -846,102 +867,99 @@ main () {
run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make container || die "'make container' failed" run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make container || die "'make container' failed"
fi fi
install_kind || die "installing kind failed" if tests_need_kind; then
start_cluster || die "starting the cluster failed" install_kind || die "installing kind failed"
if ${CSI_PROW_BUILD_JOB}; then
cmds="$(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//')"
# Get the image that was just built (if any) from the
# top-level Makefile CMDS variable and set the
# deploy-hostpath.sh env variables for it. We also need to
# side-load those images into the cluster.
for i in $cmds; do
e=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr - _)
images="$images ${e}_REGISTRY=none ${e}_TAG=csiprow"
# We must avoid the tag "latest" because that implies
# always pulling the image
# (https://github.com/kubernetes-sigs/kind/issues/328).
docker tag "$i:latest" "$i:csiprow" || die "tagging the locally built container image for $i failed"
kind load docker-image --name csi-prow "$i:csiprow" || die "could not load the $i:latest image into the kind cluster"
done
if [ -e deploy/kubernetes/rbac.yaml ]; then
# This is one of those components which has its own RBAC rules (like external-provisioner).
# We are testing a locally built image and also want to test with the the current,
# potentially modified RBAC rules.
if [ "$(echo "$cmds" | wc -w)" != 1 ]; then
die "ambiguous deploy/kubernetes/rbac.yaml: need exactly one command, got: $cmds"
fi
e=$(echo "$cmds" | tr '[:lower:]' '[:upper:]' | tr - _)
images="$images ${e}_RBAC=$(pwd)/deploy/kubernetes/rbac.yaml"
fi
fi
# Installing the driver might be disabled, in which case we bail out early.
if ! install_hostpath "$images"; then
info "hostpath driver installation disabled, skipping E2E testing"
return "$ret"
fi
collect_cluster_info
if test_enabled "sanity"; then
if ! run_sanity; then
ret=1
fi
fi
if test_enabled "parallel"; then
# Ignore: Double quote to prevent globbing and word splitting.
# shellcheck disable=SC2086
if ! run_e2e parallel ${CSI_PROW_GINKO_PARALLEL} \
-focus="External.Storage" \
-skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then
warn "E2E parallel failed"
ret=1
fi
fi
if test_enabled "serial"; then
if ! run_e2e serial \
-focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_SERIAL}"))" \
-skip="$(regex_join "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then
warn "E2E serial failed"
ret=1
fi
fi
if (test_enabled "parallel-alpha" || test_enabled "serial-alpha") && [ "${CSI_PROW_E2E_ALPHA_GATES}" ]; then
# Need to (re)create the cluster.
start_cluster "${CSI_PROW_E2E_ALPHA_GATES}" || die "starting alpha cluster failed"
if ${CSI_PROW_BUILD_JOB}; then if ${CSI_PROW_BUILD_JOB}; then
# Ignore: Double quote to prevent globbing and word splitting. cmds="$(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//')"
# Ignore: To read lines rather than words, pipe/redirect to a 'while read' loop. # Get the image that was just built (if any) from the
# shellcheck disable=SC2086 disable=SC2013 # top-level Makefile CMDS variable and set the
for i in $(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//'); do # deploy-hostpath.sh env variables for it. We also need to
kind load docker-image --name csi-prow $i:csiprow || die "could not load the $i:latest image into the kind cluster" # side-load those images into the cluster.
done for i in $cmds; do
fi e=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr - _)
install_hostpath "$images" || die "hostpath driver installation failed unexpectedly on alpha cluster" images="$images ${e}_REGISTRY=none ${e}_TAG=csiprow"
if test_enabled "parallel-alpha"; then # We must avoid the tag "latest" because that implies
# Ignore: Double quote to prevent globbing and word splitting. # always pulling the image
# shellcheck disable=SC2086 # (https://github.com/kubernetes-sigs/kind/issues/328).
if ! run_e2e parallel-alpha ${CSI_PROW_GINKO_PARALLEL} \ docker tag "$i:latest" "$i:csiprow" || die "tagging the locally built container image for $i failed"
-focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_ALPHA}"))" \ done
-skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_SKIP}")"; then
warn "E2E parallel alpha failed" if [ -e deploy/kubernetes/rbac.yaml ]; then
ret=1 # This is one of those components which has its own RBAC rules (like external-provisioner).
# We are testing a locally built image and also want to test with the the current,
# potentially modified RBAC rules.
if [ "$(echo "$cmds" | wc -w)" != 1 ]; then
die "ambiguous deploy/kubernetes/rbac.yaml: need exactly one command, got: $cmds"
fi
e=$(echo "$cmds" | tr '[:lower:]' '[:upper:]' | tr - _)
images="$images ${e}_RBAC=$(pwd)/deploy/kubernetes/rbac.yaml"
fi fi
fi fi
if test_enabled "serial-alpha"; then if tests_need_non_alpha_cluster; then
if ! run_e2e serial-alpha \ start_cluster || die "starting the non-alpha cluster failed"
-focus="External.Storage.*(($(regex_join "${CSI_PROW_E2E_SERIAL}")).*($(regex_join "${CSI_PROW_E2E_ALPHA}"))|($(regex_join "${CSI_PROW_E2E_ALPHA}")).*($(regex_join "${CSI_PROW_E2E_SERIAL}")))" \
-skip="$(regex_join "${CSI_PROW_E2E_SKIP}")"; then # Installing the driver might be disabled.
warn "E2E serial alpha failed" if install_hostpath "$images"; then
ret=1 collect_cluster_info
if tests_enabled "sanity"; then
if ! run_sanity; then
ret=1
fi
fi
if tests_enabled "parallel"; then
# Ignore: Double quote to prevent globbing and word splitting.
# shellcheck disable=SC2086
if ! run_e2e parallel ${CSI_PROW_GINKO_PARALLEL} \
-focus="External.Storage" \
-skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then
warn "E2E parallel failed"
ret=1
fi
fi
if tests_enabled "serial"; then
if ! run_e2e serial \
-focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_SERIAL}"))" \
-skip="$(regex_join "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then
warn "E2E serial failed"
ret=1
fi
fi
fi
fi
if tests_need_alpha_cluster && [ "${CSI_PROW_E2E_ALPHA_GATES}" ]; then
# Need to (re)create the cluster.
start_cluster "${CSI_PROW_E2E_ALPHA_GATES}" || die "starting alpha cluster failed"
# Installing the driver might be disabled.
if install_hostpath "$images"; then
collect_cluster_info
if tests_enabled "parallel-alpha"; then
# Ignore: Double quote to prevent globbing and word splitting.
# shellcheck disable=SC2086
if ! run_e2e parallel-alpha ${CSI_PROW_GINKO_PARALLEL} \
-focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_ALPHA}"))" \
-skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_SKIP}")"; then
warn "E2E parallel alpha failed"
ret=1
fi
fi
if tests_enabled "serial-alpha"; then
if ! run_e2e serial-alpha \
-focus="External.Storage.*(($(regex_join "${CSI_PROW_E2E_SERIAL}")).*($(regex_join "${CSI_PROW_E2E_ALPHA}"))|($(regex_join "${CSI_PROW_E2E_ALPHA}")).*($(regex_join "${CSI_PROW_E2E_SERIAL}")))" \
-skip="$(regex_join "${CSI_PROW_E2E_SKIP}")"; then
warn "E2E serial alpha failed"
ret=1
fi
fi
fi fi
fi fi
fi fi