mirror of https://github.com/hashicorp/consul
parent
49b165965d
commit
b2032b05be
@ -0,0 +1,13 @@
|
||||
FROM travisci/ci-garnet:packer-1512502276-986baf0
|
||||
|
||||
ENV GOLANG_VERSION 1.10.3
|
||||
|
||||
RUN mkdir -p /home/travis/go && chown -R travis /home/travis/go
|
||||
|
||||
ENV GOPATH /home/travis/go
|
||||
|
||||
USER travis
|
||||
|
||||
COPY flake.sh /usr/local/bin/flake.sh
|
||||
|
||||
ENTRYPOINT [ "bash", "flake.sh" ]
|
@ -0,0 +1,29 @@
|
||||
#!/bin/bash
|
||||
LOG_FILE="test.log"
|
||||
|
||||
cd $GOPATH/$APP
|
||||
|
||||
export PATH=$GOPATH/$APP/bin:$GOPATH/bin:$PATH
|
||||
|
||||
if ! [[ $(ls -l | grep 'GNUmakefile\|README.md\|LICENSE') ]] ; then
|
||||
echo "App source not present in cwd. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mv $TEST_BINARY $TEST_PKG/$TEST_BINARY
|
||||
cd $TEST_PKG
|
||||
|
||||
for ((i=0; i < $ITERATIONS; i++)) ; do
|
||||
echo "$(date +"%F %T") - ($((i+1))/$ITERATIONS)"
|
||||
|
||||
./$TEST_BINARY -test.run "$TEST" -test.parallel 4 -test.timeout 8m -test.v &> $LOG_FILE
|
||||
echo $? > exit-code
|
||||
|
||||
grep -A10 'panic: ' $LOG_FILE || true
|
||||
awk '/^[^[:space:]]/ {do_print=0} /--- SKIP/ {do_print=1} do_print==1 {print}' $LOG_FILE
|
||||
awk '/^[^[:space:]]/ {do_print=0} /--- FAIL/ {do_print=1} do_print==1 {print}' $LOG_FILE
|
||||
|
||||
if [ $(cat exit-code) != "0" ] ; then
|
||||
exit 1;
|
||||
fi
|
||||
done
|
@ -0,0 +1,169 @@
|
||||
#!/bin/bash
|
||||
pushd $(dirname ${BASH_SOURCE[0]}) > /dev/null
|
||||
SCRIPT_DIR=$(pwd)
|
||||
pushd ../.. > /dev/null
|
||||
SOURCE_DIR=$(pwd)
|
||||
pushd build-support/docker > /dev/null
|
||||
IMG_DIR=$(pwd)
|
||||
popd > /dev/null
|
||||
|
||||
source "${SCRIPT_DIR}/functions.sh"
|
||||
|
||||
IMAGE="travis-img-v0.13"
|
||||
CONTAINER="travis-cnt"
|
||||
GOOS="linux"
|
||||
GOARCH="amd64"
|
||||
TEST_BINARY="flake.test"
|
||||
|
||||
function usage {
|
||||
cat <<-EOF
|
||||
Usage: test-flake [<options ...>]
|
||||
|
||||
Description:
|
||||
|
||||
test-flake surfaces flakiness in tests by constraining CPU resources.
|
||||
|
||||
Single or package-wide tests are run for multiple iterations with a configurable
|
||||
amount of CPU resources.
|
||||
|
||||
0.15 CPUs and 30 iterations are configured as sane defaults.
|
||||
|
||||
See Docker docs for more info on tuning 'cpus' param:
|
||||
https://docs.docker.com/config/containers/resource_constraints/#cpu
|
||||
|
||||
Options:
|
||||
|
||||
--pkg="" Target package
|
||||
--test="" Target test (requires pkg flag)
|
||||
--cpus=0.15 Amount of CPU resources for container
|
||||
--n=30 Number of times to run tests
|
||||
|
||||
Examples:
|
||||
|
||||
./test-flake.sh --pkg connect/proxy
|
||||
./test-flake.sh --pkg connect/proxy --cpus 0.20
|
||||
./test-flake.sh --pkg connect/proxy --test Listener
|
||||
./test-flake.sh --pkg connect/proxy --test TestUpstreamListener
|
||||
./test-flake.sh --pkg connect/proxy --test TestUpstreamListener -n 100
|
||||
EOF
|
||||
}
|
||||
|
||||
function build_repro_env {
|
||||
# Arguments:
|
||||
# $1 - pkg, Target package
|
||||
# $2 - test, Target tests
|
||||
# $3 - cpus, Amount of CPU resources for container
|
||||
# $4 - n, Number of times to run tests
|
||||
|
||||
APP=$(pwd | awk '{n=split($0, a, "/"); print a[n]}')
|
||||
|
||||
status_stage -e "App:\t\t$APP"
|
||||
status_stage -e "Package:\t$1"
|
||||
status_stage -e "Test:\t\t$2"
|
||||
status_stage -e "CPUs:\t\t$3"
|
||||
status_stage -e "Iterations:\t$4"
|
||||
echo
|
||||
|
||||
status_stage "----> Cleaning up old containers..."
|
||||
if docker ps -a | grep $CONTAINER ; then
|
||||
docker rm $(docker ps -a | grep $CONTAINER | awk '{print $1;}')
|
||||
fi
|
||||
|
||||
status_stage '----> Rebuilding image...'
|
||||
(cd $IMG_DIR && docker build -q -t $IMAGE --no-cache -f Test-Flake.dockerfile .)
|
||||
|
||||
status_stage "--> Building app binary..."
|
||||
env GOOS=$GOOS GOARCH=$GOARCH go build -o bin/$APP
|
||||
|
||||
status_stage "-> Building test binary..."
|
||||
env GOOS=$GOOS GOARCH=$GOARCH go test -c "./$1" -o $TEST_BINARY
|
||||
|
||||
status_stage "> Running container..."
|
||||
status_stage
|
||||
|
||||
docker run \
|
||||
--rm \
|
||||
--name $CONTAINER \
|
||||
--cpus="$3" \
|
||||
-v $SOURCE_DIR:/home/travis/go/$APP \
|
||||
-e TEST_BINARY="$TEST_BINARY" \
|
||||
-e TEST_PKG="$1" \
|
||||
-e TEST="$2" \
|
||||
-e ITERATIONS="$4" \
|
||||
-e APP="$APP" \
|
||||
$IMAGE
|
||||
}
|
||||
|
||||
function err_usage {
|
||||
err "$1"
|
||||
err ""
|
||||
err "$(usage)"
|
||||
}
|
||||
|
||||
function main {
|
||||
declare pkg=""
|
||||
declare test=""
|
||||
declare cpus=""
|
||||
declare n=""
|
||||
|
||||
|
||||
while test $# -gt 0
|
||||
do
|
||||
case "$1" in
|
||||
-h | --help )
|
||||
usage
|
||||
return 0
|
||||
;;
|
||||
|
||||
--pkg )
|
||||
if test -z "$2"
|
||||
then
|
||||
err_usage "ERROR: option pkg requires an argument"
|
||||
return 1
|
||||
fi
|
||||
|
||||
pkg="$2"
|
||||
shift 2
|
||||
;;
|
||||
|
||||
--test )
|
||||
test="$2"
|
||||
shift 2
|
||||
;;
|
||||
|
||||
--cpus )
|
||||
if test -n "$2"
|
||||
then
|
||||
cpus="$2"
|
||||
else
|
||||
cpus="0.15"
|
||||
fi
|
||||
|
||||
shift 2
|
||||
;;
|
||||
|
||||
--n )
|
||||
if test -n "$2"
|
||||
then
|
||||
n="$2"
|
||||
else
|
||||
n="30"
|
||||
fi
|
||||
|
||||
shift 2
|
||||
;;
|
||||
|
||||
* )
|
||||
err_usage "ERROR: Unknown argument: '$1'"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
build_repro_env "${pkg}" "${test}" "${cpus}" "${n}" || return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
main "$@"
|
||||
exit $?
|
Loading…
Reference in new issue