summaryrefslogtreecommitdiff
path: root/hack/infrastructure/docker-ci/buildbot/master.cfg
blob: 75605da8abd12b624bb5ffd46a6596d4b32a0fcd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import os, re
from buildbot.buildslave import BuildSlave
from buildbot.schedulers.forcesched import ForceScheduler
from buildbot.schedulers.basic import SingleBranchScheduler
from buildbot.schedulers.timed import Nightly
from buildbot.changes import filter
from buildbot.config import BuilderConfig
from buildbot.process.factory import BuildFactory
from buildbot.process.properties import Property
from buildbot.steps.shell import ShellCommand
from buildbot.status import html, words
from buildbot.status.web import authz, auth
from buildbot.status.mail import MailNotifier


def ENV(x):
    '''Promote an environment variable for global use returning its value'''
    retval = os.environ.get(x, '')
    globals()[x] = retval
    return retval


class TestCommand(ShellCommand):
    '''Extend ShellCommand with optional summary logs'''
    def __init__(self, *args, **kwargs):
        super(TestCommand, self).__init__(*args, **kwargs)

    def createSummary(self, log):
        exit_status = re.sub(r'.+\n\+ exit (\d+).+',
            r'\1', log.getText()[-100:], flags=re.DOTALL)
        if exit_status != '0':
            return
        # Infer coverage path from log
        if '+ COVERAGE_PATH' in log.getText():
            path = re.sub(r'.+\+ COVERAGE_PATH=((.+?)-\d+).+',
              r'\2/\1', log.getText(), flags=re.DOTALL)
            url = '{}coverage/{}/index.html'.format(c['buildbotURL'], path)
            self.addURL('coverage', url)
        elif 'COVERAGE_FILE' in log.getText():
            path = re.sub(r'.+\+ COVERAGE_FILE=((.+?)-\d+).+',
              r'\2/\1', log.getText(), flags=re.DOTALL)
            url = '{}coverage/{}/index.html'.format(c['buildbotURL'], path)
            self.addURL('coverage', url)


PORT_WEB = 8000      # Buildbot webserver port
PORT_GITHUB = 8011   # Buildbot github hook port
PORT_MASTER = 9989   # Port where buildbot master listen buildworkers

BUILDBOT_URL = '//localhost:{}/'.format(PORT_WEB)
DOCKER_REPO = 'https://github.com/docker-test/docker'
DOCKER_TEST_ARGV = 'HEAD {}'.format(DOCKER_REPO)
REGISTRY_REPO = 'https://github.com/docker-test/docker-registry'
REGISTRY_TEST_ARGV = 'HEAD {}'.format(REGISTRY_REPO)
if ENV('DEPLOYMENT') == 'staging':
    BUILDBOT_URL = "//docker-ci-stage.docker.io/"
if ENV('DEPLOYMENT') == 'production':
    BUILDBOT_URL = '//docker-ci.docker.io/'
    DOCKER_REPO = 'https://github.com/dotcloud/docker'
    DOCKER_TEST_ARGV = ''
    REGISTRY_REPO = 'https://github.com/dotcloud/docker-registry'
    REGISTRY_TEST_ARGV = ''

# Credentials set by setup.sh from deployment.py
ENV('WEB_USER')
ENV('WEB_IRC_PWD')
ENV('BUILDBOT_PWD')
ENV('SMTP_USER')
ENV('SMTP_PWD')
ENV('EMAIL_RCP')
ENV('IRC_CHANNEL')


c = BuildmasterConfig = {}

c['title'] = "docker-ci"
c['titleURL'] = "waterfall"
c['buildbotURL'] = BUILDBOT_URL
c['db'] = {'db_url':"sqlite:///state.sqlite"}
c['slaves'] = [BuildSlave('buildworker', BUILDBOT_PWD)]
c['slavePortnum'] = PORT_MASTER


# Schedulers
c['schedulers'] = [ForceScheduler(name='trigger', builderNames=[
    'docker', 'docker-registry', 'nightlyrelease', 'backup'])]
c['schedulers'] += [SingleBranchScheduler(name="docker", treeStableTimer=None,
    change_filter=filter.ChangeFilter(branch='master',
    repository=DOCKER_REPO), builderNames=['docker'])]
c['schedulers'] += [SingleBranchScheduler(name="registry", treeStableTimer=None,
    change_filter=filter.ChangeFilter(branch='master',
    repository=REGISTRY_REPO), builderNames=['docker-registry'])]
c['schedulers'] += [SingleBranchScheduler(name='docker-pr', treeStableTimer=None,
    change_filter=filter.ChangeFilter(category='github_pullrequest',
    project='docker'), builderNames=['docker-pr'])]
c['schedulers'] += [SingleBranchScheduler(name='docker-registry-pr', treeStableTimer=None,
    change_filter=filter.ChangeFilter(category='github_pullrequest',
    project='docker-registry'), builderNames=['docker-registry-pr'])]
c['schedulers'] += [Nightly(name='daily', branch=None, builderNames=[
    'nightlyrelease', 'backup'], hour=7, minute=00)]


# Builders

# Backup
factory = BuildFactory()
factory.addStep(TestCommand(description='backup', logEnviron=False,
    usePTY=True, command='/docker-ci/tool/backup.py'))
c['builders'] = [BuilderConfig(name='backup',slavenames=['buildworker'],
    factory=factory)]

# Docker test
factory = BuildFactory()
factory.addStep(TestCommand(description='docker', logEnviron=False,
    usePTY=True, command='/docker-ci/dockertest/docker {}'.format(DOCKER_TEST_ARGV)))
c['builders'] += [BuilderConfig(name='docker',slavenames=['buildworker'],
    factory=factory)]

# Docker pull request test
factory = BuildFactory()
factory.addStep(TestCommand(description='docker-pr', logEnviron=False,
    usePTY=True, command=['/docker-ci/dockertest/docker',
    Property('revision'), Property('repository'), Property('branch')]))
c['builders'] += [BuilderConfig(name='docker-pr',slavenames=['buildworker'],
    factory=factory)]

# docker-registry test
factory = BuildFactory()
factory.addStep(TestCommand(description='docker-registry', logEnviron=False,
    usePTY=True, command='/docker-ci/dockertest/docker-registry {}'.format(REGISTRY_TEST_ARGV)))
c['builders'] += [BuilderConfig(name='docker-registry',slavenames=['buildworker'],
    factory=factory)]

# Docker registry pull request test
factory = BuildFactory()
factory.addStep(TestCommand(description='docker-registry-pr', logEnviron=False,
    usePTY=True, command=['/docker-ci/dockertest/docker-registry',
    Property('revision'), Property('repository'), Property('branch')]))
c['builders'] += [BuilderConfig(name='docker-registry-pr',slavenames=['buildworker'],
    factory=factory)]

# Docker nightly release
factory = BuildFactory()
factory.addStep(ShellCommand(description='NightlyRelease',logEnviron=False,
    usePTY=True, command=['/docker-ci/dockertest/nightlyrelease']))
c['builders'] += [BuilderConfig(name='nightlyrelease',slavenames=['buildworker'],
    factory=factory)]

# Status
authz_cfg = authz.Authz(auth=auth.BasicAuth([(WEB_USER, WEB_IRC_PWD)]),
    forceBuild='auth')
c['status'] = [html.WebStatus(http_port=PORT_WEB, authz=authz_cfg)]
c['status'].append(html.WebStatus(http_port=PORT_GITHUB, allowForce=True,
    change_hook_dialects={ 'github': True }))
c['status'].append(MailNotifier(fromaddr='docker-test@docker.io',
    sendToInterestedUsers=False, extraRecipients=[EMAIL_RCP],
    mode='failing', relayhost='smtp.mailgun.org', smtpPort=587, useTls=True,
    smtpUser=SMTP_USER, smtpPassword=SMTP_PWD))
c['status'].append(words.IRC("irc.freenode.net", "dockerqabot",
    channels=[IRC_CHANNEL], password=WEB_IRC_PWD, allowForce=True,
    notify_events={'exception':1, 'successToFailure':1, 'failureToSuccess':1}))