Browse code

testing infrastructure, issue #1800: Refactor docker testing using Docker in Docker

Daniel Mizyrycki authored on 2013/10/19 14:33:16
Showing 5 changed files
... ...
@@ -17,15 +17,12 @@ PORT_GITHUB = 8011      # Buildbot github hook port
17 17
 PORT_MASTER = 9989      # Port where buildbot master listen buildworkers
18 18
 TEST_USER = 'buildbot'  # Credential to authenticate build triggers
19 19
 TEST_PWD = 'docker'     # Credential to authenticate build triggers
20
-BUILDER_NAME = 'docker'
21 20
 GITHUB_DOCKER = 'github.com/dotcloud/docker'
22 21
 BUILDBOT_PATH = '/data/buildbot'
23 22
 DOCKER_PATH = '/go/src/github.com/dotcloud/docker'
24 23
 DOCKER_CI_PATH = '/docker-ci'
25
-BUILDER_PATH = '/data/buildbot/slave/{0}/build'.format(BUILDER_NAME)
26
-PULL_REQUEST_PATH = '/data/buildbot/slave/pullrequest/build'
27 24
 
28
-# Credentials set by setup.sh and Vagrantfile
25
+# Credentials set by setup.sh from deployment.py
29 26
 BUILDBOT_PWD = ''
30 27
 IRC_PWD = ''
31 28
 IRC_CHANNEL = ''
... ...
@@ -45,34 +42,35 @@ c['slavePortnum'] = PORT_MASTER
45 45
 
46 46
 
47 47
 # Schedulers
48
-c['schedulers'] = [ForceScheduler(name='trigger', builderNames=[BUILDER_NAME,
48
+c['schedulers'] = [ForceScheduler(name='trigger', builderNames=['docker',
49 49
     'index','registry','coverage','nightlyrelease'])]
50
-c['schedulers'] += [SingleBranchScheduler(name="all",
51
-    change_filter=filter.ChangeFilter(branch='master'), treeStableTimer=None,
52
-    builderNames=[BUILDER_NAME])]
50
+c['schedulers'] += [SingleBranchScheduler(name="all", treeStableTimer=None,
51
+    change_filter=filter.ChangeFilter(branch='master',
52
+    repository='https://github.com/dotcloud/docker'), builderNames=['docker'])]
53 53
 c['schedulers'] += [SingleBranchScheduler(name='pullrequest',
54 54
     change_filter=filter.ChangeFilter(category='github_pullrequest'), treeStableTimer=None,
55 55
     builderNames=['pullrequest'])]
56
-c['schedulers'] += [Nightly(name='daily', branch=None, builderNames=['nightlyrelease'],
57
-    hour=7, minute=00)]
56
+c['schedulers'] += [Nightly(name='daily', branch=None, builderNames=['nightlyrelease',
57
+    'coverage'], hour=7, minute=00)]
58 58
 c['schedulers'] += [Nightly(name='every4hrs', branch=None, builderNames=['registry','index'],
59 59
     hour=range(0,24,4), minute=15)]
60 60
 
61 61
 # Builders
62 62
 # Docker commit test
63
+test_cmd = ('docker run -privileged mzdaniel/test_docker hack/dind'
64
+    ' test_docker.sh %(src::revision)s')
63 65
 factory = BuildFactory()
64 66
 factory.addStep(ShellCommand(description='Docker', logEnviron=False,
65
-    usePTY=True, command=['sh', '-c', Interpolate(
66
-    '{0}/docker-test/test_docker.sh %(src::revision)s'.format(DOCKER_CI_PATH))]))
67
+    usePTY=True, command=["sh", "-c", Interpolate(test_cmd)]))
67 68
 c['builders'] = [BuilderConfig(name='docker',slavenames=['buildworker'],
68 69
     factory=factory)]
69 70
 
70 71
 # Docker pull request test
72
+test_cmd = ('docker run -privileged mzdaniel/test_docker hack/dind'
73
+    ' test_docker.sh %(src::revision)s %(src::repository)s %(src::branch)s')
71 74
 factory = BuildFactory()
72 75
 factory.addStep(ShellCommand(description='pull_request', logEnviron=False,
73
-    usePTY=True, command=['sh', '-c', Interpolate(
74
-    '{0}/docker-test/test_docker.sh %(src::revision)s %(src::repository)s'
75
-    ' %(src::branch)s'.format(DOCKER_CI_PATH))]))
76
+    usePTY=True, command=["sh", "-c", Interpolate(test_cmd)]))
76 77
 c['builders'] += [BuilderConfig(name='pullrequest',slavenames=['buildworker'],
77 78
     factory=factory)]
78 79
 
... ...
@@ -97,17 +95,16 @@ c['builders'] += [BuilderConfig(name='registry',slavenames=['buildworker'],
97 97
 factory = BuildFactory()
98 98
 factory.addStep(ShellCommand(description='index', logEnviron=False,
99 99
     command='. {0}/master/credentials.cfg; '
100
-    '{1}/testing/functionaltests/test_index.py'.format(BUILDBOT_PATH,
101
-    DOCKER_PATH), usePTY=True))
100
+    '/docker-ci/functionaltests/test_index.py'.format(BUILDBOT_PATH),
101
+    usePTY=True))
102 102
 c['builders'] += [BuilderConfig(name='index',slavenames=['buildworker'],
103 103
     factory=factory)]
104 104
 
105 105
 # Docker nightly release
106
-nightlyrelease_cmd = ('docker run -i -t -privileged -lxc-conf=lxc.aa_profile=unconfined'
107
-    ' -e AWS_S3_BUCKET=test.docker.io dockerbuilder')
108 106
 factory = BuildFactory()
109
-factory.addStep(ShellCommand(description='NightlyRelease',logEnviron=False,usePTY=True,
110
-    command=nightlyrelease_cmd))
107
+factory.addStep(ShellCommand(description='NightlyRelease', logEnviron=False,
108
+    usePTY=True, command='docker run -privileged'
109
+    ' -e AWS_S3_BUCKET=test.docker.io dockerbuilder'))
111 110
 c['builders'] += [BuilderConfig(name='nightlyrelease',slavenames=['buildworker'],
112 111
     factory=factory)]
113 112
 
... ...
@@ -140,11 +140,17 @@ sudo('stop docker')
140 140
 sudo('wget -q -O /usr/bin/docker http://test.docker.io/test/docker')
141 141
 sudo('start docker')
142 142
 
143
+# Preventively reboot docker-ci daily
144
+sudo('ln -s /sbin/reboot /etc/cron.daily')
145
+
143 146
 # Build docker-ci containers
144 147
 sudo('cd {}; docker build -t docker .'.format(DOCKER_PATH))
145 148
 sudo('cd {}/nightlyrelease; docker build -t dockerbuilder .'.format(
146 149
     DOCKER_CI_PATH))
147 150
 
151
+# Download docker-ci testing container
152
+sudo('docker pull mzdaniel/test_docker')
153
+
148 154
 # Setup buildbot
149 155
 sudo('mkdir /data')
150 156
 sudo('{0}/setup.sh root {0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10}'
151 157
new file mode 100644
... ...
@@ -0,0 +1,30 @@
0
+# VERSION:        0.3
1
+# DOCKER-VERSION  0.6.3
2
+# AUTHOR:         Daniel Mizyrycki <daniel@dotcloud.com>
3
+# DESCRIPTION:    Testing docker PRs and commits on top of master using
4
+# REFERENCES:     This code reuses the excellent implementation of
5
+#                 Docker in Docker made by Jerome Petazzoni.
6
+#                 https://github.com/jpetazzo/dind
7
+# COMMENTS:
8
+#   This Dockerfile adapts /Dockerfile to enable docker PRs and commits testing
9
+#   Optional arguments:
10
+#       [commit]  (default: 'HEAD')
11
+#       [repo]    (default: 'http://github.com/dotcloud/docker')
12
+#       [branch]  (default: 'master')
13
+# TO_BUILD:       docker build -t test_docker .
14
+# TO_RUN:         docker run -privileged test_docker hack/dind test_docker.sh [commit] [repo] [branch]
15
+
16
+from docker
17
+maintainer Daniel Mizyrycki <daniel@dotcloud.com>
18
+
19
+# Setup go environment. Extracted from /Dockerfile
20
+env     CGO_ENABLED 0
21
+env     GOROOT  /goroot
22
+env     PATH    $PATH:/goroot/bin
23
+env     GOPATH  /go:/go/src/github.com/dotcloud/docker/vendor
24
+volume  /var/lib/docker
25
+workdir /go/src/github.com/dotcloud/docker
26
+
27
+# Add test_docker.sh
28
+add test_docker.sh /usr/bin/test_docker.sh
29
+run chmod +x /usr/bin/test_docker.sh
... ...
@@ -5,17 +5,11 @@ COMMIT=${1-HEAD}
5 5
 REPO=${2-http://github.com/dotcloud/docker}
6 6
 BRANCH=${3-master}
7 7
 
8
-# Generate a random string of $1 characters
9
-function random {
10
-    cat /dev/urandom | tr -cd 'a-f0-9' | head -c $1
11
-}
12
-
13 8
 # Compute test paths
14
-BASE_PATH=`pwd`/test_docker_$(random 12)
15
-DOCKER_PATH=$BASE_PATH/go/src/github.com/dotcloud/docker
16
-export GOPATH=$BASE_PATH/go:$DOCKER_PATH/vendor
9
+DOCKER_PATH=/go/src/github.com/dotcloud/docker
17 10
 
18 11
 # Fetch latest master
12
+rm -rf /go
19 13
 mkdir -p $DOCKER_PATH
20 14
 cd $DOCKER_PATH
21 15
 git init .
... ...
@@ -23,12 +17,21 @@ git fetch -q http://github.com/dotcloud/docker master
23 23
 git reset --hard FETCH_HEAD
24 24
 
25 25
 # Merge commit
26
+#echo FIXME. Temporarily skip TestPrivilegedCanMount until DinD works reliable on AWS
27
+git pull -q https://github.com/mzdaniel/docker.git dind-aws || exit 1
28
+
29
+# Merge commit in top of master
26 30
 git fetch -q "$REPO" "$BRANCH"
27 31
 git merge --no-edit $COMMIT || exit 1
28 32
 
29 33
 # Test commit
30 34
 go test -v; exit_status=$?
31 35
 
36
+# Display load if test fails
37
+if [ $exit_status -eq 1 ] ; then
38
+    uptime; echo; free
39
+fi
40
+
32 41
 # Cleanup testing directory
33 42
 rm -rf $BASE_PATH
34 43
 
... ...
@@ -13,9 +13,8 @@ cd /
13 13
 git clone -q http://github.com/dotcloud/docker /go/src/github.com/dotcloud/docker
14 14
 cd /go/src/github.com/dotcloud/docker
15 15
 
16
-echo FIXME. Temporarily add Jerome changeset with proper apparmor handling
17
-git fetch  http://github.com/jpetazzo/docker escape-apparmor-confinement:escape-apparmor-confinement
18
-git rebase --onto master master escape-apparmor-confinement
16
+echo FIXME. Temporarily skip TestPrivilegedCanMount until DinD works reliable on AWS
17
+git pull -q https://github.com/mzdaniel/docker.git dind-aws || exit 1
19 18
 
20 19
 # Launch docker daemon using dind inside the container
21 20
 ./hack/dind /usr/bin/docker -d &
... ...
@@ -28,7 +27,17 @@ date > timestamp
28 28
 docker build -t docker .
29 29
 
30 30
 # Run Docker unittests binary and Ubuntu package
31
-docker run -privileged -lxc-conf=lxc.aa_profile=unconfined docker hack/make.sh || exit 1
31
+docker run -privileged -lxc-conf=lxc.aa_profile=unconfined docker hack/make.sh
32
+exit_status=$?
33
+
34
+# Display load if test fails
35
+if [ $exit_status -eq 1 ] ; then
36
+    uptime; echo; free
37
+    exit 1
38
+fi
39
+
40
+# Commit binary and ubuntu bundles for release
41
+docker commit -run '{"Env": ["PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"], "WorkingDir": "/go/src/github.com/dotcloud/docker"}' $(docker ps -l -q) release
32 42
 
33 43
 # Turn debug off to load credentials from the environment
34 44
 set +x
... ...
@@ -36,7 +45,6 @@ eval $(cat /root/release_credentials.json  | python -c '
36 36
 import sys,json,base64;
37 37
 d=json.loads(base64.b64decode(sys.stdin.read()));
38 38
 exec("""for k in d: print "export {0}=\\"{1}\\"".format(k,d[k])""")')
39
-echo '{"https://index.docker.io/v1/":{"auth":"'$INDEX_AUTH'","email":"engineering@dotcloud.com"}}' > /.dockercfg
40 39
 set -x
41 40
 
42 41
 # Push docker nightly