Browse code

Jenkinsfile: reduce time of integration tests by dividing tests into 3 parallel runs

Signed-off-by: Tibor Vass <tibor@docker.com>
(cherry picked from commit e554fb23c82bd672436800dac3ea9739da8e3377)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Tibor Vass authored on 2019/08/08 02:57:52
Showing 4 changed files
... ...
@@ -80,7 +80,7 @@ pipeline {
80 80
                                 '''
81 81
                             }
82 82
                         }
83
-			stage("Static") {
83
+                        stage("Static") {
84 84
                             steps {
85 85
                                 sh '''
86 86
                                 docker run --rm -t --privileged \
... ...
@@ -203,20 +203,61 @@ pipeline {
203 203
                         }
204 204
                         stage("Run tests") {
205 205
                             steps {
206
-                                sh '''
206
+                                sh '''#!/bin/bash
207
+                                # bash is needed so 'jobs -p' works properly
208
+                                # it also accepts setting inline envvars for functions without explicitly exporting
209
+ 
210
+                                run_tests() {
211
+                                        [ -n "$TESTDEBUG" ] && rm= || rm=--rm;
212
+                                        docker run $rm -t --privileged \
213
+                                          -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
214
+                                          -v "$WORKSPACE/.git:/go/src/github.com/docker/docker/.git" \
215
+                                          --name "$CONTAINER_NAME" \
216
+                                          -e KEEPBUNDLE=1 \
217
+                                          -e TESTDEBUG \
218
+                                          -e TESTFLAGS \
219
+                                          -e TEST_INTEGRATION_DEST \
220
+                                          -e TEST_SKIP_INTEGRATION \
221
+                                          -e TEST_SKIP_INTEGRATION_CLI \
222
+                                          -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
223
+                                          -e DOCKER_GRAPHDRIVER \
224
+                                          docker:${GIT_COMMIT} \
225
+                                          hack/make.sh \
226
+                                            "$1" \
227
+                                            test-integration
228
+                                }
229
+
230
+                                trap "exit" INT TERM
231
+                                trap 'pids=$(jobs -p); echo "Remaining pids to kill: [$pids]"; [ -z "$pids" ] || kill $pids' EXIT
232
+
233
+                                CONTAINER_NAME=docker-pr$BUILD_NUMBER
234
+
207 235
                                 docker run --rm -t --privileged \
208 236
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
209 237
                                   -v "$WORKSPACE/.git:/go/src/github.com/docker/docker/.git" \
210
-                                  --name docker-pr$BUILD_NUMBER \
238
+                                  --name ${CONTAINER_NAME}-build \
211 239
                                   -e DOCKER_EXPERIMENTAL \
212 240
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
213 241
                                   -e DOCKER_GRAPHDRIVER \
214 242
                                   docker:${GIT_COMMIT} \
215 243
                                   hack/make.sh \
216
-                                    binary-daemon \
217
-                                    dynbinary-daemon \
218
-                                    test-integration-flaky \
219
-                                    test-integration \
244
+                                    dynbinary-daemon
245
+
246
+                                # flaky + integration
247
+                                TEST_INTEGRATION_DEST=1 CONTAINER_NAME=${CONTAINER_NAME}-1 TEST_SKIP_INTEGRATION_CLI=1 run_tests test-integration-flaky &
248
+
249
+                                # integration-cli first set
250
+                                TEST_INTEGRATION_DEST=2 CONTAINER_NAME=${CONTAINER_NAME}-2 TEST_SKIP_INTEGRATION=1 TESTFLAGS="-check.f ^(DockerSuite|DockerNetworkSuite|DockerHubPullSuite|DockerRegistrySuite|DockerSchema1RegistrySuite|DockerRegistryAuthTokenSuite|DockerRegistryAuthHtpasswdSuite)" run_tests &
251
+
252
+                                # integration-cli second set
253
+                                TEST_INTEGRATION_DEST=3 CONTAINER_NAME=${CONTAINER_NAME}-3 TEST_SKIP_INTEGRATION=1 TESTFLAGS="-check.f ^(DockerSwarmSuite|DockerDaemonSuite|DockerExternalVolumeSuite)" run_tests &
254
+
255
+                                set +x
256
+                                c=0
257
+                                for job in $(jobs -p); do
258
+                                        wait ${job} || c=$?
259
+                                done
260
+                                exit $c
220 261
                                 '''
221 262
                             }
222 263
                         }
... ...
@@ -53,6 +53,7 @@ DOCKER_ENVS := \
53 53
 	-e DOCKER_TEST_HOST \
54 54
 	-e DOCKER_USERLANDPROXY \
55 55
 	-e DOCKERD_ARGS \
56
+	-e TEST_INTEGRATION_DEST \
56 57
 	-e TEST_INTEGRATION_DIR \
57 58
 	-e TEST_SKIP_INTEGRATION \
58 59
 	-e TEST_SKIP_INTEGRATION_CLI \
... ...
@@ -1,15 +1,21 @@
1 1
 #!/usr/bin/env bash
2 2
 set -e -o pipefail
3 3
 
4
+if [ -n "$TEST_INTEGRATION_DEST" ]; then
5
+	export DEST="$ABS_DEST/$TEST_INTEGRATION_DEST"
6
+	export DOCKER_INTEGRATION_DAEMON_DEST="$DEST"
7
+	mkdir -p "$DEST"
8
+fi
9
+
4 10
 source hack/make/.integration-test-helpers
5 11
 
6 12
 if [ ! -z "${TEST_SKIP_INTEGRATION}" ] && [ ! -z "${TEST_SKIP_INTEGRATION_CLI}" ]; then
7
-	echo integration and integraiton-cli skipped according to env vars
13
+	echo integration and integration-cli skipped according to env vars
8 14
 	exit 0
9 15
 fi
10 16
 
11
-
12 17
 (
18
+	env
13 19
 	build_test_suite_binaries
14 20
 	bundle .integration-daemon-start
15 21
 	bundle .integration-daemon-setup
... ...
@@ -95,7 +95,6 @@ func New(t testingT, ops ...func(*Daemon)) *Daemon {
95 95
 	if ht, ok := t.(test.HelperT); ok {
96 96
 		ht.Helper()
97 97
 	}
98
-	t.Log("Creating a new daemon")
99 98
 	dest := os.Getenv("DOCKER_INTEGRATION_DAEMON_DEST")
100 99
 	if dest == "" {
101 100
 		dest = os.Getenv("DEST")
... ...
@@ -106,6 +105,7 @@ func New(t testingT, ops ...func(*Daemon)) *Daemon {
106 106
 	case testNamer:
107 107
 		dest = filepath.Join(dest, v.TestName())
108 108
 	}
109
+	t.Logf("Creating a new daemon at: %s", dest)
109 110
 	assert.Check(t, dest != "", "Please set the DOCKER_INTEGRATION_DAEMON_DEST or the DEST environment variable")
110 111
 
111 112
 	storageDriver := os.Getenv("DOCKER_GRAPHDRIVER")