import re from buildbot.steps.source.git import Git from buildbot.steps.shell import ShellCommand from buildbot.plugins import \ (reporters, worker, changes, schedulers, util) # This is a sample buildmaster config file. It must be installed as # 'master.cfg' in your buildmaster's base directory. # This is the dictionary that the buildmaster pays attention to. # We also use a shorter alias to save typing. c = BuildmasterConfig = {} # Silence warning and allow very basic phoning home. c["buildbotNetUsageData"] = "basic" ####### WORKERS # The 'workers' list defines the set of recognized workers. Each # element is a Worker object, specifying a unique worker name and # password. The same worker name and password must be configured # on the worker. c["workers"] = [ worker.Worker("lcov-worker", "lcov-pass"), worker.Worker("selenium-worker", "selenium-pass"), worker.Worker("doc-worker", "doc-pass"), worker.Worker("switcher-worker", "switcher-pass"), worker.Worker("debug-worker", "debug-pass"), worker.Worker("lint-worker", "lint-pass"), worker.Worker("wallet-worker", "wallet-pass")] # 'protocols' contains information about protocols which master # will use for communicating with workers. You must define at # least 'port' option that workers could connect to your master # with this protocol. 'port' must match the value configured into # the workers (with their --master option) c["protocols"] = { "pb": { "port": "tcp:9989:interface=127.0.0.1"}} ####### CHANGESOURCES # the 'change_source' setting tells the buildmaster how it should # find out about source code changes. # NOTE: BB is bound to localhost ALLCS = changes.PBChangeSource(user="allcs", passwd="allcs") c["change_source"] = [ALLCS] ####### SCHEDULERS # Configure the Schedulers, which decide how to react to incoming # changes. # Re-build documentation periodically def doc_filter(change): _changes = change.asDict() if _changes.get("project") not in ["exchange", "merchant"]: return True files = _changes.get("files") for file in files: if re.search(r"doc[s]?|manual", file.get("name", "")): return True return False NIGHTLY_SCHEDULER = schedulers.Nightly( name="nightly-scheduler", builderNames=["lcov-builder"], branch="master", # why mandatory? hour=6, minute=0) DOC_SCHEDULER = schedulers.SingleBranchScheduler( name="periodic-doc-scheduler", builderNames=["doc-builder"], change_filter=util.ChangeFilter( branch="master", filter_fn=doc_filter, project_re="backoffice|help|api|www|bank|exchange|merchant" "|deployment|merchant-frontend-examples" "|docs-landing"), treeStableTimer=None) WALLET_SCHEDULER = schedulers.SingleBranchScheduler( name="wallet-scheduler", change_filter=util.ChangeFilter( branch="master", project_re="wallet|deployment"), treeStableTimer=None, builderNames=[]) TIP_RESERVE_TOPPER_SCHEDULER = schedulers.Periodic( name="tip-reserve-topper-scheduler", periodicBuildTimer=60*60*24*10, # 10 days builderNames=["tip-reserve-topper-builder"] ) ALL_SCHEDULER = schedulers.SingleBranchScheduler( name="all-scheduler", change_filter=util.ChangeFilter( branch="master", project_re="backoffice|wallet|bank|exchange" "merchant|deployment|donations|blog" "|survey|landing|playground"), treeStableTimer=None, builderNames=["switcher-builder"]) # Scheduler monitoring the help.git repo; a forgotten repo we # use to test BB. DEBUG_SCHEDULER = schedulers.SingleBranchScheduler( name="debug-scheduler", change_filter=util.ChangeFilter( branch="master", project="help"), treeStableTimer=None, builderNames=["debug-builder"]) # Consider adding other Python parts, like the various frontends. LINT_SCHEDULER = schedulers.SingleBranchScheduler( name="lint-scheduler", change_filter=util.ChangeFilter( branch="master", project_re="bank|donations|survey|blog"), treeStableTimer=None, builderNames=["lint-builder"]) # Provide "force" button in the web UI FORCE_SCHEDULER = schedulers.ForceScheduler( name="force-scheduler", builderNames=[ "lcov-builder", "selenium-builder", "switcher-builder", "doc-builder", "wallet-builder", "tip-reserve-topper-builder"]) c["schedulers"] = [ NIGHTLY_SCHEDULER, TIP_RESERVE_TOPPER_SCHEDULER, DOC_SCHEDULER, WALLET_SCHEDULER, ALL_SCHEDULER, FORCE_SCHEDULER, DEBUG_SCHEDULER, LINT_SCHEDULER] ####### BUILDERS # The 'builders' list defines the Builders, which tell Buildbot # how to perform a build: what steps, and which workers can execute # them. Note that any particular build will only take place on # one worker. def git_step(repo): return Git(repourl=repo, mode="full", method="fresh", logEnviron=False, alwaysUseLatest=True, haltOnFailure=True, branch="master") WALLET_FACTORY = util.BuildFactory() WALLET_FACTORY.addStep(git_step( "git://git.taler.net/wallet-webex.git")) WALLET_FACTORY.addStep(ShellCommand( name="configuration", description="Running configure script", descriptionDone="Correctly configured", command=["./configure"], workdir="build/")) WALLET_FACTORY.addStep(ShellCommand( name="test", description="Running wallet tests", descriptionDone="Test correctly run", command=["make", "check"], workdir="build/")) WALLET_FACTORY.addStep(ShellCommand( name="lint", description="Linting the wallet", descriptionDone="Linting done", command=["make", "lint"], workdir="build/")) DEBUG_FACTORY = util.BuildFactory() DEBUG_FACTORY.addStep(ShellCommand( name="echo debug", description="just echoing a word", descriptionDone="builder responded", command=["echo", "I'm here!"])) def lint_dispatcher(project): return "./lint_%s.sh" % project LINT_FACTORY = util.BuildFactory() LINT_FACTORY.addStep(git_step( "git://git.taler.net/deployment.git")) LINT_FACTORY.addStep(ShellCommand( name="Python linter", description="linting Python", descriptionDone="linting done", command=util.Transform(lint_dispatcher, util.Property("project")), workdir="build/taler-build")) LCOV_FACTORY = util.BuildFactory() LCOV_FACTORY.addStep(git_step( "git://git.taler.net/deployment.git")) LCOV_FACTORY.addStep(ShellCommand( name="invalidation", description="Invalidating timestamps", descriptionDone="timestamps invalidated", command=["./invalidate.sh"], workdir="build/taler-build"), env={"TALER_ENV_NAME": "not-test"}) # work-around 'set -eu' LCOV_FACTORY.addStep(ShellCommand( name="build", description="Compiling..", descriptionDone="lcov files generated", command=["make", "lcov"], workdir="build/taler-build", env={"PATH": "${HOME}/local/bin:${PATH}", "TALER_CHECKDB": "postgresql:///talercheck?host=/home/${USER}/sockets"})) TIP_RESERVE_TOPPER_FACTORY = util.BuildFactory() TIP_RESERVE_TOPPER_FACTORY.addStep(git_step( "git://git.taler.net/deployment.git")) TIP_RESERVE_TOPPER_FACTORY.addStep(ShellCommand( name="tip reserve topper", description="Topping the tip reserve.", descriptionDone="Tip reserve has been topped.", command=["./top_reserve.sh"], workdir="build/buildbot")) SWITCHER_FACTORY = util.BuildFactory() SWITCHER_FACTORY.addStep(git_step( "git://git.taler.net/deployment.git")) SWITCHER_FACTORY.addStep(ShellCommand( name="build", description="Building inactive blue-green party.", descriptionDone="Compile.", command=["./build.sh"], workdir="build/buildbot", haltOnFailure=True)) SWITCHER_FACTORY.addStep(ShellCommand( name="restart services", description="Restarting inactive blue-green party.", descriptionDone="Restarting Taler.", command=["./restart.sh"], workdir="build/buildbot", haltOnFailure=True)) SWITCHER_FACTORY.addStep(ShellCommand( name="check services correctly restarted", description="Checking services are correctly restarted.", descriptionDone="All services are correctly restarted.", command=["./checks.sh"], workdir="build/buildbot", haltOnFailure=True)) SWITCHER_FACTORY.addStep(ShellCommand( name="switch active party", description="Switch to the party which was inactive.", descriptionDone="Active party has been switched.", command=["./switch.sh"], workdir="build/buildbot")) SELENIUM_FACTORY = util.BuildFactory() SELENIUM_FACTORY.addStep(ShellCommand( name="selenium", description="Headless browser test", descriptionDone="Test finished", command=["launch_selenium_test"], env={'PATH': "${HOME}/local/bin:/usr/lib/chromium:${PATH}"})) DOC_FACTORY = util.BuildFactory() DOC_FACTORY.addStep(git_step( "git://git.taler.net/deployment.git")) DOC_FACTORY.addStep(ShellCommand( name="build docs", description="Building documentation", descriptionDone="Documentation built.", command=["./build-docs.sh"], workdir="build/buildbot", haltOnFailure=True)) DEBUG_BUILDER = util.BuilderConfig( name="debug-builder", workernames=["debug-worker"], factory=DEBUG_FACTORY) LINT_BUILDER = util.BuilderConfig( name="lint-builder", workernames=["lint-worker"], factory=LINT_FACTORY) LCOV_BUILDER = util.BuilderConfig( name="lcov-builder", workernames=["lcov-worker"], factory=LCOV_FACTORY) TIP_RESERVE_TOPPER_BUILDER = util.BuilderConfig( name="tip-reserve-topper-builder", workernames="switcher-worker", factory=TIP_RESERVE_TOPPER_FACTORY ) SWITCHER_BUILDER = util.BuilderConfig( name="switcher-builder", workernames=["switcher-worker"], factory=SWITCHER_FACTORY) SELENIUM_BUILDER = util.BuilderConfig( name="selenium-builder", workernames=["selenium-worker"], factory=SELENIUM_FACTORY) DOC_BUILDER = util.BuilderConfig( name="doc-builder", workernames=["doc-worker"], factory=DOC_FACTORY) WALLET_BUILDER = util.BuilderConfig( name="wallet-builder", workernames=["wallet-worker"], factory=WALLET_FACTORY) c["builders"] = [ LCOV_BUILDER, SWITCHER_BUILDER, TIP_RESERVE_TOPPER_BUILDER, SELENIUM_BUILDER, DOC_BUILDER, WALLET_BUILDER, DEBUG_BUILDER, LINT_BUILDER] ####### BUILDBOT SERVICES # 'services' is a list of BuildbotService items like reporter # targets. The status of each build will be pushed to these # targets. buildbot/reporters/*.py has a variety to choose from, # like IRC bots. IRC = reporters.IRC( "irc.eu.freenode.net", "taler-bb", useColors=False, channels=[{"channel": "#taler"}], password="taler-bb-pass19", notify_events={ 'exception': 1, 'successToFailure': 1, 'failureToSuccess': 1}) EMAIL = reporters.MailNotifier( fromaddr="testbuild@taler.net", sendToInterestedUsers=False, mode=("problem"), builders=( "switcher-builder", "doc-builder", "wallet-builder", "selenium-builder"), extraRecipients=["buildfailures@taler.net"], subject="Taler build.") c["services"] = [IRC, EMAIL] ####### PROJECT IDENTITY c["title"] = "Taler" c["titleURL"] = "https://taler.net" # We use nginx to expose the BB under this URL. c["buildbotURL"] = "https://buildbot.taler.net/" # minimalistic config to activate new web UI c["www"] = { "port": 8010, "plugins" : { "waterfall_view": {}, "console_view":{}}, "allowed_origins": ["https://*.taler.net"]} ####### DB URL c["db"] = { # This specifies what database buildbot uses to store its # state. You can leave this at its default for all but the # largest installations. "db_url" : "sqlite:///state.sqlite", }