From 1ad7b4fce5cc833a427c1d87e34d834007048f60 Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Tue, 3 Nov 2015 14:46:07 +0000 Subject: [PATCH 1/3] Speed up tests on circle. - Ensure we use up to date build container when running tests. - Parallelise host setup for integration tests. - Pass some more circle env vars through to ./tools/tests so the scheduler works. - Gather coverage from multiple shards. - Create files as the right owner inside the container. - Parallelise the circle.yaml - Parallelise the intergration tests using existing machinery - Build experimental in parallel. - Use custom scheduler prefix for integration tests, so schedules don't clash with weave. --- Makefile | 5 ++-- backend/Dockerfile | 3 ++- backend/build.sh | 16 +++++++++--- circle.yml | 44 ++++++++++++++++++++++----------- experimental/Makefile | 2 +- experimental/build_on_circle.sh | 5 ++++ experimental/in_parallel.sh | 31 +++++++++++++++++++++++ integration/run_all.sh | 3 ++- integration/setup.sh | 44 ++++++++++++++++++--------------- 9 files changed, 111 insertions(+), 42 deletions(-) create mode 100755 experimental/build_on_circle.sh create mode 100755 experimental/in_parallel.sh diff --git a/Makefile b/Makefile index a08fb5ec1..fff6d3386 100644 --- a/Makefile +++ b/Makefile @@ -104,9 +104,10 @@ clean: $(APP_EXE) $(PROBE_EXE) $(RUNSVINIT) client/build/app.js docker/weave ifeq ($(BUILD_IN_CONTAINER),true) -tests: +tests: $(SCOPE_BACKEND_BUILD_UPTODATE) $(SUDO) docker run $(RM) -v $(shell pwd):/go/src/github.com/weaveworks/scope \ - -e GOARCH -e GOOS -e CIRCLECI $(SCOPE_BACKEND_BUILD_IMAGE) tests + -e GOARCH -e GOOS -e CIRCLECI -e CIRCLE_BUILD_NUM -e CIRCLE_NODE_TOTAL -e CIRCLE_NODE_INDEX -e COVERDIR\ + $(SCOPE_BACKEND_BUILD_IMAGE) tests else tests: ./tools/test -no-go-get diff --git a/backend/Dockerfile b/backend/Dockerfile index 0bdea51e7..4c02665e3 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,5 +1,6 @@ FROM golang:1.5.1 ENV GO15VENDOREXPERIMENT 1 -RUN apt-get update && apt-get install -y libpcap-dev +RUN apt-get update && apt-get install -y libpcap-dev python-pip +RUN pip install requests COPY build.sh / ENTRYPOINT ["/build.sh"] diff --git a/backend/build.sh b/backend/build.sh index e1402a18a..e45a694c8 100755 --- a/backend/build.sh +++ b/backend/build.sh @@ -1,10 +1,20 @@ #!/bin/sh -set -eux +set -eu + +SCOPE_SRC=$GOPATH/src/github.com/weaveworks/scope # Mount the scope repo: # -v $(pwd):/go/src/github.com/weaveworks/scope -cd $GOPATH/src/github.com/weaveworks/scope -make BUILD_IN_CONTAINER=false $@ +# If we run make directly, any files created on the bind mount +# will have awkward ownership. So we switch to a user with the +# same user and group IDs as source directory. We have to set a +# few things up so that sudo works without complaining later on. +uid=$(stat --format="%u" $SCOPE_SRC) +gid=$(stat --format="%g" $SCOPE_SRC) +echo "weave:x:$uid:$gid::$SCOPE_SRC:/bin/sh" >>/etc/passwd +echo "weave:*:::::::" >>/etc/shadow +echo "weave ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers +su weave -c "PATH=$PATH make -C $SCOPE_SRC BUILD_IN_CONTAINER=false $*" diff --git a/circle.yml b/circle.yml index 6d546305a..10b74c6db 100644 --- a/circle.yml +++ b/circle.yml @@ -37,23 +37,39 @@ dependencies: test: override: - - cd $SRCDIR; ./tools/lint . - - cd $SRCDIR; make RM= tests - - cd $SRCDIR; make RM= client-test - - cd $SRCDIR; make RM= static - - cd $SRCDIR; rm -f app/scope-app probe/scope-probe; GOARCH=arm make RM= app/scope-app probe/scope-probe - - cd $SRCDIR; rm -f app/scope-app probe/scope-probe; GOOS=darwin make RM= app/scope-app probe/scope-probe - - cd $SRCDIR; rm -f app/scope-app probe/scope-probe; make RM= - - cd $SRCDIR/experimental; make RM= - - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; ./gce.sh setup) - - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; eval $(./gce.sh hosts); ./setup.sh) + - cd $SRCDIR; ./tools/lint .: + parallel: true + - cd $SRCDIR; COVERDIR=./coverage make RM= tests: + parallel: true + - cd $SRCDIR; make RM= client-test: + parallel: true + - cd $SRCDIR; make RM= static: + parallel: true + - cd $SRCDIR; rm -f app/scope-app probe/scope-probe; if [ "$CIRCLE_NODE_INDEX" = "0" ]; then GOARCH=arm make RM= app/scope-app probe/scope-probe; else GOOS=darwin make RM= app/scope-app probe/scope-probe; fi: + parallel: true + - cd $SRCDIR; rm -f app/scope-app probe/scope-probe; make RM=: + parallel: true + - cd $SRCDIR/experimental; ./build_on_circle.sh: + parallel: true + - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; ./gce.sh setup): + parallel: true + - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; eval $(./gce.sh hosts); ./setup.sh): + parallel: true - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; eval $(./gce.sh hosts); ./run_all.sh): timeout: 300 + parallel: true post: - - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; ./gce.sh destroy) - - goveralls -repotoken $COVERALLS_REPO_TOKEN -coverprofile=$SRCDIR/profile.cov -service=circleci || true - - cd $SRCDIR; cp coverage.html $CIRCLE_ARTIFACTS - - cd $SRCDIR; cp scope.tar $CIRCLE_ARTIFACTS + - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; ./gce.sh destroy): + parallel: true + +teardown: + pre: + - test "$CIRCLE_NODE_INDEX" != "0" || (cd $SRCDIR; ./tools/cover/gather_coverage.sh ./coverage $SRCDIR/coverage): + parallel: true + - test "$CIRCLE_NODE_INDEX" != "0" || (goveralls -repotoken $COVERALLS_REPO_TOKEN -coverprofile=$SRCDIR/profile.cov -service=circleci || true): + parallel: true + - test "$CIRCLE_NODE_INDEX" != "0" || (cd $SRCDIR; cp coverage.* scope.tar $CIRCLE_ARTIFACTS): + parallel: true deployment: hub: diff --git a/experimental/Makefile b/experimental/Makefile index f1ff6977a..4e6993352 100644 --- a/experimental/Makefile +++ b/experimental/Makefile @@ -1,7 +1,7 @@ .PHONY: all test clean DIRS=$(shell find . -maxdepth 2 -name *.go -printf "%h\n" | sort -u) -TARGETS=$(join $(patsubst %,%/,$(DIRS)),$(DIRS)) +TARGETS=$(join $(patsubst %,%/,$(DIRS)),$(patsubst ./%,%,$(DIRS))) BUILD_IN_CONTAINER=true RM=--rm diff --git a/experimental/build_on_circle.sh b/experimental/build_on_circle.sh new file mode 100755 index 000000000..d372e51ee --- /dev/null +++ b/experimental/build_on_circle.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +set -e + +./in_parallel.sh "make RM=" $(find . -maxdepth 2 -name *.go -printf "%h\n" | sort -u | sed -n 's/\.\/\(.*\)/\1\/\1/p') diff --git a/experimental/in_parallel.sh b/experimental/in_parallel.sh new file mode 100755 index 000000000..eaccc2f32 --- /dev/null +++ b/experimental/in_parallel.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +set -e + +if [ $# -lt 2 ]; then + echo "Usage: $0 [args...]" + echo " Will run cmd arg1, cmd arg2 etc on different circle shared," + echo " based on what the scheduler says." + exit 2 +fi + +if [ -z "$CIRCLECI" ]; then + echo "I'm afraid this only works when run on CircleCI" + exit 1 +fi + +COMMAND=$1 +shift 1 + +INPUTS="$*" +INPUTS=$(echo $INPUTS | "../tools/sched" sched parallel-$CIRCLE_BUILD_NUM $CIRCLE_NODE_TOTAL $CIRCLE_NODE_INDEX) + +echo Doing $INPUTS + +for INPUT in $INPUTS; do + START=$(date +%s) + $COMMAND $INPUT + RUNTIME=$(( $(date +%s) - $START )) + + "../tools/sched" time $INPUT $RUNTIME +done diff --git a/integration/run_all.sh b/integration/run_all.sh index 91fc91b11..b6cbd3cf0 100755 --- a/integration/run_all.sh +++ b/integration/run_all.sh @@ -4,4 +4,5 @@ set -e . ./config.sh -NO_SCHEDULER=1 "$WEAVE_ROOT/test/run_all.sh" "$@" +SCHEDULER_PREFIX=scope-integration +. $WEAVE_ROOT/test/run_all.sh "$@" diff --git a/integration/setup.sh b/integration/setup.sh index c0a52a536..fd7166702 100755 --- a/integration/setup.sh +++ b/integration/setup.sh @@ -1,32 +1,36 @@ #!/bin/bash -set -e +set -e # NB don't set -u, as weave's config.sh doesn't like that. . ./config.sh echo Copying scope images and scripts to hosts for HOST in $HOSTS; do - SIZE=$(stat --printf="%s" ../scope.tar) - cat ../scope.tar | pv -N "scope.tar" -s $SIZE | $SSH -C $HOST sudo docker load - upload_executable $HOST ../scope - upload_executable $HOST ../scope /usr/local/scope/bin/scope + SIZE=$(stat --printf="%s" ../scope.tar) + cat ../scope.tar | pv -N "scope.tar" -s $SIZE | $SSH -C $HOST sudo docker load + upload_executable $HOST ../scope + upload_executable $HOST ../scope /usr/local/scope/bin/scope done -echo Installing weave -# Download the latest released weave script locally, -# for use by weave_on -curl -sL git.io/weave -o ./weave -chmod a+x ./weave +setup_host() { + local HOST=$1 + echo Installing weave on $HOST + # Download the latest released weave script locally, + # for use by weave_on + curl -sL git.io/weave -o ./weave + chmod a+x ./weave + run_on $HOST "sudo curl -sL git.io/weave -o /usr/local/bin/weave" + run_on $HOST "sudo chmod a+x /usr/local/bin/weave" + weave_on $HOST setup + + echo Prefetching Images on $HOST + docker_on $HOST pull peterbourgon/tns-db + docker_on $HOST pull alpine + docker_on $HOST pull nginx +} + for HOST in $HOSTS; do - run_on $HOST "sudo curl -sL git.io/weave -o /usr/local/bin/weave" - run_on $HOST "sudo chmod a+x /usr/local/bin/weave" - weave_on $HOST setup -done - -echo Prefetching Images -for HOST in $HOSTS; do - docker_on $HOST pull peterbourgon/tns-db - docker_on $HOST pull alpine - docker_on $HOST pull nginx + setup_host $HOST & done +wait From 3f0b0e13653383eb630e6482a9b3d8c29891c9bf Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Wed, 4 Nov 2015 15:36:21 +0000 Subject: [PATCH 2/3] Squashed 'tools/' changes from d6ea3ad..28c6aa0 28c6aa0 Make prefix on runner schedule optional. 452f2b7 Merge pull request #8 from weaveworks/7-gzip 4be5541 Add gather_coverage.sh script. e22c576 Compress cached images. f250a3b Add sched CLI and update readme. 6b3c735 Add scheduler from weave git-subtree-dir: tools git-subtree-split: 28c6aa063c1b171c3ba42d958ad640d49f8c39f2 --- README.md | 2 + cover/gather_coverage.sh | 21 +++++++ rebuild-image | 6 +- runner/runner.go | 7 ++- sched | 38 ++++++++++++ scheduler/.gitignore | 1 + scheduler/README.md | 6 ++ scheduler/app.yaml | 13 ++++ scheduler/appengine_config.py | 3 + scheduler/cron.yaml | 4 ++ scheduler/main.py | 112 ++++++++++++++++++++++++++++++++++ scheduler/requirements.txt | 2 + 12 files changed, 211 insertions(+), 4 deletions(-) create mode 100755 cover/gather_coverage.sh create mode 100755 sched create mode 100644 scheduler/.gitignore create mode 100644 scheduler/README.md create mode 100644 scheduler/app.yaml create mode 100644 scheduler/appengine_config.py create mode 100644 scheduler/cron.yaml create mode 100644 scheduler/main.py create mode 100644 scheduler/requirements.txt diff --git a/README.md b/README.md index 85fdfeb39..32ddb57b1 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,8 @@ Included in this repo are tools shared by weave.git and scope.git. They include suffixed with the number of hosts it requires, and the hosts available are contained in the environment variable HOSTS, the tool will run tests in parallel, on different hosts. +- ```scheduler```: an appengine application that can be used to distribute + tests across different shards in CircleCI. ## Using build-tools.git diff --git a/cover/gather_coverage.sh b/cover/gather_coverage.sh new file mode 100755 index 000000000..9026745a1 --- /dev/null +++ b/cover/gather_coverage.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# This scripts copies all the coverage reports from various circle shards, +# merges them and produces a complete report. + +set -ex +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DESTINATION=$1 +FROMDIR=$2 +mkdir -p $DESTINATION + +if [ -n "$CIRCLECI" ]; then + for i in $(seq 1 $(($CIRCLE_NODE_TOTAL - 1))); do + scp node$i:$FROMDIR/* $DESTINATION || true + done +fi + +go get github.com/weaveworks/build-tools/cover +cover $DESTINATION/* >profile.cov +go tool cover -html=profile.cov -o coverage.html +go tool cover -func=profile.cov -o coverage.txt +tar czf coverage.tar.gz $DESTINATION diff --git a/rebuild-image b/rebuild-image index 0eb3cff3c..df3a371c4 100755 --- a/rebuild-image +++ b/rebuild-image @@ -17,12 +17,12 @@ rebuild() { mkdir -p $CACHEDIR rm $CACHEDIR/$SAVEDNAME* || true docker build -t $IMAGENAME $IMAGEDIR - docker save $IMAGENAME:latest > $CACHEDIR/$SAVEDNAME-$CIRCLE_SHA1 + docker save $IMAGENAME:latest | gzip - > $CACHEDIR/$SAVEDNAME-$CIRCLE_SHA1.gz } # Get the revision the cached image was build at cached_image_rev() { - find $CACHEDIR -name "$SAVEDNAME-*" -type f | sed 's/[^\-]*\-//' + find $CACHEDIR -name "$SAVEDNAME-*" -type f | sed -n 's/^[^\-]*\-\([a-z0-9]*\).gz$/\1/p' } # Have there been any revision beween $1 and $2 @@ -60,4 +60,4 @@ fi # we didn't rebuild; import cached version echo ">>> No changes found, importing cached image" -docker load -i $CACHEDIR/$SAVEDNAME-$cached_revision +zcat $CACHEDIR/$SAVEDNAME-$cached_revision.gz | docker load diff --git a/runner/runner.go b/runner/runner.go index bfac9c58b..f09ffcd6d 100644 --- a/runner/runner.go +++ b/runner/runner.go @@ -138,11 +138,16 @@ func updateScheduler(test string, duration float64) { func getSchedule(tests []string) ([]string, error) { var ( - testRun = "integration-" + os.Getenv("CIRCLE_BUILD_NUM") + prefix = os.Getenv("SCHEDULER_PREFIX") + buildNum = os.Getenv("CIRCLE_BUILD_NUM") shardCount = os.Getenv("CIRCLE_NODE_TOTAL") shardID = os.Getenv("CIRCLE_NODE_INDEX") requestBody = &bytes.Buffer{} + testRun = "integration-" + buildNum ) + if prefix != "" { + testRun = prefix + "-" + buildNum + } if err := json.NewEncoder(requestBody).Encode(schedule{tests}); err != nil { return []string{}, err } diff --git a/sched b/sched new file mode 100755 index 000000000..e94e8af8f --- /dev/null +++ b/sched @@ -0,0 +1,38 @@ +#!/usr/bin/python +import sys, string, json, urllib +import requests + +BASE_URL="http://positive-cocoa-90213.appspot.com" + +def test_time(test_name, runtime): + r = requests.post(BASE_URL + "/record/%s/%f" % (urllib.quote(test_name, safe=""), runtime)) + print r.text + assert r.status_code == 204 + +def test_sched(test_run, shard_count, shard_id): + tests = json.dumps({'tests': string.split(sys.stdin.read())}) + r = requests.post(BASE_URL + "/schedule/%s/%d/%d" % (test_run, shard_count, shard_id), data=tests) + assert r.status_code == 200 + result = r.json() + for test in sorted(result['tests']): + print test + +def usage(): + print "%s " % sys.argv[0] + print " time " + print " sched " + +def main(): + if len(sys.argv) < 4: + usage() + sys.exit(1) + + if sys.argv[1] == "time": + test_time(sys.argv[2], float(sys.argv[3])) + elif sys.argv[1] == "sched": + test_sched(sys.argv[2], int(sys.argv[3]), int(sys.argv[4])) + else: + usage() + +if __name__ == '__main__': + main() diff --git a/scheduler/.gitignore b/scheduler/.gitignore new file mode 100644 index 000000000..a65b41774 --- /dev/null +++ b/scheduler/.gitignore @@ -0,0 +1 @@ +lib diff --git a/scheduler/README.md b/scheduler/README.md new file mode 100644 index 000000000..8489d7870 --- /dev/null +++ b/scheduler/README.md @@ -0,0 +1,6 @@ +To upload newer version: + +``` +pip install -r requirements.txt -t lib +appcfg.py update . +``` diff --git a/scheduler/app.yaml b/scheduler/app.yaml new file mode 100644 index 000000000..8bc59f004 --- /dev/null +++ b/scheduler/app.yaml @@ -0,0 +1,13 @@ +application: positive-cocoa-90213 +version: 1 +runtime: python27 +api_version: 1 +threadsafe: true + +handlers: +- url: .* + script: main.app + +libraries: +- name: webapp2 + version: latest diff --git a/scheduler/appengine_config.py b/scheduler/appengine_config.py new file mode 100644 index 000000000..f4489ff96 --- /dev/null +++ b/scheduler/appengine_config.py @@ -0,0 +1,3 @@ +from google.appengine.ext import vendor + +vendor.add('lib') diff --git a/scheduler/cron.yaml b/scheduler/cron.yaml new file mode 100644 index 000000000..652aed802 --- /dev/null +++ b/scheduler/cron.yaml @@ -0,0 +1,4 @@ +cron: +- description: periodic gc + url: /tasks/gc + schedule: every 5 minutes diff --git a/scheduler/main.py b/scheduler/main.py new file mode 100644 index 000000000..ed0c78e31 --- /dev/null +++ b/scheduler/main.py @@ -0,0 +1,112 @@ +import collections +import json +import logging +import operator +import re + +import flask +from oauth2client.client import GoogleCredentials +from googleapiclient import discovery + +from google.appengine.api import urlfetch +from google.appengine.ext import ndb + +app = flask.Flask('scheduler') +app.debug = True + +# We use exponential moving average to record +# test run times. Higher alpha discounts historic +# observations faster. +alpha = 0.3 + +PROJECT = 'positive-cocoa-90213' +ZONE = 'us-central1-a' + +class Test(ndb.Model): + total_run_time = ndb.FloatProperty(default=0.) # Not total, but a EWMA + total_runs = ndb.IntegerProperty(default=0) + +class Schedule(ndb.Model): + shards = ndb.JsonProperty() + +@app.route('/record//', methods=['POST']) +@ndb.transactional +def record(test_name, runtime): + test = Test.get_by_id(test_name) + if test is None: + test = Test(id=test_name) + test.total_run_time = (test.total_run_time * (1-alpha)) + (float(runtime) * alpha) + test.total_runs += 1 + test.put() + return ('', 204) + +@app.route('/schedule///', methods=['POST']) +def schedule(test_run, shard_count, shard): + # read tests from body + test_names = flask.request.get_json(force=True)['tests'] + + # first see if we have a scedule already + schedule_id = "%s-%d" % (test_run, shard_count) + schedule = Schedule.get_by_id(schedule_id) + if schedule is not None: + return flask.json.jsonify(tests=schedule.shards[str(shard)]) + + # if not, do simple greedy algorithm + test_times = ndb.get_multi(ndb.Key(Test, test_name) for test_name in test_names) + def avg(test): + if test is not None: + return test.total_run_time + return 1 + test_times = [(test_name, avg(test)) for test_name, test in zip(test_names, test_times)] + test_times_dict = dict(test_times) + test_times.sort(key=operator.itemgetter(1)) + + shards = {i: [] for i in xrange(shard_count)} + while test_times: + test_name, time = test_times.pop() + + # find shortest shard and put it in that + s, _ = min(((i, sum(test_times_dict[t] for t in shards[i])) + for i in xrange(shard_count)), key=operator.itemgetter(1)) + + shards[s].append(test_name) + + # atomically insert or retrieve existing schedule + schedule = Schedule.get_or_insert(schedule_id, shards=shards) + return flask.json.jsonify(tests=schedule.shards[str(shard)]) + +NAME_RE = re.compile(r'^host(?P\d+)-(?P\d+)-(?P\d+)$') + +@app.route('/tasks/gc') +def gc(): + # Get list of running VMs, pick build id out of VM name + credentials = GoogleCredentials.get_application_default() + compute = discovery.build('compute', 'v1', credentials=credentials) + instances = compute.instances().list(project=PROJECT, zone=ZONE).execute() + host_by_build = collections.defaultdict(list) + for instance in instances['items']: + matches = NAME_RE.match(instance['name']) + if matches is None: + continue + host_by_build[int(matches.group('build'))].append(instance['name']) + logging.info("Running VMs by build: %r", host_by_build) + + # Get list of builds, filter down to runnning builds + result = urlfetch.fetch('https://circleci.com/api/v1/project/weaveworks/weave', + headers={'Accept': 'application/json'}) + assert result.status_code == 200 + builds = json.loads(result.content) + running = {build['build_num'] for build in builds if build['status'] == 'running'} + logging.info("Runnings builds: %r", running) + + # Stop VMs for builds that aren't running + stopped = [] + for build, names in host_by_build.iteritems(): + if build in running: + continue + for name in names: + stopped.append(name) + logging.info("Stopping VM %s", name) + compute.instances().delete(project=PROJECT, zone=ZONE, instance=name).execute() + + return (flask.json.jsonify(running=list(running), stopped=stopped), 200) diff --git a/scheduler/requirements.txt b/scheduler/requirements.txt new file mode 100644 index 000000000..d4d47e6eb --- /dev/null +++ b/scheduler/requirements.txt @@ -0,0 +1,2 @@ +flask +google-api-python-client From 9a9ef72ad6d43f659e1c50f3b0845858497e5363 Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Thu, 5 Nov 2015 15:44:55 +0000 Subject: [PATCH 3/3] Don't run integration test in parallel for now --- circle.yml | 1 - integration/run_all.sh | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/circle.yml b/circle.yml index 10b74c6db..ddd032480 100644 --- a/circle.yml +++ b/circle.yml @@ -57,7 +57,6 @@ test: parallel: true - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; eval $(./gce.sh hosts); ./run_all.sh): timeout: 300 - parallel: true post: - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; ./gce.sh destroy): parallel: true diff --git a/integration/run_all.sh b/integration/run_all.sh index b6cbd3cf0..a9e76793a 100755 --- a/integration/run_all.sh +++ b/integration/run_all.sh @@ -4,5 +4,4 @@ set -e . ./config.sh -SCHEDULER_PREFIX=scope-integration -. $WEAVE_ROOT/test/run_all.sh "$@" +NO_SCHEDULER=1 $WEAVE_ROOT/test/run_all.sh "$@"