| import os |
| 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 Interpolate |
| 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 |
| |
| PORT_WEB = 80 # Buildbot webserver port |
| PORT_GITHUB = 8011 # Buildbot github hook port |
| PORT_MASTER = 9989 # Port where buildbot master listen buildworkers |
| TEST_USER = 'buildbot' # Credential to authenticate build triggers |
| TEST_PWD = 'docker' # Credential to authenticate build triggers |
| BUILDER_NAME = 'docker' |
| GITHUB_DOCKER = 'github.com/dotcloud/docker' |
| BUILDBOT_PATH = '/data/buildbot' |
| DOCKER_PATH = '/data/docker' |
| BUILDER_PATH = '/data/buildbot/slave/{0}/build'.format(BUILDER_NAME) |
| PULL_REQUEST_PATH = '/data/buildbot/slave/pullrequest/build' |
| |
| # Credentials set by setup.sh and Vagrantfile |
| BUILDBOT_PWD = '' |
| IRC_PWD = '' |
| IRC_CHANNEL = '' |
| SMTP_USER = '' |
| SMTP_PWD = '' |
| EMAIL_RCP = '' |
| |
| |
| c = BuildmasterConfig = {} |
| |
| c['title'] = "Docker" |
| c['titleURL'] = "waterfall" |
| c['buildbotURL'] = "http://docker-ci.dotcloud.com/" |
| c['db'] = {'db_url':"sqlite:///state.sqlite"} |
| c['slaves'] = [BuildSlave('buildworker', BUILDBOT_PWD)] |
| c['slavePortnum'] = PORT_MASTER |
| |
| |
| # Schedulers |
| c['schedulers'] = [ForceScheduler(name='trigger', builderNames=[BUILDER_NAME, |
| 'index','registry','coverage'])] |
| c['schedulers'] += [SingleBranchScheduler(name="all", |
| change_filter=filter.ChangeFilter(branch='master'), treeStableTimer=None, |
| builderNames=[BUILDER_NAME])] |
| c['schedulers'] += [SingleBranchScheduler(name='pullrequest', |
| change_filter=filter.ChangeFilter(category='github_pullrequest'), treeStableTimer=None, |
| builderNames=['pullrequest'])] |
| c['schedulers'] += [Nightly(name='daily', branch=None, builderNames=['coverage'], |
| hour=0, minute=30)] |
| c['schedulers'] += [Nightly(name='every4hrs', branch=None, builderNames=['registry','index'], |
| hour=range(0,24,4), minute=15)] |
| |
| # Builders |
| # Docker commit test |
| factory = BuildFactory() |
| factory.addStep(ShellCommand(description='Docker',logEnviron=False,usePTY=True, |
| command=["sh", "-c", Interpolate("cd ..; rm -rf build; mkdir build; " |
| "cp -r {2}-dependencies/src {0}; export GOPATH={0}; go get {3}; cd {1}; " |
| "git reset --hard %(src::revision)s; go test -v".format( |
| BUILDER_PATH, BUILDER_PATH+'/src/'+GITHUB_DOCKER, DOCKER_PATH, GITHUB_DOCKER))])) |
| c['builders'] = [BuilderConfig(name=BUILDER_NAME,slavenames=['buildworker'], |
| factory=factory)] |
| |
| # Docker pull request test |
| factory = BuildFactory() |
| factory.addStep(ShellCommand(description='pull_request',logEnviron=False,usePTY=True, |
| command=["sh", "-c", Interpolate("cd ..; rm -rf build; mkdir build; " |
| "cp -r {2}-dependencies/src {0}; export GOPATH={0}; go get {3}; cd {1}; " |
| "git fetch %(src::repository)s %(src::branch)s:PR-%(src::branch)s; " |
| "git checkout %(src::revision)s; git rebase master; go test -v".format( |
| PULL_REQUEST_PATH, PULL_REQUEST_PATH+'/src/'+GITHUB_DOCKER, DOCKER_PATH, GITHUB_DOCKER))])) |
| c['builders'] += [BuilderConfig(name='pullrequest',slavenames=['buildworker'], |
| factory=factory)] |
| |
| # Docker coverage test |
| coverage_cmd = ('GOPATH=`pwd` go get -d github.com/dotcloud/docker\n' |
| 'GOPATH=`pwd` go get github.com/axw/gocov/gocov\n' |
| 'sudo -E GOPATH=`pwd` ./bin/gocov test -deps -exclude-goroot -v' |
| ' -exclude github.com/gorilla/context,github.com/gorilla/mux,github.com/kr/pty,' |
| 'code.google.com/p/go.net/websocket github.com/dotcloud/docker | ./bin/gocov report') |
| factory = BuildFactory() |
| factory.addStep(ShellCommand(description='Coverage',logEnviron=False,usePTY=True, |
| command=coverage_cmd)) |
| c['builders'] += [BuilderConfig(name='coverage',slavenames=['buildworker'], |
| factory=factory)] |
| |
| # Registry functional test |
| factory = BuildFactory() |
| factory.addStep(ShellCommand(description='registry', logEnviron=False, |
| command='. {0}/master/credentials.cfg; ' |
| '{1}/testing/functionaltests/test_registry.sh'.format(BUILDBOT_PATH, |
| DOCKER_PATH), usePTY=True)) |
| c['builders'] += [BuilderConfig(name='registry',slavenames=['buildworker'], |
| factory=factory)] |
| |
| # Index functional test |
| factory = BuildFactory() |
| factory.addStep(ShellCommand(description='index', logEnviron=False, |
| command='. {0}/master/credentials.cfg; ' |
| '{1}/testing/functionaltests/test_index.py'.format(BUILDBOT_PATH, |
| DOCKER_PATH), usePTY=True)) |
| c['builders'] += [BuilderConfig(name='index',slavenames=['buildworker'], |
| factory=factory)] |
| |
| |
| # Status |
| authz_cfg = authz.Authz(auth=auth.BasicAuth([(TEST_USER, TEST_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='buildbot@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=IRC_PWD, allowForce=True, |
| notify_events={'exception':1, 'successToFailure':1, 'failureToSuccess':1})) |