# -*- python -*- # ex: set filetype=python: import os from buildbot.plugins import * from buildbot.www.authz.roles import RolesFromBase # 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 = {} GITEA_SECRET = os.environ.get("GITEA_SECRET") GITEA_TOKEN = os.environ.get("GITEA_TOKEN") CLIENT_ID = os.environ.get("GITEA_CLIENT_ID") assert CLIENT_ID CLIENT_SECRET = os.environ.get("GITEA_CLIENT_SECRET") assert CLIENT_SECRET ####### 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("worker-rust-1-65", "pass", properties={"rust_version": "1.65"}), worker.Worker("worker-rust-1-71", "pass", properties={"rust_version": "1.71"}), ] rust_workers_1_65 = ["worker-rust-1-65"] if "BUILDBOT_MQ_URL" in os.environ: c["mq"] = { "type": "wamp", "router_url": os.environ["BUILDBOT_MQ_URL"], "realm": os.environ.get("BUILDBOT_MQ_REALM", "buildbot"), "debug": "BUILDBOT_MQ_DEBUG" in os.environ, "debug_websockets": "BUILDBOT_MQ_DEBUG" in os.environ, "debug_lowlevel": "BUILDBOT_MQ_DEBUG" in os.environ, } # '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": os.environ.get("BUILDBOT_WORKER_PORT", 9989)}} ####### CHANGESOURCES # the 'change_source' setting tells the buildmaster how it should find out # about source code changes. Here we point to the buildbot clone of radn. c["change_source"] = [] c["change_source"].append( changes.GitPoller( "https://gitea.parrrate.ru/PTV/radn-rs.git", workdir="gitpoller-workdir", branch="main", pollinterval=300, ) ) ####### 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. # all_repositories = { # r"https://gitea.parrrate.ru/PTV/radn-rs.git": "radn-rs", # } # def codebaseGenerator(chdict): # return all_repositories.get(chdict["repository"]) # c["codebaseGenerator"] = codebaseGenerator c["builders"] = [] builderNames = [] CARGO_TARGET_DIR = "/buildbot/_rust/radn-rs/target" env = {"CARGO_TARGET_DIR": CARGO_TARGET_DIR} DOC_DIR = f"{CARGO_TARGET_DIR}/doc" def basic_factory(): factory = util.BuildFactory() factory.addStep( steps.Git( repourl="https://gitea.parrrate.ru/PTV/radn-rs.git", mode="incremental" ) ) return factory def append_factory(factory, name: str, workernames: list[str]): c["builders"].append( util.BuilderConfig(name=name, workernames=workernames, factory=factory) ) builderNames.append(name) def cargo_test(name: str, workernames: list[str]): factory = basic_factory() factory.addStep( steps.ShellCommand( command=["cargo", "test"], env=env, ) ) append_factory(factory, name, workernames) def cargo_clippy(name: str, workernames: list[str]): factory = basic_factory() factory.addStep( steps.ShellCommand( command=[ "cargo", "clippy", "--workspace", "--examples", "--tests", "--", "--deny=warnings", ], env=env, ) ) append_factory(factory, name, workernames) def cargo_fmt(name: str, workernames: list[str]): factory = basic_factory() factory.addStep( steps.ShellCommand( command=[ "cargo", "fmt", "--check", "--all", ], env=env, ) ) append_factory(factory, name, workernames) def cargo_doc(name: str, workernames: list[str], latest: bool): factory = basic_factory() factory.addStep( steps.ShellCommand( command=[ "cargo", "doc", "--workspace", ], env=env, ) ) factory.addStep( steps.DirectoryUpload( workersrc=DOC_DIR, masterdest=util.Interpolate( "/buildbot_share/docs/radn-rs/%(prop:rust_version)s/" ), url=util.Interpolate( "https://radn.parrrate.ru/latest/docs/%(prop:rust_version)s/radn_rs/" ), ) ) if latest: factory.addStep( steps.DirectoryUpload( workersrc=DOC_DIR, masterdest="/buildbot_share/docs/radn-rs/", url="https://radn.parrrate.ru/latest/docs/radn_rs/", ) ) append_factory(factory, name, workernames) cargo_test("cargo test (1.65)", rust_workers_1_65) cargo_clippy("cargo clippy (1.65)", rust_workers_1_65) cargo_fmt("cargo fmt (1.65)", rust_workers_1_65) cargo_doc("cargo fmt (1.65)", rust_workers_1_65, True) ####### SCHEDULERS # Configure the Schedulers, which decide how to react to incoming changes. In this # case, just kick off a 'runtests' build c["schedulers"] = [] c["schedulers"].append( schedulers.SingleBranchScheduler( name="all", change_filter=util.ChangeFilter(branch="main"), treeStableTimer=None, builderNames=builderNames, ) ) c["schedulers"].append( schedulers.ForceScheduler(name="force", builderNames=builderNames) ) ####### REPORTER TARGETS # 'services' is a list of Reporter Targets. The results of each build will be # pushed to these targets. buildbot/reporters/*.py has a variety to choose from, # like IRC bots. c["services"] = [] ####### PROJECT IDENTITY # the 'title' string will appear at the top of this buildbot installation's # home pages (linked to the 'titleURL'). c["title"] = "RADN" c["titleURL"] = "https://gitea.parrrate.ru/PTV/radn-rs" # the 'buildbotURL' string should point to the location where the buildbot's # internal web server is visible. This typically uses the port number set in # the 'www' entry below, but with an externally-visible host name which the # buildbot cannot figure out without some help. c["buildbotURL"] = os.environ.get("BUILDBOT_WEB_URL", "http://localhost:8010/") class RolesFromCustom(RolesFromBase): def getRolesFromUser(self, userDetails: dict): if userDetails.get("is_admin") is True: return ["admins"] else: return [] # minimalistic config to activate new web UI c["www"] = { "port": os.environ.get("BUILDBOT_WEB_PORT", 8010), "plugins": { "waterfall_view": {}, "console_view": {}, }, "change_hook_dialects": {}, "auth": util.GiteaAuth( endpoint="https://gitea.parrrate.ru", client_id=CLIENT_ID, client_secret=CLIENT_SECRET, ), "authz": util.Authz( allowRules=[util.AnyControlEndpointMatcher(role="admins")], roleMatchers=[RolesFromCustom()], ), } if GITEA_SECRET: c["www"]["change_hook_dialects"]["gitea"] = { "secret": GITEA_SECRET, "onlyIncludePushCommit": True, } if GITEA_TOKEN: c["services"].append( reporters.GiteaStatusPush( "https://gitea.parrrate.ru", token=GITEA_TOKEN, verbose=True ), ) ####### 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": os.environ.get("BUILDBOT_DB_URL", "sqlite://").format(**os.environ), } c["buildbotNetUsageData"] = None