From 9f0fd5fb4dfcff48a50765863e555c35f872a609 Mon Sep 17 00:00:00 2001 From: freddygv Date: Wed, 5 Sep 2018 18:48:10 +0100 Subject: [PATCH 1/4] Add flake-repro tool and corresponding test-flake goal to makefile --- GNUmakefile | 6 + build-support/flake-repro/Dockerfile | 16 +++ build-support/flake-repro/README.md | 35 ++++++ build-support/flake-repro/main.go | 180 +++++++++++++++++++++++++++ build-support/flake-repro/test.sh | 31 +++++ 5 files changed, 268 insertions(+) create mode 100644 build-support/flake-repro/Dockerfile create mode 100644 build-support/flake-repro/README.md create mode 100644 build-support/flake-repro/main.go create mode 100644 build-support/flake-repro/test.sh diff --git a/GNUmakefile b/GNUmakefile index 3286ced16941..392a07e119e4 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -194,6 +194,12 @@ test-ci: other-consul dev-build vet test-install-deps fi \ fi +test-flake: other-consul vet test-install-deps + @ cd build-support/flake-repro; \ + go build -o flake-repro; \ + ./flake-repro $(ARGS); \ + rm flake-repro + other-consul: @echo "--> Checking for other consul instances" @if ps -ef | grep 'consul agent' | grep -v grep ; then \ diff --git a/build-support/flake-repro/Dockerfile b/build-support/flake-repro/Dockerfile new file mode 100644 index 000000000000..704347992723 --- /dev/null +++ b/build-support/flake-repro/Dockerfile @@ -0,0 +1,16 @@ +FROM travisci/ci-garnet:packer-1512502276-986baf0 + +ENV GOLANG_VERSION 1.10.3 + +RUN mkdir -p /home/travis/go/src/github.com/hashicorp && \ + chown -R travis /home/travis/go + +WORKDIR /home/travis/go/src/github.com/hashicorp + +ENV GOPATH /home/travis/go + +USER travis + +COPY test.sh /usr/local/bin/test.sh + +ENTRYPOINT [ "bash", "test.sh" ] \ No newline at end of file diff --git a/build-support/flake-repro/README.md b/build-support/flake-repro/README.md new file mode 100644 index 000000000000..702569e57409 --- /dev/null +++ b/build-support/flake-repro/README.md @@ -0,0 +1,35 @@ +# repro-constrained-travis +Resource constrained env based on Travis CI for surfacing flakiness in tests. + +## Usage: +Build binary, then run wth `./flake-repro [options]` + +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: +Run all tests for a package: +``` +./flake-repro.sh -pkg connect/proxy +``` + +Run tests matching a pattern: +``` +./flake-repro.sh -pkg connect/proxy -test Listener +``` + +Run a single test: +``` +./flake-repro.sh -pkg connect/proxy -test TestUpstreamListener +``` + +Run a single test 100 times: +``` +./flake-repro.sh -pkg connect/proxy -test TestUpstreamListener -n 100 +``` \ No newline at end of file diff --git a/build-support/flake-repro/main.go b/build-support/flake-repro/main.go new file mode 100644 index 000000000000..102c132be1fc --- /dev/null +++ b/build-support/flake-repro/main.go @@ -0,0 +1,180 @@ +package main + +import ( + "bufio" + "flag" + "fmt" + "log" + "os" + "os/exec" + "strings" +) + +const ( + image = "travis-img-v0.13" + container = "travis-cnt" + goos = "linux" + goarch = "amd64" + testBinary = "flake.test" +) + +func main() { + var pkg string + var test string + var cpus float64 + var iterations int + + flags := flag.NewFlagSet("repro", flag.ExitOnError) + flags.Usage = func() { printUsage() } + + flags.Float64Var(&cpus, "cpus", 0.15, "amount of cpus to use") + flags.IntVar(&iterations, "n", 30, "number of times to run tests") + flags.StringVar(&pkg, "pkg", "", "package to test") + flags.StringVar(&test, "test", "", "test to run") + + if err := flags.Parse(os.Args[1:]); err != nil { + flags.Usage() + os.Exit(1) + } + + if pkg == "" || len(strings.Split(pkg, " ")) > 1 { + log.Fatal("error: one pkg is required") + } + + // a[n-2] because not running from base of consul repo + appCmd := "echo $(pwd | awk '{n=split($0, a, \"/\"); print a[n-2]}')" + bytes, err := exec.Command("sh", "-c", appCmd).Output() + if err != nil { + log.Fatalf("failed to get app name from cwd") + } + app := strings.TrimSpace(string(bytes)) + + fmt.Printf("App:\t\t%s\n", app) + fmt.Printf("Package:\t%s\n", pkg) + fmt.Printf("Test:\t\t%s\n", test) + fmt.Printf("CPUs:\t\t%f\n", cpus) + fmt.Printf("Iterations:\t%d\n", iterations) + + fmt.Println("----> Cleaning up old containers...") + rmContainerCmd := fmt.Sprintf( + `if docker ps -a | grep %s ; then + docker rm -f $(docker ps -a | grep %s | awk '{print $1;}') + fi`, container, container) + + out, err := exec.Command("sh", "-c", rmContainerCmd).CombinedOutput() + if err != nil { + log.Println(string(out)) + log.Fatalf("failed to remove existing container '%s': %v", container, err) + } + + fmt.Println("---> Rebuilding image...") + buildImageCmd := fmt.Sprintf("docker build -q -t %s --no-cache .", image) + + out, err = exec.Command("sh", "-c", buildImageCmd).CombinedOutput() + if err != nil { + log.Println(string(out)) + log.Fatalf("failed to build image '%s': %v", image, err) + } + + fmt.Println("--> Building app binary...") + installCmd := fmt.Sprintf("(cd ../../ && env GOOS=%s GOARCH=%s go build -o bin/%s)", goos, goarch, app) + + out, err = exec.Command("sh", "-c", installCmd).CombinedOutput() + if err != nil { + log.Println(string(out)) + log.Fatalf("failed to build app binary: %v", err) + } + + compileCmd := fmt.Sprintf("(cd ../../ && env GOOS=%s GOARCH=%s go test -c \"./%s\" -o %s)", goos, goarch, pkg, testBinary) + + out, err = exec.Command("sh", "-c", compileCmd).CombinedOutput() + if err != nil { + log.Println(string(out)) + log.Fatalf("failed to compile test binary: %v", err) + } + + wd, err := os.Getwd() + if err != nil { + log.Fatalf("failed to get cwd: %v", err) + } + baseDir := strings.SplitAfter(wd, app)[0] + + fmt.Println("-> Running container...") + runCmd := fmt.Sprintf(`docker run \ + --name %s \ + --cpus="%f" \ + -v %s:/home/travis/go/%s \ + -e TEST_BINARY="%s" \ + -e TEST_PKG="%s" \ + -e TEST="%s" \ + -e ITERATIONS="%d" \ + -e APP="%s" \ + %s`, + container, cpus, baseDir, app, testBinary, pkg, test, iterations, app, image) + + cmd := exec.Command("sh", "-c", runCmd) + stdout, err := cmd.StdoutPipe() + if err != nil { + log.Fatal(err) + } + if err := cmd.Start(); err != nil { + log.Fatalf("failed to run: %v", err) + } + // Scan from stdout in real time + scanner := bufio.NewScanner(stdout) + for scanner.Scan() { + fmt.Println(scanner.Text()) + } + if err := scanner.Err(); err != nil { + log.Fatalf("failed to scan stdout: %v", err) + } + if err := cmd.Wait(); err != nil { + log.Fatalf("failed to wait for cmd: %v", err) + } + if err != nil { + log.Fatalf("failed to run container: %v", err) + } + + // remove linux/amd64 binary + os.Remove(fmt.Sprintf("bin/%s", app)) + + cleanCmd := fmt.Sprintf("docker rm -f %s", container) + + out, err = exec.Command("sh", "-c", cleanCmd).CombinedOutput() + if err != nil { + log.Println(string(out)) + log.Fatalf("failed to clean up container: %v", err) + } +} + +func printUsage() { + fmt.Fprintf(os.Stderr, helpText) +} + +const helpText = `Usage: flake-repro [options] + + flake-repro 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: + + ./flake-repro.sh -pkg connect/proxy + ./flake-repro.sh -pkg connect/proxy -cpus 0.20 + ./flake-repro.sh -pkg connect/proxy -test Listener + ./flake-repro.sh -pkg connect/proxy -test TestUpstreamListener + ./flake-repro.sh -pkg connect/proxy -test TestUpstreamListener -n 100 +` diff --git a/build-support/flake-repro/test.sh b/build-support/flake-repro/test.sh new file mode 100644 index 000000000000..e6a20d8ae1f2 --- /dev/null +++ b/build-support/flake-repro/test.sh @@ -0,0 +1,31 @@ +#!/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 + +echo "> Running tests... " +echo +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 \ No newline at end of file From 051a9503a58650d751b0b2223ed0c5c4642a67ea Mon Sep 17 00:00:00 2001 From: freddygv Date: Thu, 6 Sep 2018 11:35:07 +0100 Subject: [PATCH 2/4] Check for test-flake args up front in makefile --- GNUmakefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/GNUmakefile b/GNUmakefile index 392a07e119e4..9279273654d3 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -195,6 +195,12 @@ test-ci: other-consul dev-build vet test-install-deps fi test-flake: other-consul vet test-install-deps + @ if [ -z $(ARGS) ] ; then \ + echo ""; \ + echo "error: ARGS required for flake-repro"; \ + echo "ex: make test-flake ARGS=\"-pkg api\""; \ + exit 1; \ + fi @ cd build-support/flake-repro; \ go build -o flake-repro; \ ./flake-repro $(ARGS); \ From 47da914643bcef57658ccdcd0c53faf0238ce841 Mon Sep 17 00:00:00 2001 From: freddygv Date: Fri, 7 Sep 2018 18:41:23 +0100 Subject: [PATCH 3/4] Swap Go program for bash script --- GNUmakefile | 11 +- .../Test-Flake.dockerfile} | 5 +- .../{flake-repro/test.sh => docker/flake.sh} | 0 build-support/flake-repro/README.md | 35 ---- build-support/flake-repro/main.go | 180 ------------------ build-support/scripts/test-flake.sh | 168 ++++++++++++++++ 6 files changed, 170 insertions(+), 229 deletions(-) rename build-support/{flake-repro/Dockerfile => docker/Test-Flake.dockerfile} (57%) rename build-support/{flake-repro/test.sh => docker/flake.sh} (100%) delete mode 100644 build-support/flake-repro/README.md delete mode 100644 build-support/flake-repro/main.go create mode 100755 build-support/scripts/test-flake.sh diff --git a/GNUmakefile b/GNUmakefile index 9279273654d3..547309dfb9d8 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -195,16 +195,7 @@ test-ci: other-consul dev-build vet test-install-deps fi test-flake: other-consul vet test-install-deps - @ if [ -z $(ARGS) ] ; then \ - echo ""; \ - echo "error: ARGS required for flake-repro"; \ - echo "ex: make test-flake ARGS=\"-pkg api\""; \ - exit 1; \ - fi - @ cd build-support/flake-repro; \ - go build -o flake-repro; \ - ./flake-repro $(ARGS); \ - rm flake-repro + @$(SHELL) $(CURDIR)/build-support/scripts/test-flake.sh --pkg "$(FLAKE_PKG)" --test "$(FLAKE_TEST)" --cpus "$(FLAKE_CPUS)" --n "$(FLAKE_N)" other-consul: @echo "--> Checking for other consul instances" diff --git a/build-support/flake-repro/Dockerfile b/build-support/docker/Test-Flake.dockerfile similarity index 57% rename from build-support/flake-repro/Dockerfile rename to build-support/docker/Test-Flake.dockerfile index 704347992723..ea1b48b0440e 100644 --- a/build-support/flake-repro/Dockerfile +++ b/build-support/docker/Test-Flake.dockerfile @@ -2,10 +2,7 @@ FROM travisci/ci-garnet:packer-1512502276-986baf0 ENV GOLANG_VERSION 1.10.3 -RUN mkdir -p /home/travis/go/src/github.com/hashicorp && \ - chown -R travis /home/travis/go - -WORKDIR /home/travis/go/src/github.com/hashicorp +RUN mkdir -p /home/travis/go && chown -R travis /home/travis/go ENV GOPATH /home/travis/go diff --git a/build-support/flake-repro/test.sh b/build-support/docker/flake.sh similarity index 100% rename from build-support/flake-repro/test.sh rename to build-support/docker/flake.sh diff --git a/build-support/flake-repro/README.md b/build-support/flake-repro/README.md deleted file mode 100644 index 702569e57409..000000000000 --- a/build-support/flake-repro/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# repro-constrained-travis -Resource constrained env based on Travis CI for surfacing flakiness in tests. - -## Usage: -Build binary, then run wth `./flake-repro [options]` - -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: -Run all tests for a package: -``` -./flake-repro.sh -pkg connect/proxy -``` - -Run tests matching a pattern: -``` -./flake-repro.sh -pkg connect/proxy -test Listener -``` - -Run a single test: -``` -./flake-repro.sh -pkg connect/proxy -test TestUpstreamListener -``` - -Run a single test 100 times: -``` -./flake-repro.sh -pkg connect/proxy -test TestUpstreamListener -n 100 -``` \ No newline at end of file diff --git a/build-support/flake-repro/main.go b/build-support/flake-repro/main.go deleted file mode 100644 index 102c132be1fc..000000000000 --- a/build-support/flake-repro/main.go +++ /dev/null @@ -1,180 +0,0 @@ -package main - -import ( - "bufio" - "flag" - "fmt" - "log" - "os" - "os/exec" - "strings" -) - -const ( - image = "travis-img-v0.13" - container = "travis-cnt" - goos = "linux" - goarch = "amd64" - testBinary = "flake.test" -) - -func main() { - var pkg string - var test string - var cpus float64 - var iterations int - - flags := flag.NewFlagSet("repro", flag.ExitOnError) - flags.Usage = func() { printUsage() } - - flags.Float64Var(&cpus, "cpus", 0.15, "amount of cpus to use") - flags.IntVar(&iterations, "n", 30, "number of times to run tests") - flags.StringVar(&pkg, "pkg", "", "package to test") - flags.StringVar(&test, "test", "", "test to run") - - if err := flags.Parse(os.Args[1:]); err != nil { - flags.Usage() - os.Exit(1) - } - - if pkg == "" || len(strings.Split(pkg, " ")) > 1 { - log.Fatal("error: one pkg is required") - } - - // a[n-2] because not running from base of consul repo - appCmd := "echo $(pwd | awk '{n=split($0, a, \"/\"); print a[n-2]}')" - bytes, err := exec.Command("sh", "-c", appCmd).Output() - if err != nil { - log.Fatalf("failed to get app name from cwd") - } - app := strings.TrimSpace(string(bytes)) - - fmt.Printf("App:\t\t%s\n", app) - fmt.Printf("Package:\t%s\n", pkg) - fmt.Printf("Test:\t\t%s\n", test) - fmt.Printf("CPUs:\t\t%f\n", cpus) - fmt.Printf("Iterations:\t%d\n", iterations) - - fmt.Println("----> Cleaning up old containers...") - rmContainerCmd := fmt.Sprintf( - `if docker ps -a | grep %s ; then - docker rm -f $(docker ps -a | grep %s | awk '{print $1;}') - fi`, container, container) - - out, err := exec.Command("sh", "-c", rmContainerCmd).CombinedOutput() - if err != nil { - log.Println(string(out)) - log.Fatalf("failed to remove existing container '%s': %v", container, err) - } - - fmt.Println("---> Rebuilding image...") - buildImageCmd := fmt.Sprintf("docker build -q -t %s --no-cache .", image) - - out, err = exec.Command("sh", "-c", buildImageCmd).CombinedOutput() - if err != nil { - log.Println(string(out)) - log.Fatalf("failed to build image '%s': %v", image, err) - } - - fmt.Println("--> Building app binary...") - installCmd := fmt.Sprintf("(cd ../../ && env GOOS=%s GOARCH=%s go build -o bin/%s)", goos, goarch, app) - - out, err = exec.Command("sh", "-c", installCmd).CombinedOutput() - if err != nil { - log.Println(string(out)) - log.Fatalf("failed to build app binary: %v", err) - } - - compileCmd := fmt.Sprintf("(cd ../../ && env GOOS=%s GOARCH=%s go test -c \"./%s\" -o %s)", goos, goarch, pkg, testBinary) - - out, err = exec.Command("sh", "-c", compileCmd).CombinedOutput() - if err != nil { - log.Println(string(out)) - log.Fatalf("failed to compile test binary: %v", err) - } - - wd, err := os.Getwd() - if err != nil { - log.Fatalf("failed to get cwd: %v", err) - } - baseDir := strings.SplitAfter(wd, app)[0] - - fmt.Println("-> Running container...") - runCmd := fmt.Sprintf(`docker run \ - --name %s \ - --cpus="%f" \ - -v %s:/home/travis/go/%s \ - -e TEST_BINARY="%s" \ - -e TEST_PKG="%s" \ - -e TEST="%s" \ - -e ITERATIONS="%d" \ - -e APP="%s" \ - %s`, - container, cpus, baseDir, app, testBinary, pkg, test, iterations, app, image) - - cmd := exec.Command("sh", "-c", runCmd) - stdout, err := cmd.StdoutPipe() - if err != nil { - log.Fatal(err) - } - if err := cmd.Start(); err != nil { - log.Fatalf("failed to run: %v", err) - } - // Scan from stdout in real time - scanner := bufio.NewScanner(stdout) - for scanner.Scan() { - fmt.Println(scanner.Text()) - } - if err := scanner.Err(); err != nil { - log.Fatalf("failed to scan stdout: %v", err) - } - if err := cmd.Wait(); err != nil { - log.Fatalf("failed to wait for cmd: %v", err) - } - if err != nil { - log.Fatalf("failed to run container: %v", err) - } - - // remove linux/amd64 binary - os.Remove(fmt.Sprintf("bin/%s", app)) - - cleanCmd := fmt.Sprintf("docker rm -f %s", container) - - out, err = exec.Command("sh", "-c", cleanCmd).CombinedOutput() - if err != nil { - log.Println(string(out)) - log.Fatalf("failed to clean up container: %v", err) - } -} - -func printUsage() { - fmt.Fprintf(os.Stderr, helpText) -} - -const helpText = `Usage: flake-repro [options] - - flake-repro 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: - - ./flake-repro.sh -pkg connect/proxy - ./flake-repro.sh -pkg connect/proxy -cpus 0.20 - ./flake-repro.sh -pkg connect/proxy -test Listener - ./flake-repro.sh -pkg connect/proxy -test TestUpstreamListener - ./flake-repro.sh -pkg connect/proxy -test TestUpstreamListener -n 100 -` diff --git a/build-support/scripts/test-flake.sh b/build-support/scripts/test-flake.sh new file mode 100755 index 000000000000..8f084a5fea55 --- /dev/null +++ b/build-support/scripts/test-flake.sh @@ -0,0 +1,168 @@ +#!/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 [] + +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]}') + + echo -e "App:\t\t$APP" + echo -e "Package:\t$1" + echo -e "Test:\t\t$2" + echo -e "CPUs:\t\t$3" + echo -e "Iterations:\t$4" + echo + + echo "-----> Cleaning up old containers..." + if docker ps -a | grep $CONTAINER ; then + docker rm $(docker ps -a | grep $CONTAINER | awk '{print $1;}') + fi + + echo '----> Rebuilding image...' + (cd $IMG_DIR && docker build -q -t $IMAGE --no-cache -f Test-Flake.dockerfile .) + + echo "---> Building app binary..." + env GOOS=$GOOS GOARCH=$GOARCH go build -o bin/$APP + + echo "--> Building test binary..." + env GOOS=$GOOS GOARCH=$GOARCH go test -c "./$1" -o $TEST_BINARY + + echo "-> Running container..." + docker run \ + --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 + + docker rm -f $CONTAINER > /dev/null +} + +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 $? \ No newline at end of file From 5e939011dee0a4f2c43914c48aac17f3b25c4db5 Mon Sep 17 00:00:00 2001 From: freddygv Date: Fri, 7 Sep 2018 19:56:23 +0100 Subject: [PATCH 4/4] Swap echo for status_stage, and fix reference to script --- build-support/docker/Test-Flake.dockerfile | 4 ++-- build-support/docker/flake.sh | 2 -- build-support/scripts/test-flake.sh | 25 +++++++++++----------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/build-support/docker/Test-Flake.dockerfile b/build-support/docker/Test-Flake.dockerfile index ea1b48b0440e..11d8896b6b1b 100644 --- a/build-support/docker/Test-Flake.dockerfile +++ b/build-support/docker/Test-Flake.dockerfile @@ -8,6 +8,6 @@ ENV GOPATH /home/travis/go USER travis -COPY test.sh /usr/local/bin/test.sh +COPY flake.sh /usr/local/bin/flake.sh -ENTRYPOINT [ "bash", "test.sh" ] \ No newline at end of file +ENTRYPOINT [ "bash", "flake.sh" ] \ No newline at end of file diff --git a/build-support/docker/flake.sh b/build-support/docker/flake.sh index e6a20d8ae1f2..0a885015d8f5 100644 --- a/build-support/docker/flake.sh +++ b/build-support/docker/flake.sh @@ -13,8 +13,6 @@ fi mv $TEST_BINARY $TEST_PKG/$TEST_BINARY cd $TEST_PKG -echo "> Running tests... " -echo for ((i=0; i < $ITERATIONS; i++)) ; do echo "$(date +"%F %T") - ($((i+1))/$ITERATIONS)" diff --git a/build-support/scripts/test-flake.sh b/build-support/scripts/test-flake.sh index 8f084a5fea55..38e5879eddf9 100755 --- a/build-support/scripts/test-flake.sh +++ b/build-support/scripts/test-flake.sh @@ -57,29 +57,32 @@ function build_repro_env { APP=$(pwd | awk '{n=split($0, a, "/"); print a[n]}') - echo -e "App:\t\t$APP" - echo -e "Package:\t$1" - echo -e "Test:\t\t$2" - echo -e "CPUs:\t\t$3" - echo -e "Iterations:\t$4" + 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 - echo "-----> Cleaning up old containers..." + status_stage "----> Cleaning up old containers..." if docker ps -a | grep $CONTAINER ; then docker rm $(docker ps -a | grep $CONTAINER | awk '{print $1;}') fi - echo '----> Rebuilding image...' + status_stage '----> Rebuilding image...' (cd $IMG_DIR && docker build -q -t $IMAGE --no-cache -f Test-Flake.dockerfile .) - echo "---> Building app binary..." + status_stage "--> Building app binary..." env GOOS=$GOOS GOARCH=$GOARCH go build -o bin/$APP - echo "--> Building test binary..." + status_stage "-> Building test binary..." env GOOS=$GOOS GOARCH=$GOARCH go test -c "./$1" -o $TEST_BINARY - echo "-> Running container..." + status_stage "> Running container..." + status_stage + docker run \ + --rm \ --name $CONTAINER \ --cpus="$3" \ -v $SOURCE_DIR:/home/travis/go/$APP \ @@ -89,8 +92,6 @@ function build_repro_env { -e ITERATIONS="$4" \ -e APP="$APP" \ $IMAGE - - docker rm -f $CONTAINER > /dev/null } function err_usage {